亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

前端面試知識(shí)點(diǎn)錦集(JavaScript篇)

 更新時(shí)間:2016年12月28日 11:37:43   作者:SeeYouBug  
這篇文章主要為大家分享了前端面試知識(shí)點(diǎn)錦集JavaScript篇,細(xì)致的給出了每個(gè)js面試知識(shí)點(diǎn)的答案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

JavaScript部分

1、談?wù)勀銓?duì)Ajax的理解?(概念、特點(diǎn)、作用)
AJAX全稱為“Asynchronous JavaScript And XML”(異步JavaScript和XML) 是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的開發(fā)技術(shù)、改善用戶體驗(yàn),實(shí)現(xiàn)無刷新效果。

優(yōu)點(diǎn)

a、不需要插件支持
b、優(yōu)秀的用戶體驗(yàn)
c、提高Web程序的性能
d、減輕服務(wù)器和帶寬的負(fù)擔(dān)

缺點(diǎn)

a、瀏覽器對(duì)XMLHttpRequest對(duì)象的支持度不足,幾乎所有瀏覽器現(xiàn)在都支持
b、破壞瀏覽器“前進(jìn)”、“后退”按鈕的正常功能,可以通過簡(jiǎn)單的插件彌補(bǔ)
c、對(duì)搜索引擎的支持不足

2、說說你對(duì)延遲對(duì)象deferred的理解?

deferred對(duì)象是從jQuery 1.5.0版本開始引入的一個(gè)新功能。
a、什么是deferred對(duì)象
開發(fā)網(wǎng)站的過程中,我們經(jīng)常遇到某些耗時(shí)很長(zhǎng)的javascript操作。其中,既有異步的操作(比如ajax讀取服務(wù)器數(shù)據(jù)),也有同步的操作(比如遍歷一個(gè)大型數(shù)組),它們都不是立即能得到結(jié)果的。
通常的做法是,為它們指定回調(diào)函數(shù)(callback)。即事先規(guī)定,一旦它們運(yùn)行結(jié)束,應(yīng)該調(diào)用哪些函數(shù)。
但是,在回調(diào)函數(shù)方面,jQuery的功能非常弱。為了改變這一點(diǎn),jQuery開發(fā)團(tuán)隊(duì)就設(shè)計(jì)了deferred對(duì)象。
簡(jiǎn)單說,deferred對(duì)象就是jQuery的回調(diào)函數(shù)解決方案。在英語中,defer的意思是"延遲",所以deferred對(duì)象的含義就是"延遲"到未來某個(gè)點(diǎn)再執(zhí)行。
它解決了如何處理耗時(shí)操作的問題,對(duì)那些操作提供了更好的控制,以及統(tǒng)一的編程接口。
b、它的主要功能,可以歸結(jié)為四點(diǎn):
(1)、實(shí)現(xiàn)鏈?zhǔn)讲僮?br /> (2)、指定同一操作的多個(gè)回調(diào)函數(shù)
(3)、為多個(gè)操作指定回調(diào)函數(shù)
(4)、普通操作的回調(diào)函數(shù)接口

3、什么是跨域,如何實(shí)現(xiàn)跨域訪問?
跨域是指不同域名之間相互訪問。
JavaScript同源策略的限制,A域名下的JavaScript無法操作B或是C域名下的對(duì)象

實(shí)現(xiàn):
(1)、JSONP跨域:利用script腳本允許引用不同域下的js實(shí)現(xiàn)的,將回調(diào)方法帶入服務(wù)器,返回結(jié)果時(shí)回調(diào)。
(2)、跨域資源共享(CORS)
跨域資源共享(CORS)是一種網(wǎng)絡(luò)瀏覽器的技術(shù)規(guī)范,它為Web服務(wù)器定義了一種方式,允許網(wǎng)頁(yè)從不同的域訪問其資源。
CORS與JSONP相比:
a、 JSONP只能實(shí)現(xiàn)GET請(qǐng)求,而CORS支持所有類型的HTTP請(qǐng)求。
b、 使用CORS,開發(fā)者可以使用普通的XMLHttpRequest發(fā)起請(qǐng)求和獲得數(shù)據(jù),比起JSONP有更好的錯(cuò)誤處理。
c、 JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數(shù)現(xiàn)代瀏覽器都已經(jīng)支持了CORS。

4、為什么要使用模板引擎?
a、模板引擎(這里特指用于Web開發(fā)的模板引擎)是為了使用戶界面與業(yè)務(wù)數(shù)據(jù)(內(nèi)容)分離而產(chǎn)生的,它可以生成特定格式的文檔,用于網(wǎng)站的模板引擎就會(huì)生成一個(gè)標(biāo)準(zhǔn)的HTML文檔。
b、在一些示例中javascript有大量的html字符串,html中有一些像onclick樣的javascript,這樣javascript中有html,html中有javascript,代碼的偶合度很高,不便于修改與維護(hù),使用模板引擎可以解決問題。

5、JavaScript是一門什么樣的語言,它有哪些特點(diǎn)?
JavaScript 是一種腳本語言,官方名稱為 ECMAScript(因定義語言的標(biāo)準(zhǔn)為 ECMA-262)。
JS 的主要特點(diǎn):
a、語法類似于常見的高級(jí)語言,如 C 和 Java;
b、腳本語言,不需要編譯就可以由解釋器直接運(yùn)行;
c、 變量松散定義,屬于弱類型語言;
d、面向?qū)ο蟮摹?br /> JS 最初是為網(wǎng)頁(yè)設(shè)計(jì)而開發(fā)的,現(xiàn)在也是Web 開發(fā)的重要語言。它支持對(duì)瀏覽器(瀏覽器對(duì)象模型,BOM)和HTML 文檔(文檔對(duì)象模型,DOM)進(jìn)行操作而使網(wǎng)頁(yè)呈現(xiàn)動(dòng)態(tài)的交互特性。
嚴(yán)格的說,JS只是ECMAScript 的一種實(shí)現(xiàn),是ECMAScript和BOM、DOM組成的一種Web 開發(fā)技術(shù)。

6、JavaScript的數(shù)據(jù)類型有哪些?
基本數(shù)據(jù)類型:字符串 String、數(shù)字 Number、布爾Boolean
復(fù)合數(shù)據(jù)類型:數(shù)組 Array、對(duì)象 Object
特殊數(shù)據(jù)類型:Null 空對(duì)象、Undefined 未定義

7、已知ID的Input輸入框,如何獲取這個(gè)輸入框的輸入值?(不使用第三方框架)

document.getElementById("ID").value

8、根據(jù)你的理解,請(qǐng)簡(jiǎn)述JavaScript腳本的執(zhí)行原理?
JavaScript是一種動(dòng)態(tài)、弱類型、基于原型的語言,通過瀏覽器可以直接執(zhí)行。
當(dāng)瀏覽器遇到<script> 標(biāo)記的時(shí)候,瀏覽器會(huì)執(zhí)行之間的javascript代碼。嵌入的js代碼是順序執(zhí)行的,每個(gè)腳本定義的全局變量和函數(shù),都可以被后面執(zhí)行的腳本所調(diào)用。 變量的調(diào)用,必須是前面已經(jīng)聲明,否則獲取的變量值是undefined。

