好程序員Java教程分享JavaScript常見面試題一

 好程序員Java教程分享JavaScript常見面試題一

創(chuàng)新互聯(lián)建站服務項目包括新和網(wǎng)站建設、新和網(wǎng)站制作、新和網(wǎng)頁制作以及新和網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,新和網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到新和省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

 好程序員Java教程分享JavaScript常見面試題一:1.使用?typeof bar === "object"?來確定?bar?是否是對象的潛在陷阱是什么?如何避免這個陷阱?

 

 盡管?typeof bar === "object"?是檢查?bar?是否對象的可靠方法,令人驚訝的是在JavaScript中?null?也被認為是對象!

 

 因此,令大多數(shù)開發(fā)人員驚訝的是,下面的代碼將輸出?true (而不是false)?到控制臺:

 var bar = null;console.log(typeof bar === "object"); // logs true!

 只要清楚這一點,同時檢查?bar?是否為?null,就可以很容易地避免問題:

 console.log((bar !== null) && (typeof bar === "object")); // logs false

 要答全問題,還有其他兩件事情值得注意:

 

 首先,上述解決方案將返回?false,當?bar?是一個函數(shù)的時候。在大多數(shù)情況下,這是期望行為,但當你也想對函數(shù)返回?true?的話,你可以修改上面的解決方案為:

 

 console.log((bar !== null) && ((typeof bar === "object") || (typeof bar === "function")));

 第二,上述解決方案將返回?true,當?bar?是一個數(shù)組(例如,當?var bar = [];)的時候。在大多數(shù)情況下,這是期望行為,因為數(shù)組是真正的對象,但當你也想對數(shù)組返回?false?時,你可以修改上面的解決方案為:

 console.log((bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]"));

 或者,如果你使用jQuery的話:

 console.log((bar !== null) && (typeof bar === "object") && (! $.isArray(bar)));

 

 2.下面的代碼將輸出什么到控制臺,為什么?

 (function(){ var a = b = 3;

 })(); console.log("a defined? " + (typeof a !== 'undefined'));console.log("b defined? " + (typeof b !== 'undefined'));

 由于?a?和?b?都定義在函數(shù)的封閉范圍內,并且都始于?var關鍵字,大多數(shù)JavaScript開發(fā)人員期望?typeof a?和?typeof b?在上面的例子中都是undefined。

 然而,事實并非如此。這里的問題是,大多數(shù)開發(fā)人員將語句?var a = b = 3;?錯誤地理解為是以下聲明的簡寫:

 var b = 3;var a = b;

 但事實上,var a = b = 3;?實際是以下聲明的簡寫:

 b = 3;var a = b;

 因此(如果你不使用嚴格模式的話),該代碼段的輸出是:

 a defined? falseb defined? true

 但是,?b?如何才能被定義在封閉函數(shù)的范圍之外呢?是的,既然語句?var a = b = 3;?是語句?b = 3;?和?var a = b;的簡寫,?b?最終成為了一個全局變量(因為它沒有前綴?var?關鍵字),因此仍然在范圍內甚至封閉函數(shù)之外。

 需要注意的是,在嚴格模式下(即使用?use strict),語句var a = b = 3;?將生成ReferenceError: b is not defined的運行時錯誤,從而避免任何否則可能會導致的headfakes /bug。?(還是你為什么應該理所當然地在代碼中使用?use strict?的最好例子!)

 

 3.下面的代碼將輸出什么到控制臺,為什么?

 var myObject = {

 foo: "bar",};

 myObject.func();

 上面的代碼將輸出以下內容到控制臺:

 outer func: this.foo = bar

 outer func: self.foo = bar

 inner func: this.foo = undefined

 inner func: self.foo = bar

 在外部函數(shù)中,?this?和self?兩者都指向了?myObject,因此兩者都可以正確地引用和訪問?foo。

 在內部函數(shù)中,?this?不再指向?myObject。其結果是,this.foo?沒有在內部函數(shù)中被定義,相反,指向到本地的變量self?保持在范圍內,并且可以訪問。?(在ECMA 5之前,在內部函數(shù)中的this?將指向全局的?window?對象;反之,因為作為ECMA 5,內部函數(shù)中的功能this?是未定義的。)

 

 4.封裝JavaScript源文件的全部內容到一個函數(shù)塊有什么意義及理由?

 這是一個越來越普遍的做法,被許多流行的JavaScript庫(jQuery,Node.js等)采用。這種技術創(chuàng)建了一個圍繞文件全部內容的閉包,也許是最重要的是,創(chuàng)建了一個私有的命名空間,從而有助于避免不同JavaScript模塊和庫之間潛在的名稱沖突。

 這種技術的另一個特點是,允許一個易于引用的(假設更短的)別名用于全局變量。這通常用于,例如,jQuery插件中。jQuery允許你使用jQuery.noConflict(),來禁用?$?引用到jQuery命名空間。在完成這項工作之后,你的代碼仍然可以使用$?利用這種閉包技術,如下所示:

 (function($) { /* jQuery plugin code referencing $ */ } )(jQuery);

文章名稱:好程序員Java教程分享JavaScript常見面試題一
路徑分享:http://bm7419.com/article36/jdedpg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司企業(yè)網(wǎng)站制作、移動網(wǎng)站建設、網(wǎng)站收錄、外貿網(wǎng)站建設、響應式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管