看看國外的javascript題目,你能全部做對嗎?

來源:互聯網
上載者:User
葉小釵 的部落格最近都在討論面試題目

正好以前也看過一篇,就借花獻佛拿出來分享一下 http://perfectionkills.com/javascript-quiz/

附帶了自己的理解,答案有爭議的地方歡迎大家指出

題目一
(function(){   return typeof arguments; })(); 
 答案"object"
arguments是對象,偽數組有兩件事要注意這裡:
參數不是數組,它是一個數組一樣的物體,你可以使用方括弧和整數索引的元素,但方法通常可在一個如推上不存在參數數組
Array.prototype.slice.call(arguments); 轉成數組
當然arguments即使是數組,返回的依然是"object",因為數組也是對象,附加:typeof 對類型的判斷
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof題目二
var f = function g(){ return 23; }; typeof g();
答案會發生錯誤
因為function g(){ return 23; }是函數運算式,事實上只有事一個名字,不是一個函式宣告
函數實際上是綁定到變數f,不是g.
指定的標識符在函數運算式雖然有其用途:堆疊追蹤是清晰而不是充斥著無名的函數,你可以有一個匿名函數遞迴調用本身不使用argument.callee
附非常詳細的文章函數運算式
http://kangax.github.io/nfe/題目三
(function(x){   delete x;   return x; })(1); 
 答案1
參數不可刪除
見我發過的文章(js中的delete定義)
http://www.cnblogs.com/aaronjs/articles/3148934.html
國外的文章(理解刪除)
http://perfectionkills.com/understanding-delete/題目四
var y = 1, x = y = typeof x; x; 
 答案 "undefined"
通過重寫代碼如下結果:
var a, b; 展開就是 var a; var b;.
A = B = C;相當於 B = C = B;

知道了這一點,我們重寫並得到:
var y = 1;
y = typeof x;
var x = y;
x;

當執行
y = typeof x時,x 還沒有被定義,所以y成為字串"undefined",然後被分配到x題目五

(function f(f){   return typeof f(); })(function(){ return 1; }); 
 答案 "number"
為了便於理解我們繼續分解:

第一部分
var baz = function(){ return 1; };

第二部分
(function f(f){
  return typeof f();
})(baz);

在這裡,函數f接受一個參數是另一個函數,f函數內部執行這個實參函數並且傳回型別
無論是從調用該函數返回,即使參數名稱f與函數名衝突,函數接受本身作為自己的參數,然後調用,此時就看誰更具有更高的優先順序了,顯然,參數的優先順序更高,所以實際執行的是return typeof 1
題目六

var foo = {    bar: function() { return this.baz; },    baz: 1 }; (function(){    return typeof arguments[0](); })(foo.bar);

答案 "undefined"為什麼是"undefined"?.我們必須要知道this運算子是怎麼工作的.JS語言精粹總結的很精鍊:1 純粹的函數調用2 作為對象方法的調用3 作為建構函式調用4 apply調用我們看看題目是屬於那種環境?在arguments[0]()中執行了一個方法,arguments[0]就是foo.bar方法注意:這在foo.bar中的this是沒有綁定到foo雖然 foo.bar 傳遞給了函數,但是真正執行的時候,函數 bar 的上下文環境是 arguments ,並不是 fooarguemnts[0] 可以理解為 arguments.0(不過寫代碼就不要這樣了,文法會錯誤的),所以這樣看來,上下文環境是 arguemnts 就沒問題了,所以在執行baz的時候自然this就是window了,window 上沒有baz屬性,返回的就是undefined, typeof調用的話就轉換成"undefined"了附上博文http://www.cnblogs.com/aaronjs/archive/2011/09/02/2164009.htmlMDChttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/this_Operator#Description
題目七
var foo = {   bar: function(){ return this.baz; },   baz: 1 } typeof (f = foo.bar)();
答案  "undefined"繼續改寫一下:var foo = {   bar: function(){ return this.baz; },   baz: 1 } f = foo.bar; typeof f();把foo.bar儲存給f然後調用,所以this在foo.bar引用的是全域對象,所以就沒有baz屬性了換句話說foo.bar執行的時候上下文是 foo,但是當 把 foo.bar 賦值給 f 的時候,f 的上下文環境是 window ,是沒有 baz 的,所以是 ”undefined"
 
題目八
var f = (function f(){ return "1"; }, function g(){ return 2; })(); typeof f;
答案 "number"逗號操作符的使用可以很混淆,但這段說明它的行為:var x = (1, 2, 3); x; x的值是3,這表明,當你有一系列的組合在一起,並由逗號分隔的運算式,它們從左至右進行計算,但只有最後一個運算式的結果儲存。由於同樣的原因,這個問題可以改寫為減少混亂:var f = (function g(){ return 2; })(); typeof f; 關於逗號運算式:原文:http://www.2ality.com/2012/09/expressions-vs-statements.html譯文:http://www.cnblogs.com/ziyunfei/archive/2012/09/16/2687589.html

 