9、DOM操作怎樣添加、移除、移動(dòng)、復(fù)制、創(chuàng)建和查找節(jié)點(diǎn)?

(1)創(chuàng)建新節(jié)點(diǎn)

createDocumentFragment() //創(chuàng)建一個(gè)DOM片段
createElement() //創(chuàng)建一個(gè)具體的元素
createTextNode() //創(chuàng)建一個(gè)文本節(jié)點(diǎn)


(2)添加、移除、替換、插入

appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn)


(3)查找

getElementsByTagName() //通過標(biāo)簽名稱
getElementsByName() //通過元素的Name屬性的值(IE容錯(cuò)能力較強(qiáng),會(huì)得到一個(gè)數(shù)組,其中包括id等于name值的)
getElementById() //通過元素Id,唯一性

10、說說你對(duì)json的理解?

回答一:
a、JSON對(duì)象:以“{”開始,以“}”結(jié)束,里面則是一系列的鍵(key)值(value)對(duì),鍵和值用“:”分開,每對(duì)鍵值對(duì)之間用“,”分開。參考以下語法結(jié)構(gòu):{key1:value1,key2:value2,key3:value3…}其中鍵(key)是字符串,而值(value)可以是字符串,數(shù)值,true,false,null,對(duì)象或數(shù)組,也就是說某個(gè)鍵(key)的值(value)可以是一個(gè)數(shù)組,數(shù)組里面又是一些JSON對(duì)象,這種表示稍微復(fù)雜一些,但是參照這些理解可以很容易分辨出來。
b、JSON數(shù)組:以”[”開始,”]”結(jié)束,如同程序語言一樣,例如C#,Button[] btnArray,則BtnArray是一個(gè)Button類型的數(shù)組,里面就存放Button類型的對(duì)象,那么JSON數(shù)組也一樣,里面存放的也是JSON對(duì)象.

回答二:
a、JSON 指的是 JavaScript 對(duì)象表示法(JavaScript Object Notation)
b、JSON 是輕量級(jí)的文本數(shù)據(jù)交換格式,并不是編程語言
c、JSON 獨(dú)立于語言存在
d、JSON 具有自我描述性,更易理解
e、JSON 可以將 JavaScript 對(duì)象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在函數(shù)之間輕松地傳遞這個(gè)字符串,或者在異步應(yīng)用程序中將字符串從 Web 客戶機(jī)傳遞給服務(wù)器端程序。這個(gè)字符串看起來有點(diǎn)兒古怪,但是JavaScript很容易解釋它,而且 JSON 可以表示比"名稱 / 值對(duì)"更復(fù)雜的結(jié)構(gòu)。例如,可以表示數(shù)組和復(fù)雜的對(duì)象,而不僅僅是鍵和值的簡(jiǎn)單列表

回答三:
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。
它是基于JavaScript的一個(gè)子集。數(shù)據(jù)格式簡(jiǎn)單, 易于讀寫, 占用帶寬小.
json簡(jiǎn)單說就是javascript中的對(duì)象和數(shù)組,所以這兩種結(jié)構(gòu)就是對(duì)象和數(shù)組兩種結(jié)構(gòu),通過這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)。
(1)、對(duì)象:對(duì)象在js中表示為“{}”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 {key:value,key:value,...}的鍵值對(duì)的結(jié)構(gòu),在面向?qū)ο蟮恼Z言中,key為對(duì)象的屬性,value為對(duì)應(yīng)的屬性值,所以很容易理解,取值方法為 對(duì)象.key 獲取屬性值,這個(gè)屬性值的類型可以是 數(shù)字、字符串、數(shù)組、對(duì)象幾種。
(1)、數(shù)組:數(shù)組在js中是中括號(hào)“[]”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是數(shù)字、字符串、數(shù)組、對(duì)象幾種。
經(jīng)過對(duì)象、數(shù)組2種結(jié)構(gòu)就可以組合成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)了。

11、ionic和angularjs的區(qū)別?
a、ionic是一個(gè)用來開發(fā)混合手機(jī)應(yīng)用的,開源的,免費(fèi)的代碼庫(kù)??梢詢?yōu)化html、css和js的性能,構(gòu)建高效的應(yīng)用程序,而且還可以用于構(gòu)建Sass和AngularJS的優(yōu)化。
b、AngularJS通過新的屬性和表達(dá)式擴(kuò)展了HTML。AngularJS可以構(gòu)建一個(gè)單一頁(yè)面應(yīng)用程序(SPAs:Single Page Applications)。
c、Ionic是一個(gè)混合APP開發(fā)工具,它以AngularJS為中間腳本工具(稱為庫(kù),似乎又不恰當(dāng)),所以,你如果要使用Ionic開發(fā)APP,就必須了解AngularJS。

12、談?wù)勀銓?duì)閉包的理解?
(1)、使用閉包主要是為了設(shè)計(jì)私有的方法和變量。閉包的優(yōu)點(diǎn)是可以避免全局變量的污染,缺點(diǎn)是閉包會(huì)常駐內(nèi)存,會(huì)增大內(nèi)存使用量,使用不當(dāng)很容易造成內(nèi)存泄露。
(2)、閉包有三個(gè)特性:
a、函數(shù)嵌套函數(shù)
b、函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
c、參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收

13、談?wù)勀鉚his對(duì)象的理解?

回答一:
(1)、js的this指向是不確定的,也就是說是可以動(dòng)態(tài)改變的。call/apply 就是用于改變this指向的函數(shù),這樣設(shè)計(jì)可以讓代碼更加靈活,復(fù)用性更高
(2)、this 一般情況下,都是指向函數(shù)的擁有者。
(3)、在函數(shù)自執(zhí)行里,this 指向的是 window 對(duì)象。
擴(kuò)展:關(guān)于this,還有一個(gè)地方比較讓人模糊的是在dom事件里,通常有如下3種情況:
a、使用標(biāo)簽屬性注冊(cè)事件,此時(shí)this指向的是window對(duì)象。
b、對(duì)與a,要讓this指向input,可以將this作為參數(shù)傳遞。
c、使用addEventListener等注冊(cè)事件。此時(shí)this也是指向 input。

回答二:

(1)、處于全局作用域下的this:

this;/*window*/
var a = {name: this}/*window*/
var b = [this];/*window*/

在全局作用域下,this默認(rèn)指向window對(duì)象。

(2)、處在函數(shù)中的this,又分為以下幾種情況:

a、一般定義的函數(shù),然后一般的執(zhí)行:

var a = function(){
console.log(this);
}
a();/*window*/

this還是默認(rèn)指向window。

b、一般定義,用new調(diào)用執(zhí)行:

var a = function(){
console.log(this);
}
new a();/*新建的空對(duì)象*/

