標籤:end native rip 帕斯卡 operator 傳遞 組織 inter oba
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questions.md
最近將持續翻譯JavaScript面試題,希望對各位有所協助。
(文章中斜體字部分為譯者添加)
目錄:
Part 1(事件委託/this關鍵字/原型鏈/AMD與CommonJS/自執行函數)
Part 2 (null與undefined/閉包/foreach與map/匿名函數/程式碼群組織)
Part 3 (宿主對象與原生對象/函數調用方式/call與apply/bind/document.write)
1、宿主對象與原生對象有何區別?
原生對象是指JavaScript中按照ECMAScript規範進行定義的對象,比如:String,Math,RegExp,Object,Function等等。
宿主對象是指由JavaScript的運行環境(瀏覽器或者是node)提供的對象,比如window,XMLHTTPRequest等等。
引用文檔:
https://stackoverflow.com/questions/7614317/what-is-the-difference-between-native-objects-and-host-objects
2、以下函數調用方式有何不同:function Person(){},var person = Person(),以及var person = new Person()
這個問題讓人相當困惑。我猜測這道題主要是要考JavaScript中的建構函式。從技術上講,function Person(){} 只是一個普通的函式宣告。通常我們使用帕斯卡命名法來給建構函式命名。
var person = Person() 這種只是把Person作為一個函數來調用,而不是一個構造器。想用這種方式來將函數作為構造器調用是一種非常常見的錯誤。一般來說,構造器沒有任何傳回值。因此,如果把一個構造器當成一個普通函數來調用,並且把傳回值賦值給一個變數,那麼值會是undefined。
var person = new Person() 通過new操作符來建立一個Person對象的執行個體,並且繼承了Person.prototype屬性。也可以通過Object.create來建立執行個體,比如 Obejct.create(Person.prototype).
1 function Person(name) { 2 this.name = name; 3 } 4 5 var person = Person(‘John‘); 6 console.log(person); // undefined 7 console.log(person.name); // Uncaught TypeError: Cannot read property ‘name‘ of undefined 8 9 var person = new Person(‘John‘);10 console.log(person); // Person { name: "John" }11 console.log(person.name); // "john"
引用文檔:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
3、call與apply有什麼區別?
call與apply都可以用來調用一個函數,第一個傳入的參數是函數內部this對象。call方法的後面的參數是使用逗號進行分隔區分,apply是用的數組。速記方法:C 是call方法逗號(comma)分隔,A是apply數組(array)分隔。
1 function add(a, b) {2 return a + b;3 }4 5 console.log(add.call(null, 1, 2)); // 36 console.log(add.apply(null, [1, 2])); // 3
4、Function.prototype.bind 有何作用
引用MDN的原文解釋:
bind()方法建立一個新的函數, 當被調用時,將其this關鍵字設定為提供的值,在調用新函數時,在任何提供之前提供一個給定的參數序列。
以我的經驗來看,它最大的作用就是當需要傳遞一個函數作為其他函數的入參是,它可以Binder 方法中的this值。最常用的就是React中的組件。
引用文檔:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
5、何時使用document.write()
document.write()會向document.open()開啟的文檔流中寫入一段字串文本。如果document.write()調用時文檔已經載入了,那麼他會調用document.open方法來清除怎麼文檔(<head>與<body>標籤內的內容都將被移除),然後用傳入的字串替換整個內容區。因此在使用的時候要謹慎考慮,以免出錯。
網上也有一些關於document.write的其他用法,比如用在程式碼分析,或者在一個只能使用JavaScript的環境中引入樣式。它也被經常用到HTML5模板檔案中來並行載入指令檔,保持代碼執行順序。不過對於這些觀點我仍然不太贊同,因為在現代化的今天,我們有更多更好的方法來替換document.write()。
引用文檔:
https://www.quirksmode.org/blog/archives/2005/06/three_javascrip_1.html
https://github.com/h5bp/html5-boilerplate/wiki/Script-Loading-Techniques#documentwrite-script-tag
前端JS面試題匯總 Part 3 (宿主對象與原生對象/函數調用方式/call與apply/bind/document.write)