題目九
var x = 1; if (function f(){}) {   x += typeof f; } x;
答案 "1undefined"這裡有個痛點if 中的 function f(){} 要如何處理?函式宣告的實際規則如下:函式宣告只能出現在程式或函數體內。從句法上講,它們 不能出現在Block(塊)({ ... })中,例如不能出現在 if、while 或 for 語句中。因為 Block(塊) 中只能包含Statement語句, 而不能包含函式宣告這樣的源元素。另一方面,仔細看一看規則也會發現,唯一可能讓運算式出現在Block(塊)中情形,就是讓它作為運算式語句的一部分。但是,規範明確規定了運算式語句不能以關鍵字function開頭。而這實際上就是說,函數運算式同樣也不能出現在Statement語句或Block(塊)中(因為Block(塊)就是由Statement語句構成的)。 假設代碼我們不妨變一下:var x = 1;if (function(){}) {   x += typeof f; } x; var x = 1; x += typeof f; x; f在這了沒有被定義,所以typeof f 是字串"undefined" ,字元與數字相加結果也是一個字串,所以最後的x就是"1undefined"了

題目十

(function f(){   function f(){ return 1; }   return f();   function f(){ return 2; } })();
答案 2如果是一直看下來的話,這個題目應該是比較簡單簡單的來說在執行return之前,函式宣告會在任何錶達式被解析和求值之前先被解析和求值,即使你的聲明在代碼的最後一行,它也會在同範圍內第一個運算式之前被解析/求值,參考如下例子,函數fn是在alert之後聲明的,但是在alert執行的時候,fn已經有定義了 alert(fn());  function fn() {    return 'Hello world!';  }所以題目中函數提升了兩次,第二次把第一次覆蓋了,所以 return 後面的 f 是 return 語句的下一條語句聲明的函數 f 。注意自執行函數 (function f (){})(); 中的 f 並沒有函數提升效果,它是運算式
題目十一
function f(){ return f; } new f() instanceof f;
答案 false怎樣去理解? new f()  首先這個操作會建立一個新對象並調用建構函式函數這一新的對象作為它的當前內容物件簡單的說 new f();依稀記得進階程式設計裡面是這麼說的:1 建立Null 物件。2 將類的prototype中的屬性和方法複製到執行個體中。3 將第一步建立的Null 物件做為類的參數調用類的建構函式預設如果沒有覆蓋這個Null 物件的話,返回thisvar a = new Object;a instanceof Object    為 true我們在看 f() 返回了 return f;那麼也就是說這個新的對象是是自身,建構函式本身在 new 的過程中會返回一個表示該對象的執行個體。但是函數的傳回值覆蓋了這個執行個體,這個new 就形同虛設果f的形式為 function f(){return this}或function f(){}就不一樣var a = new f();a instanceof f  // false值得注意的是 instanceof  檢測的是原型又附上我部落格的 JS 對象機制深剖——new 運算子 http://www.cnblogs.com/aaronjs/archive/2012/07/04/2575570.html
題目十二
  var x = [typeof x, typeof y][1];  typeof typeof x;

答案

這題目比較簡單,注意下傳回型別即可x = [,][1];即 x = typeof y = 'undefind'.typeof 返回的是string類型就可以了 typeof typeof必然就是'string'了.

View Code題目十三

function(foo){   return typeof foo.bar; })({ foo: { bar: 1 } });
答案 "undefined"又是一個噁心的題目,純文字遊戲,大家看仔細看先分解一下var baz = { foo: { bar: 1 } }; (function(foo){   return typeof foo.bar; })(baz); 去掉函數關聯var baz = { foo: { bar: 1 } }; var foo = baz; typeof foo.bar; 最後,通過替代我們除去中間變數foovar baz = { foo: { bar: 1 } }; typeof baz.bar; 所以現在就很清晰了,屬性中沒有定義baz;它被定義為baz.foo上了,所以結果是:”undefined"
題目十四
with (function(x, undefined){}) length;
答案 2with用得很少,with 語句就是用於暫修改範圍鏈的或者通常用來縮短特定情形下必須寫的代碼量使用with語句的JavaScript代碼很難最佳化,因此它的運算速度比不使用with語句的等價代碼要慢得多。而且,在with語句中的函數定義和變數初始化可能會產生令人驚訝的、相抵觸的行為,因此我們避免使用with語句with的用法是這樣的:with(object) {},在大括弧裡面,可以引用object的屬性而不用使用object.attr這種形式。這道題裡面,with接受了一個對象,只不過這個對象是函數,函數有length屬性,代表形參的個數,所以上面返回的值是2mozilla withhttp://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Statements:with

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.