這時(shí)候讓this指向新建的空對(duì)象,我們才可以給空對(duì)象初始化自有變量

c、作為對(duì)象屬性的函數(shù),調(diào)用時(shí):

var a = {
f:function(){
console.log(this)
}
}
a.f();/*a對(duì)象*/

這時(shí)候this指向調(diào)用f函數(shù)的a對(duì)象。

(3)、通過call()和apply()來改變this的默認(rèn)引用:

var b = {id: 'b'};
var a = {
f:function(){
console.log(this)
 }
}
a.f.call(b);/*window*/

所有函數(shù)對(duì)象都有的call方法和apply方法,它們的用法大體相似,f.call(b);的意思 是,執(zhí)行f函數(shù),并將f函數(shù)執(zhí)行期活動(dòng)對(duì)象里的this指向b對(duì)象,這樣標(biāo)示符解析時(shí),this就會(huì)是b對(duì)象了。不過調(diào)用函數(shù)是要傳參的。所以,f.call(b, x, y); f.apply(b, [x, y]);好吧,以上就是用call方法執(zhí)行f函數(shù),與用apply方法執(zhí)行f函數(shù)時(shí)傳參方式,它們之間的差異,大家一目了然:apply通過數(shù)組的方式傳遞參數(shù),call通過一個(gè)個(gè)的形參傳遞參數(shù)。

(4)、一些函數(shù)特殊執(zhí)行情況this的指向問題:

a、setTimeout()和setInverval():

var a = function(){
console.log(this);
}
setTimeout(a,0);/*window*/

setInterval()類似。

b、dom模型中觸發(fā)事件的回調(diào)方法執(zhí)行中活動(dòng)對(duì)象里的this指向該dom對(duì)象。

14、JavaScript對(duì)象的幾種創(chuàng)建方式?
(1) var obj = new Object();
(1) 工廠模式

function Parent(){
var Child = new Object();
Child.name="欲淚成雪";
Child.age="20";
return Child;
};
var x = Parent();

引用該對(duì)象的時(shí)候,這里使用的是 var x = Parent()而不是 var x = new Parent();因?yàn)楹笳邥?huì)可能出現(xiàn)很多問題(前者也成為工廠經(jīng)典方式,后者稱之為混合工廠方式),不推薦使用new的方式使用該對(duì)象

(2)構(gòu)造函數(shù)方式

function Parent(){
  this.name="欲淚成雪";
  this.age="20";
};
var x =new Parent();

(3) 原型模式

function Parent(){
};
Parent.prototype.name="欲淚成雪";
Parent.prototype.age="20";
var x =new Parent();

(4)混合的構(gòu)造函數(shù),原型方式(推薦)

function Parent(){
  this.name="欲淚成雪";
  this.age=22;
};
Parent.prototype.lev=function(){
  return this.name;
};
var x =new Parent();

(5)動(dòng)態(tài)原型方式

function Parent(){
  this.name="欲淚成雪";
  this.age=22;
;
if(typeof Parent._lev=="undefined"){
Parent.prototype.lev=function(){
  return this.name;
}
Parent._lev=true;
}
};
var x =new Parent();

15、get和post的區(qū)別,何時(shí)使用post?
(1)、get 是從服務(wù)器上獲取數(shù)據(jù),post 是向服務(wù)器傳送數(shù)據(jù)。 get 請(qǐng)求返回 request - URI 所指出的任意信息。
Post 請(qǐng)求用來發(fā)送電子郵件、新聞或發(fā)送能由交互用戶填寫的表格。這是唯一需要在請(qǐng)求中發(fā)送body的請(qǐng)求。使用Post請(qǐng)求時(shí)需要在報(bào)文首部 Content - Length 字段中指出body的長(zhǎng)度。
(2)、get 是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng),在URL中可以看到。post是通過HTTP post機(jī)制,將表單內(nèi)各個(gè)字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址,用戶看不到這個(gè)過程。
(3)、對(duì)于 get 方式,服務(wù)器端用Request.QueryString獲取變量的值,對(duì)于 post 方式,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù)。
(4)、get 傳送的數(shù)據(jù)量較小,不能大于2KB。post 傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。 用IIS過濾器的只接受get參數(shù),所以一般大型搜索引擎都是用get方式。
(5)get安全性非常低,post 安全性相對(duì)較高。如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是
非敏感數(shù)據(jù),那么使用get;如果用戶輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù),那么還是使用 post 為好。

16、null和undefined的區(qū)別?
(1)、null是一個(gè)表示"無"的對(duì)象,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示"無"的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN。當(dāng)聲明的變量還未被初始化時(shí),變量的默認(rèn)值為undefined。
(2)、null用來表示尚未存在的對(duì)象,常用來表示函數(shù)企圖返回一個(gè)不存在的對(duì)象。
(3)、undefined表示"缺少值",就是此處應(yīng)該有一個(gè)值,但是還沒有定義。典型用法是:
a、變量被聲明了,但沒有賦值時(shí),就等于undefined。
b、調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
c、對(duì)象沒有賦值的屬性,該屬性的值為undefined。
d、函數(shù)沒有返回值時(shí),默認(rèn)返回undefined。
(4)、null表示"沒有對(duì)象",即該處不應(yīng)該有值。典型用法是:
a、作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象。
b、作為對(duì)象原型鏈的終點(diǎn)。

17、請(qǐng)寫出js內(nèi)存泄漏的問題?

回答一:
(1)、IE7/8 DOM對(duì)象或者ActiveX對(duì)象循環(huán)引用導(dǎo)致內(nèi)存泄漏
a、多個(gè)對(duì)象循環(huán)引用
b、循環(huán)引用自己
(2)、基礎(chǔ)的DOM泄漏
當(dāng)原有的DOM被移除時(shí),子結(jié)點(diǎn)引用沒有被移除則無法回收。
(3)、timer定時(shí)器泄漏
這個(gè)時(shí)候你無法回收buggyObject,解決辦法,先停止timer然后再回收
回答二:
內(nèi)存泄漏指任何對(duì)象在您不再擁有或需要它之后仍然存在。
垃圾回收器定期掃描對(duì)象,并計(jì)算引用了每個(gè)對(duì)象的其他對(duì)象的數(shù)量。如果一個(gè)對(duì)象的引用數(shù)量為 0(沒有其他對(duì)象引用過該對(duì)象),或?qū)υ搶?duì)象的惟一引用是循環(huán)的,那么該對(duì)象的內(nèi)存即可回收。
setTimeout 的第一個(gè)參數(shù)使用字符串而非函數(shù)的話,會(huì)引發(fā)內(nèi)存泄漏。
閉包、控制臺(tái)日志、循環(huán)(在兩個(gè)對(duì)象彼此引用且彼此保留時(shí),就會(huì)產(chǎn)生一個(gè)循環(huán))也會(huì)引發(fā)內(nèi)存泄漏問題。

18、哪些地方會(huì)出現(xiàn)css阻塞,哪些地方會(huì)出現(xiàn)js阻塞?
js的阻塞特性:所有瀏覽器在下載JS的時(shí)候,會(huì)阻止一切其他活動(dòng),比如其他資源的下載,內(nèi)容的呈現(xiàn)等等。直到JS下載、解析、執(zhí)行完畢后才開始繼續(xù)并行下載其他資源并呈現(xiàn)內(nèi)容。為了提高用戶體驗(yàn),新一代瀏覽器都支持并行下載JS,但是JS下載仍然會(huì)阻塞其它資源的下載(例如.圖片,css文件等)。
由于瀏覽器為了防止出現(xiàn)JS修改DOM樹,需要重新構(gòu)建DOM樹的情況,所以就會(huì)阻塞其他的下載和呈現(xiàn)。
嵌入JS會(huì)阻塞所有內(nèi)容的呈現(xiàn),而外部JS只會(huì)阻塞其后內(nèi)容的顯示,2種方式都會(huì)阻塞其后資源的下載。也就是說外部樣式不會(huì)阻塞外部腳本的加載,但會(huì)阻塞外部腳本的執(zhí)行。
CSS怎么會(huì)阻塞加載?CSS本來是可以并行下載的,在什么情況下會(huì)出現(xiàn)阻塞加載了(在測(cè)試觀察中,IE6下CSS都是阻塞加載)
當(dāng)CSS后面跟著嵌入的JS的時(shí)候,該CSS就會(huì)出現(xiàn)阻塞后面資源下載的情況。而當(dāng)把嵌入JS放到CSS前面,就不會(huì)出現(xiàn)阻塞的情況了。
根本原因:因?yàn)闉g覽器會(huì)維持html中css和js的順序,樣式表必須在嵌入的JS執(zhí)行前先加載、解析完。而嵌入的JS會(huì)阻塞后面的資源加載,所以就會(huì)出現(xiàn)上面CSS阻塞下載的情況。
JS應(yīng)該放在什么位置?
(1)、放在底部,雖然放在底部照樣會(huì)阻塞所有呈現(xiàn),但不會(huì)阻塞資源下載。
(2)、如果嵌入JS放在head中,請(qǐng)把嵌入JS放在CSS頭部。
(3)、使用defer(只支持IE)
(4)、不要在嵌入的JS中調(diào)用運(yùn)行時(shí)間較長(zhǎng)的函數(shù),如果一定要用,可以用`setTimeout`來調(diào)用
Javascript無阻塞加載具體方式
將腳本放在底部。<link>還是放在head中,用以保證在js加載前,能加載出正常顯示的頁(yè)面。<script>標(biāo)簽放在</body>前。
成組腳本:由于每個(gè)<script>標(biāo)簽下載時(shí)阻塞頁(yè)面解析過程,所以限制頁(yè)面的<script>總數(shù)也可以改善性能。適用于內(nèi)聯(lián)腳本和外部腳本。
非阻塞腳本:等頁(yè)面完成加載后,再加載js代碼。也就是,在window.onload事件發(fā)出后開始下載代碼。
(1)defer屬性:支持IE4和fierfox3.5更高版本瀏覽器
(2)動(dòng)態(tài)腳本元素:文檔對(duì)象模型(DOM)允許你使用js動(dòng)態(tài)創(chuàng)建HTML的幾乎全部文檔內(nèi)容。代碼如下:

<script>
var script=document.createElement("script");
script.type="text/javascript";
script.src="file.js";
document.getElementsByTagName("head")[0].appendChild(script);
</script>

此技術(shù)的重點(diǎn)在于:無論在何處啟動(dòng)下載,文件額下載和運(yùn)行都不會(huì)阻塞其他頁(yè)面處理過程。即使在head里(除了用于下載文件的http鏈接)。

19、對(duì)比Flash與ajax哪個(gè)好,在使用中如何取舍?
Ajax的優(yōu)勢(shì):
(1)、可搜索性
普通的文本網(wǎng)頁(yè)會(huì)更有利于SEO。文本內(nèi)容是搜索引擎容易檢索的,而繁瑣的swf字節(jié)碼卻是搜索引擎不愿觸及的。雖然Google等一些大型的搜索引擎可以檢索SWF內(nèi)部的內(nèi)容,但是仍然有很多麻煩存在。
(2)、開放性
Flash常年以來被Macromedia看的很死。包括Flex、FMS等輔佐技術(shù)一直都需要昂貴的安裝、維護(hù)費(fèi)用。而JS則沒有這樣的麻煩。沒有人愿意承擔(dān)法律和版權(quán)的風(fēng)險(xiǎn)。
費(fèi)用
Flash開發(fā)是很昂貴的,因?yàn)镕lashIDE等環(huán)境都是要收費(fèi)的.而Ajax則不同.雖然有一些便宜的生成swf的工具,但是他們的工能實(shí)在無法滿足復(fù)雜需求。
(3)、易用性
Ajax程序有更好的易用性。由于中間有一層Flashplayer代理層,因此許多輔助功能無法被Flash靈活利用。而且Flash在一些方面有著不好的口碑。比如彈出廣告、比如惡意代碼。
(awflasher.com個(gè)人認(rèn)為這八成是亂上xx網(wǎng)站造成的)
(4)、易于開發(fā)
人們開發(fā)復(fù)雜的Ajax和Flash應(yīng)用程序時(shí),都會(huì)借助一些高級(jí)的開發(fā)工具。普遍來說,Ajax的開發(fā)包比Flash簡(jiǎn)便、容易。
Flash的優(yōu)勢(shì):
(1)、多媒體處理
Flash在音頻、視頻等多媒體領(lǐng)域相比HTML有絕對(duì)的優(yōu)勢(shì)?,F(xiàn)在幾乎所有的網(wǎng)站都包含有Flash內(nèi)容。
(2)、兼容性
兼容性好:由于通過了唯一的FlashPlayer“代理”。人們不必像調(diào)試JS那樣,在不同的瀏覽器中調(diào)試程序。
(3)、矢量圖型
這是Flash最大的優(yōu)勢(shì),同樣處在這一領(lǐng)域的SVG、Canvas element以及Direct完全不能與Flash相比。
(4)、客戶端資源調(diào)度
Flash能夠更容易的調(diào)用瀏覽器以外的外部資源。比如攝像頭、麥克風(fēng)等。然而這是普通的HTML無法完成的。但是這也許是一個(gè)缺點(diǎn)(為什么呢?)

Ajax的劣勢(shì):
(1)、它可能破壞瀏覽器的后退功能
(2)、使用動(dòng)態(tài)頁(yè)面更新使得用戶難于將某個(gè)特定的狀態(tài)保存到收藏夾中 ,不過這些都有相關(guān)方法解決。
Flash的劣勢(shì):
(1)、二進(jìn)制格式
(2)、格式私有
(3)、flash 文件經(jīng)常會(huì)很大,用戶第一次使用的時(shí)候需要忍耐較長(zhǎng)的等待時(shí)間
(4)/性能問題
ajax與flash各有利弊,到底哪個(gè)好,這取決于你的需求

20、請(qǐng)你解釋一下事件冒泡機(jī)制?
a、在一個(gè)對(duì)象上觸發(fā)某類事件(比如單擊onclick事件),如果此對(duì)象定義了此事件的處理程序,那么此事件就會(huì)調(diào)用這個(gè)處理程序,如果沒有定義此事件處理程序或者事件返回true,那么這個(gè)事件會(huì)向這個(gè)對(duì)象的父級(jí)對(duì)象傳播,從里到外,直至它被處理(父級(jí)對(duì)象所有同類事件都將被激活),或者它到達(dá)了對(duì)象層次的最頂層,即document對(duì)象(有些瀏覽器是window)。
b、冒泡型事件:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)(document對(duì)象)的順序觸發(fā)
c、js冒泡機(jī)制是指如果某元素定義了事件A,如click事件,如果觸發(fā)了事件之后,沒有阻止冒泡事件,那么事件將向父級(jí)元素傳播,觸發(fā)父類的click函數(shù)。

//阻止冒泡時(shí)間方法,兼容ie(e.cancleBubble)和ff(e.stopProgation)
function stopBubble(e){
var evt = e||window.event;
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡
evt.preventDefault


21、請(qǐng)你說說split()與join() 函數(shù)的區(qū)別?

前者是切割成數(shù)組的形式,后者是將數(shù)組轉(zhuǎn)換成字符串

Join 函數(shù)獲取一批字符串,然后用分隔符字符串將它們聯(lián)接起來,從而返回一個(gè)字符串。Split 函數(shù)獲取一個(gè)字符串,然后在分隔符處將其斷開,從而返回一批字符串。但是,這兩個(gè)函數(shù)之間的主要區(qū)別在于 Join 可以使用任何分隔符字符串將多個(gè)字符串連接起來,而 Split 只能使用一個(gè)字符分隔符將字符串?dāng)嚅_。
簡(jiǎn)單地說,如果你用split,是把一串字符(根據(jù)某個(gè)分隔符)分成若干個(gè)元素存放在一個(gè)數(shù)組里。而Join是把數(shù)組中的字符串連成一個(gè)長(zhǎng)串,可以大體上認(rèn)為是split的逆操作。

22、說說你對(duì)Promise的理解?
ES6 原生提供了 Promise 對(duì)象。
所謂 Promise,就是一個(gè)對(duì)象,用來傳遞異步操作的消息。它代表了某個(gè)未來才會(huì)知道結(jié)果的事件(通常是一個(gè)異步操作),并且這個(gè)事件提供統(tǒng)一的 API,可供進(jìn)一步處理。
Promise 對(duì)象有以下兩個(gè)特點(diǎn)。
(1)、對(duì)象的狀態(tài)不受外界影響。Promise 對(duì)象代表一個(gè)異步操作,有三種狀態(tài):Pending(進(jìn)行中)、Resolved(已完成,又稱 Fulfilled)和 Rejected(已失?。?。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個(gè)狀態(tài)。這也是 Promise 這個(gè)名字的由來,它的英語意思就是「承諾」,表示其他手段無法改變。
(2)、一旦狀態(tài)改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果。Promise 對(duì)象的狀態(tài)改變,只有兩種可能:從 Pending 變?yōu)?Resolved 和從 Pending 變?yōu)?Rejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果。就算改變已經(jīng)發(fā)生了,你再對(duì) Promise 對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過了它,再去監(jiān)聽,是得不到結(jié)果的。

有了 Promise 對(duì)象,就可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)。此外,Promise 對(duì)象提供統(tǒng)一的接口,使得控制異步操作更加容易。

Promise 也有一些缺點(diǎn)。首先,無法取消 Promise,一旦新建它就會(huì)立即執(zhí)行,無法中途取消。其次,如果不設(shè)置回調(diào)函數(shù),Promise 內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部。第三,當(dāng)處于 Pending 狀態(tài)時(shí),無法得知目前進(jìn)展到哪一個(gè)階段(剛剛開始還是即將完成)。

23、談?wù)勀銓?duì)Javascript垃圾回收機(jī)制的理解?

(1)、標(biāo)記清除(mark and sweep)
這是`JavaScript`最常見的垃圾回收方式,當(dāng)變量進(jìn)入執(zhí)行環(huán)境的時(shí)候,比如函數(shù)中聲明一個(gè)變量,垃圾回收器將其標(biāo)記為“進(jìn)入環(huán)境”,當(dāng)變量離開環(huán)境的時(shí)候(函數(shù)執(zhí)行結(jié)束)將其標(biāo)記為“離開環(huán)境”。
垃圾回收器會(huì)在運(yùn)行的時(shí)候給存儲(chǔ)在內(nèi)存中的所有變量加上標(biāo)記,然后去掉環(huán)境中的變量以及被環(huán)境中變量所引用的變量(閉包),在這些完成之后仍存在標(biāo)記的就是要?jiǎng)h除的變量了

(2)、引用計(jì)數(shù)(reference counting)
在低版本`IE`中經(jīng)常會(huì)出現(xiàn)內(nèi)存泄露,很多時(shí)候就是因?yàn)槠洳捎靡糜?jì)數(shù)方式進(jìn)行垃圾回收。引用計(jì)數(shù)的策略是跟蹤記錄每個(gè)值被使用的次數(shù),當(dāng)聲明了一個(gè) 變量并將一個(gè)引用類型賦值給該變量的時(shí)候這個(gè)值的引用次數(shù)就加1,如果該變量的值變成了另外一個(gè),則這個(gè)值得引用次數(shù)減1,當(dāng)這個(gè)值的引用次數(shù)變?yōu)?的時(shí) 候,說明沒有變量在使用,這個(gè)值沒法被訪問了,因此可以將其占用的空間回收,這樣垃圾回收器會(huì)在運(yùn)行的時(shí)候清理掉引用次數(shù)為0的值占用的空間。
在IE中雖然`JavaScript`對(duì)象通過標(biāo)記清除的方式進(jìn)行垃圾回收,但BOM與DOM對(duì)象卻是通過引用計(jì)數(shù)回收垃圾的,也就是說只要涉及BOM及DOM就會(huì)出現(xiàn)循環(huán)引用問題。

24、說說你對(duì)原型(prototype)理解?
JavaScript是一種通過原型實(shí)現(xiàn)繼承的語言與別的高級(jí)語言是有區(qū)別的,像java,C#是通過類型決定繼承關(guān)系的,JavaScript是的動(dòng)態(tài)的弱類型語言,總之可以認(rèn)為JavaScript中所有都是對(duì)象,在JavaScript中,原型也是一個(gè)對(duì)象,通過原型可以實(shí)現(xiàn)對(duì)象的屬性繼承,JavaScript的對(duì)象中都包含了一個(gè)" prototype"內(nèi)部屬性,這個(gè)屬性所對(duì)應(yīng)的就是該對(duì)象的原型。

"prototype"作為對(duì)象的內(nèi)部屬性,是不能被直接訪問的。所以為了方便查看一個(gè)對(duì)象的原型,F(xiàn)irefox和Chrome內(nèi)核的JavaScript引擎中提供了"__proto__"這個(gè)非標(biāo)準(zhǔn)的訪問器(ECMA新標(biāo)準(zhǔn)中引入了標(biāo)準(zhǔn)對(duì)象原型訪問器"Object.getPrototype(object)")。

原型的主要作用就是為了實(shí)現(xiàn)繼承與擴(kuò)展對(duì)象。

25、typeof與instanceof的區(qū)別是什么?
JavaScript 中,判斷一個(gè)變量的類型可以用typeof
(1)、數(shù)字類型, typeof 返回的值是 number。比如說:typeof(1),返回值是number
(2)、字符串類型, typeof 返回的值是 string。比如typeof("123")返回值是string。
(3)、布爾類型, typeof 返回的值是 boolean 。比如typeof(true)返回值是boolean。
(4)、對(duì)象、數(shù)組、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object。
(5)、函數(shù)類型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。
(6)、不存在的變量、函數(shù)或者undefined,將返回undefined。比如:typeof(abc)、typeof(undefined)都返回undefined。
JavaScript 中,instanceof用于判斷某個(gè)對(duì)象是否被另一個(gè)函數(shù)構(gòu)造。
使用 typeof 運(yùn)算符時(shí)采用引用類型存儲(chǔ)值會(huì)出現(xiàn)一個(gè)問題,無論引用的是什么類型的對(duì)象,它都返回 "object"。ECMAScript 引入了另一個(gè) Java 運(yùn)算符 instanceof 來解決這個(gè)問題。instanceof 運(yùn)算符與 typeof 運(yùn)算符相似,用于識(shí)別正在處理的對(duì)象的類型。與 typeof 方法不同的是,instanceof 方法要求開發(fā)者明確地確認(rèn)對(duì)象為某特定類型。

26、說說你對(duì)node.js的理解?
a、Node.js 是一個(gè)基于Google Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全球最大的開源庫(kù)生態(tài)系統(tǒng)。
b、能方便地搭建響應(yīng)速度快、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用,Node.js 使用事件驅(qū)動(dòng), 非阻塞I/O 模型而得以輕量和高效,非常適合在分布式設(shè)備上運(yùn)行的數(shù)據(jù)密集型的實(shí)時(shí)應(yīng)用。
c、簡(jiǎn)單說Node.js就是運(yùn)行在服務(wù)器端的JavaScript,是現(xiàn)在流行的語言中能同時(shí)運(yùn)行在前端與后臺(tái)的程序語言

27、NPM(包管理器)作用是什么?
NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場(chǎng)景有以下幾種:
a、允許用戶從NPM服務(wù)器下載別人編寫的第三方包到本地使用。
b、允許用戶從NPM服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。
c、允許用戶將自己編寫的包或命令行程序上傳到NPM服務(wù)器供別人使用。

28、請(qǐng)簡(jiǎn)要說說你對(duì)Javascript面向?qū)ο蟮睦斫?#63;
為了說明 JavaScript 是一門徹底的面向?qū)ο蟮恼Z言,首先有必要從面向?qū)ο蟮母拍钪?, 探討一下面向?qū)ο笾械膸讉€(gè)概念:
a、一切事物皆對(duì)象
b、對(duì)象具有封裝和繼承特性
c、對(duì)象與對(duì)象之間使用消息通信,各自存在信息隱藏
以這三點(diǎn)做為依據(jù),C++ 是半面向?qū)ο蟀朊嫦蜻^程語言,因?yàn)?,雖然他實(shí)現(xiàn)了類的封裝、繼承和多態(tài),但存在非對(duì)象性質(zhì)的全局函數(shù)和變量。Java、C# 是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。但這里函數(shù)本身是一個(gè)過程,只是依附在某個(gè)類上。
然而,面向?qū)ο髢H僅是一個(gè)概念或者編程思想而已,它不應(yīng)該依賴于某個(gè)語言存在。比如 Java 采用面向?qū)ο笏枷霕?gòu)造其語言,它實(shí)現(xiàn)了類、繼承、派生、多態(tài)、接口等機(jī)制。但是這些機(jī)制,只是實(shí)現(xiàn)面向?qū)ο缶幊痰囊环N手段,而非必須。換言之,一門語言可以根據(jù)其自身特性選擇合適的方式來實(shí)現(xiàn)面向?qū)ο?。所以,由于大多?shù)程序員首先學(xué)習(xí)或者使用的是類似 Java、C++ 等高級(jí)編譯型語言(Java 雖然是半編譯半解釋,但一般做為編譯型來講解),因而先入為主地接受了“類”這個(gè)面向?qū)ο髮?shí)現(xiàn)方式,從而在學(xué)習(xí)腳本語言的時(shí)候,習(xí)慣性地用類式面向?qū)ο笳Z言中的概念來判斷該語言是否是面向?qū)ο笳Z言,或者是否具備面向?qū)ο筇匦?。這也是阻礙程序員深入學(xué)習(xí)并掌握 JavaScript 的重要原因之一。
實(shí)際上,JavaScript 語言是通過一種叫做 原型(prototype)的方式來實(shí)現(xiàn)面向?qū)ο缶幊痰摹?/strong>下面就來討論 基于類的(class-based)面向?qū)ο蠛?基于原型的 (prototype-based) 面向?qū)ο筮@兩種方式在構(gòu)造客觀世界的方式上的差別。

基于類的面向?qū)ο蠛突谠偷拿嫦驅(qū)ο蠓绞奖容^在基于類的面向?qū)ο蠓绞街?/strong>,對(duì)象(object)依靠類(class)來產(chǎn)生。而在基于原型的面向?qū)ο蠓绞街?,?duì)象(object)則是依靠 構(gòu)造器(constructor)利用 原型(prototype)構(gòu)造出來的。舉個(gè)客觀世界的例子來說明二種方式認(rèn)知的差異。例如工廠造一輛車,一方面,工人必須參照一張工程圖紙,設(shè)計(jì)規(guī)定這輛車應(yīng)該如何制造。這里的工程圖紙就好比是語言中的 類 (class),而車就是按照這個(gè) 類(class)制造出來的;另一方面,工人和機(jī)器 ( 相當(dāng)于 constructor) 利用各種零部件如發(fā)動(dòng)機(jī),輪胎,方向盤 ( 相當(dāng)于 prototype 的各個(gè)屬性 ) 將汽車構(gòu)造出來。
事實(shí)上關(guān)于這兩種方式誰更為徹底地表達(dá)了面向?qū)ο蟮乃枷耄壳吧杏袪?zhēng)論。但筆者認(rèn)為原型式面向?qū)ο笫且环N更為徹底的面向?qū)ο蠓绞剑碛扇缦拢?br /> (1)、首先,客觀世界中的對(duì)象的產(chǎn)生都是其它實(shí)物對(duì)象構(gòu)造的結(jié)果,而抽象的“圖紙”是不能產(chǎn)生“汽車”的,也就是說,類是一個(gè)抽象概念而并非實(shí)體,而對(duì)象的產(chǎn)生是一個(gè)實(shí)體的產(chǎn)生;
(2)、其次,按照一切事物皆對(duì)象這個(gè)最基本的面向?qū)ο蟮姆▌t來看,類 (class) 本身并不是一個(gè)對(duì)象,然而原型方式中的構(gòu)造器 (constructor) 和原型 (prototype) 本身也是其他對(duì)象通過原型方式構(gòu)造出來的對(duì)象。
(3)、再次,在類式面向?qū)ο笳Z言中,對(duì)象的狀態(tài) (state) 由對(duì)象實(shí)例 (instance) 所持有,對(duì)象的行為方法 (method) 則由聲明該對(duì)象的類所持有,并且只有對(duì)象的結(jié)構(gòu)和方法能夠被繼承;而在原型式面向?qū)ο笳Z言中,對(duì)象的行為、狀態(tài)都屬于對(duì)象本身,并且能夠一起被繼承(參考資源),這也更貼近客觀實(shí)際。
(4)、最后,類式面向?qū)ο笳Z言比如 Java,為了彌補(bǔ)無法使用面向過程語言中全局函數(shù)和變量的不便,允許在類中聲明靜態(tài) (static) 屬性和靜態(tài)方法。而實(shí)際上,客觀世界不存在所謂靜態(tài)概念,因?yàn)橐磺惺挛锝詫?duì)象!而在原型式面向?qū)ο笳Z言中,除內(nèi)建對(duì)象 (build-in object) 外,不允許全局對(duì)象、方法或者屬性的存在,也沒有靜態(tài)概念。
所有語言元素 (primitive) 必須依賴對(duì)象存在。但由于函數(shù)式語言的特點(diǎn),語言元
素所依賴的對(duì)象是隨著運(yùn)行時(shí) (runtime) 上下文 context變化而變化的,具體體現(xiàn)在
this指針的變化。正是這種特點(diǎn)更貼近“萬物皆有所屬,宇宙乃萬物生存之根本”的自然
觀點(diǎn)。在 程序清單 1中 window 便類似與宇宙的概念。

29、你對(duì)JavaScript函數(shù)的理解是?
javascript中的函數(shù)就是對(duì)象,對(duì)象就是“鍵/值”對(duì)的集合并擁有一個(gè)連接到原型對(duì)隱藏連接。

(1)、參數(shù)對(duì)象 (arguments)
第一個(gè)函數(shù)中有一個(gè)默認(rèn)對(duì)象叫arguments,類似數(shù)組,但不是數(shù)組,該對(duì)象是傳遞給函數(shù)的參數(shù)。
(2)、構(gòu)造函數(shù)
在javascript中對(duì)象構(gòu)造函數(shù)可以創(chuàng)建一個(gè)對(duì)象。
(3)、函數(shù)調(diào)用
a、call:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象
b、apply:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象,與call類似。
c、caller:在一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)時(shí),被調(diào)用函數(shù)會(huì)自動(dòng)生成一個(gè)caller屬性,指向調(diào)用它的函數(shù)對(duì)象。如果該函數(shù)當(dāng)前未被調(diào)用,或并非被其他函數(shù)調(diào)用,則caller為null。
d、Callee:當(dāng)函數(shù)被調(diào)用時(shí),它的arguments.callee對(duì)象就會(huì)指向自身,也就是一個(gè)
對(duì)自己的引用。

30、簡(jiǎn)要說說什么是IIFE?它有什么作用?
IIFE即Immediately-Invoked Function Expression,立即執(zhí)行函數(shù)表達(dá)式, 立即執(zhí)行的函數(shù)表達(dá)式的執(zhí)行括號(hào)應(yīng)該寫在外包括號(hào)內(nèi)。雖然寫在內(nèi)還是寫在外都是有效的,但寫在內(nèi)使得整個(gè)表達(dá)式看起來更像一個(gè)整體,因此推薦這么做。

//最常用的兩種寫法
(function(){ /* code */ }()); // 老師推薦寫法
(function(){ /* code */ })(); // 當(dāng)然這種也可以

// 括號(hào)和JS的一些操作符(如 = && || ,等)可以在函數(shù)表達(dá)式和函數(shù)聲明上消除歧義
// 如下代碼中,解析器已經(jīng)知道一個(gè)是表達(dá)式了,于是也會(huì)把另一個(gè)默認(rèn)為表達(dá)式
// 但是兩者交換則會(huì)報(bào)錯(cuò)
var i = function(){ return 10; }();
true && function(){ /* code */ }();
0, function(){ /* code */ }();

// 如果你不怕代碼晦澀難讀,也可以選擇一元運(yùn)算符
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

// 你也可以這樣
new function(){ /* code */ }
new function(){ /* code */ }() // 帶參

IIFE的作用
(1)、提高性能:減少作用域查找時(shí)間。使用IIFE的一個(gè)微小的性能優(yōu)勢(shì)是通過匿名函數(shù)的參數(shù)傳遞常用全局對(duì)象window、document、jQuery,在作用域內(nèi)引用這些全局對(duì)象。JavaScript解釋器首先在作用域內(nèi)查找屬性,然后一直沿著鏈向上查找,直到全局范圍。將全局對(duì)象放在IIFE作用域內(nèi)提升js解釋器的查找速度和性能。
(2)、壓縮空間:通過參數(shù)傳遞全局對(duì)象,壓縮時(shí)可以將這些全局對(duì)象匿名為一個(gè)更加精簡(jiǎn)的變量名
(3)、避免沖突:匿名函數(shù)內(nèi)部可以形成一個(gè)塊級(jí)的私有作用域。
(4)、依賴加載:可以靈活的加載第三方插件,當(dāng)然使用模塊化加載更好(AMD,CMD)

31、談?wù)勀銓?duì)Function與Object的理解?
Function
函數(shù)就是對(duì)象,代表函數(shù)的對(duì)象就是函數(shù)對(duì)象。所有的函數(shù)對(duì)象是被Function這個(gè)函數(shù)對(duì)象構(gòu)造出來的。Function是最頂層的構(gòu)造器。它構(gòu)造了系統(tǒng)中所有的對(duì)象,包括用戶自定義對(duì)象,系統(tǒng)內(nèi)置對(duì)象,甚至包括它自已。這也表明Function具有自舉性(自已構(gòu)造自己的能力)。這也間接決定了Function的call和constructor邏輯相同。每個(gè)對(duì)象都有一個(gè) constructor 屬性,用于指向創(chuàng)建其的函數(shù)對(duì)象。
a、函數(shù)與對(duì)象具有相同的語言地位
b、沒有類,只有對(duì)象
c、函數(shù)也是一種對(duì)象,所謂的函數(shù)對(duì)象
d、對(duì)象是按引用來傳遞的
Object
對(duì)于Object它是最頂層的對(duì)象,所有的對(duì)象都將繼承Object的原型,但是你也要明確的知道Object也是一個(gè)函數(shù)對(duì)象,所以說Object是被Function構(gòu)造出來的。

JavaScript 原型鏈

32、$.extend與$.fn.extend區(qū)別是什么?
$.extend
在jQuery根命名空間下直接調(diào)用的方法可以認(rèn)為是jQuery的靜態(tài)方法或?qū)傩?,常常使用方法名來調(diào)用,使用.方法名來調(diào)用,使用.extend這個(gè)靜態(tài)方法可以完成兩個(gè)功能:
a、擴(kuò)展屬性或方法給jQuery
b、擴(kuò)展對(duì)象
$.fn.extend
.fn就是jQuery的原型,.fn等于jQuery.prototype,是jQuery的別名。.fn.extend方法的作用是用于擴(kuò)展jQuery實(shí)例對(duì)象,也就是我們從頁(yè)面中獲得的jQuery對(duì)象。
.fn擴(kuò)展了jQuery的原型,讓所有的jQuery實(shí)例對(duì)象都得到的擴(kuò)展的方法,其它也可以直接修改jQuery.prototype來實(shí)現(xiàn),.fn是jQuery.prototype的簡(jiǎn)寫

33、什么是鏈?zhǔn)骄幊?#63;
幾乎在所有基于“類型”的語言中如果調(diào)用一個(gè)方法后將對(duì)象作為方法參數(shù)返回則就會(huì)形成鏈?zhǔn)骄幊?br /> 鏈?zhǔn)骄幊淌菍⒍鄠€(gè)操作(多行代碼)通過點(diǎn)號(hào)"."鏈接在一起成為一句代碼。 鏈?zhǔn)酱a通常要求操作有返回值, 但對(duì)于很多操作大都是void型,什么也不返回,這樣就很難鏈起來了, 當(dāng)然也有解決辦法,可能不太優(yōu)雅。 鏈?zhǔn)骄幊痰男滤枷朐趈Query中已流行使用

示例:

return $.each(this, function(index, obj) {
   $("<span/>").html("+").css("cursor", "pointer").click(function() {
    $(obj).width($(obj).width() + length);
   }).insertAfter(obj);
  });

上面的示例中當(dāng)$.each循環(huán)完成后返回this對(duì)象,返回的仍然是一個(gè)jQuery對(duì)象,所以可以繼續(xù)jQuery編程。

$("button").SuperPlus(10).height(26).width(100).css("color","blue");

34、請(qǐng)指出 JavaScript中的本地對(duì)象、內(nèi)置對(duì)象、宿主對(duì)象的區(qū)別?
(1)、本地對(duì)象
ECMA-262 把本地對(duì)象(native object)定義為“獨(dú)立于宿主環(huán)境的 ECMAScript 實(shí)現(xiàn)提供的對(duì)象”。
再來看一下,“本地對(duì)象”包含哪些內(nèi)容:
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
由此可以看出,簡(jiǎn)單來說,本地對(duì)象就是 ECMA-262 定義的類(引用類型)。
(2)、內(nèi)置對(duì)象
ECMA-262 把內(nèi)置對(duì)象(built-in object)定義為“由 ECMAScript 實(shí)現(xiàn)提供的、獨(dú)立于宿主環(huán)境的所有對(duì)象,在 ECMAScript 程序開始執(zhí)行時(shí)出現(xiàn)”。這意味著開發(fā)者不必明確實(shí)例化內(nèi)置對(duì)象,它已被實(shí)例化了。
同樣是“獨(dú)立于宿主環(huán)境”。根據(jù)定義我們似乎很難分清“內(nèi)置對(duì)象”與“本地對(duì)象”的區(qū)別。而ECMA-262 只定義了兩個(gè)內(nèi)置對(duì)象,即 Global 和 Math (它們也是本地對(duì)象,根據(jù)定義,每個(gè)內(nèi)置對(duì)象都是本地對(duì)象)。
如此就可以理解了。內(nèi)置對(duì)象是本地對(duì)象的一種。而其包含的兩種對(duì)象中,Math對(duì)象我們經(jīng)常用到,可這個(gè)Global對(duì)象是啥東西呢?
Global對(duì)象是ECMAScript中最特別的對(duì)象,因?yàn)閷?shí)際上它根本不存在,但大家要清楚,在ECMAScript中,不存在獨(dú)立的函數(shù),所有函數(shù)都必須是某個(gè)對(duì)象的方法。類似于isNaN()、parseInt()和parseFloat()方法等,看起來都是函數(shù),而實(shí)際上,它們都是Global對(duì)象的方法。
(3)、宿主對(duì)象
由ECMAScript實(shí)現(xiàn)的宿主環(huán)境提供的對(duì)象,即我們網(wǎng)頁(yè)的運(yùn)行環(huán)境(操作系統(tǒng)和瀏覽器),所有的BOM和DOM都是宿主對(duì)象。
宿主環(huán)境提供的全局方法:
alert、confirm、prompt、write、writeln(后面的兩種是document的方法)
內(nèi)置對(duì)象是本地對(duì)象的一種,本地對(duì)象時(shí)由官方定義的,而宿主對(duì)象相當(dāng)于由自己定義的對(duì)象、DOM對(duì)象和BOM對(duì)象組成的

35、請(qǐng)解釋一下變量聲明提升?

a、變量定義
可以使用var定義變量,變量如果沒有賦值,那變量的初始值為undefined。
b、變量作用域
變量作用域指變量起作用的范圍。變量分為全局變量和局部變量。全局變量在全局都擁有定義;而局部變量只能在函數(shù)內(nèi)有效。
在函數(shù)體內(nèi),同名的局部變量或者參數(shù)的優(yōu)先級(jí)會(huì)高于全局變量。也就是說,如果函數(shù)內(nèi)存在和全局變量同名的局部變量或者參數(shù),那么全局變量將會(huì)被局部變量覆蓋。
所有不使用var定義的變量都視為全局變量。

博客數(shù)據(jù)來源聲明:
本博客大部分?jǐn)?shù)據(jù)來源于各大網(wǎng)站的收集整理改編,主要有GitHub(https://github.com)、題來了(http://www.tilaile.com)、??途W(wǎng)(https://www.nowcoder.com)、一些英文網(wǎng)站,還有一些論壇、博客、IT招聘等網(wǎng)站。還有少部分?jǐn)?shù)據(jù)時(shí)來源于本人自己整理添加,添加的內(nèi)容主要是本人認(rèn)為比較重要知識(shí)點(diǎn),面試時(shí)可能會(huì)問到的題目,自己整理題目以及參考答案,答案僅供參考,答案可能存有錯(cuò)誤或不足,歡迎大家批評(píng)指正或補(bǔ)充更好的答案。好讓我及時(shí)更正,以免誤導(dǎo)其他人。本博客僅提供參考作用。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論