1. 程式人生 > >一些有趣的js面試題解析

一些有趣的js面試題解析

參考地址:http://javascript-puzzlers.herokuapp.com/

1. ["1", "2", "3"].map(parseInt)

返回值為[1, NaN, NaN] .因為parseInt接受兩個引數,即parseInt('1', 0), parseInt('2', 1),parseInt('3', 2)

2.[typeof null, null instanceof Object]

返回值["object", false]。

在JavaScript的實現中,JavaScript值被表示為型別標記和值。物件的型別標記為0。null被表示為空指標(在大多數平臺中是0x00)。因此,null的型別標記為0,因此返回值的偽型別。

而instanceof查的是null的prototype屬性,但是它沒有。

3.[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ]

返回值an error,因為reduce歸併的陣列必須大於等於1

4.var val = 'smtg';  console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');

返回值 'Something'。考察的是運算子的優先順序

第一步執行小括號裡的(val === 'smtg'),即 console.log('Value is ' + true ? 'Something' : 'Nothing');

第二步執行字串拼接,即  console.log('Value is true'  ? 'Something' : 'Nothing');-- 三目運算子的優先順序比較低

5.var name = 'World!';

(function () {

    if (typeof name === 'undefined')

       { var name = 'Jack'; console.log('Goodbye ' + name); }

   else { console.log('Hello ' + name); }

})();

執行結果:’Goodbye Jack‘,自執行函式是一個區域性作用域,於是 name會在區域性進行宣告提升,即

var name = 'World!';

(function () {

     var name

    if (typeof name === 'undefined')

       { name = 'Jack'; console.log('Goodbye ' + name); }

   else { console.log('Hello ' + name); }

})();

6.var END = Math.pow(2, 53);

var START = END - 100; var count = 0; for (var i = START; i <= END; i++) { count++; }

console.log(count);

執行結果是死迴圈,應該JavaScript最大的整數為Math.pow(2, 53);,也就是說i 迴圈100次後會一直等於Math.pow(2, 53);

條件i <= END恆成立

7.var ary = [0,1,2]; ary[10] = 10; ary.filter(function(x) { return x === undefined;});

返回值為[],因為filter會自動過濾陣列中不存在的項,連函式也不呼叫(注意如果項存在,值為undefined是不會過濾的)。

8.var two = 0.2 var one = 0.1 var eight = 0.8 var six = 0.6

[two - one == one, eight - six == two]

執行結果[true, false]因為JavaScript在執行小數運算的時候,有時會丟失精度。

9.function showCase(value) {

    switch(value) {

       case 'A': console.log('Case A'); break;

       case 'B': console.log('Case B'); break;

       case undefined: console.log('undefined'); break;

       default: console.log('Do not know!');

      }

}

showCase(new String('A'));

執行結果'Do not know!',因為new String('A')是一個字串物件,而switch進行的是===比較,不會發生型別轉換。

10.function showCase(value) {

    switch(value) {

       case 'A': console.log('Case A'); break;

       case 'B': console.log('Case B'); break;

       case undefined: console.log('undefined'); break;

       default: console.log('Do not know!');

      }

}

showCase(new String('A'));

執行結果:Case A,因為少了關鍵字new,只是簡單的轉換為字串。

11.function isOdd(num) { return num % 2 == 1; }

    function isEven(num) { return num % 2 == 0; }

    function isSane(num) { return isEven(num) || isOdd(num); }

    var values = [7, 4, '13', -9, Infinity]; values.map(isSane);

執行結果:[true, true, true, false, false]。本質上就是判斷一個數是正整數。-9 % 2 = -1; 與0或1都不想等。Infinity與任何數取餘數都是NaN。

12.parseInt(3, 8) parseInt(3, 2) parseInt(3, 0)

執行結果是:3 NaN 3.第三個是因為傳0預設10進位制了

13.Array.isArray( Array.prototype )

執行結果為true,在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype中Array.prototype本身是一個數組

14.var a = [0]; if ([0]) { console.log(a == true); } else { console.log("wut"); }

執行結果為:false 首先[0]是一個物件,於是在if判斷時為true。然後a == true => '0' == true => 0 == 1

15.[]==[]

執行結果: false,當等式兩邊都是物件時,是比較引用空間是否一致,== 與=== 效果一致,不會發生型別轉換

16. '5' + 3

      '5' - 3

執行結果: ‘53’,2

17. 1 + - + + + - + 1

執行結果:2.  應該操作符中間有空格,運算子當成0來處理了,於是 1 + 0 - 0 + 0 +0 + 0 - 0 + 1

18. var ary = Array(3); ary[0]=2 ary.map(function(elem) { return '1'; });

執行結果:[2, empty * 2] 因為 map會返回同長度的陣列

19. function sidEffecting(ary) { ary[0] = ary[2]; }

function bar(a,b,c) { c = 10 sidEffecting(arguments); return a + b + c; }

bar(1,1,1)

執行結果: 21

20.var a = 111111111111111110000, b = 1111; a + b;

執行結果:111111111111111110000,這個是整數的最大值,加一個正整數還是它本身

21.var x = [].reverse; x();

執行結果:error , ?? 以前給的答案是window。和其他函式直接在瀏覽器中呼叫沒有區別。

22. Number.MIN_VALUE > 0

執行結果:true  因為Number.MIN_VALUE是大於0的最小數

23. [1 < 2 < 3, 3 < 2 < 1]

執行結果:[true, true] .  => [true < 3, false < 1]

 

24. 2 == [[[2]]]

執行結果: true => 2 == '2'

25.    3.toString() 3..toString() 3...toString()

執行結果: error, "3", error  ??

26.   (function(){ var x = y = 1; })(); console.log(y); console.log(x);

執行結果: 1 error   因為:

var y

 (function(){ y = 1;var x = y ; })();

console.log(y); console.log(x);

27. var a = /123/, b = /123/; a == b a === b

執行結果: false false   因為:正則表示式是一個物件

28.  var a = [1, 2, 3], b = [1, 2, 3], c = [1, 2, 4]

a == b

a === b

a > c

a < c

執行結果:false, false, false, true   因為:前兩個比較是物件比較,後面陣列比大小是按照字元比較

29. var a = {}, b = Object.prototype;

[a.prototype === b, Object.getPrototypeOf(a) === b]

執行結果:[false, true]  因為:a.prototype 值為undefined, 後者是獲取a的原型為Object.prototype;

30.   function f() {}

var a = f.prototype, b = Object.getPrototypeOf(f);

a === b

執行結果:false  因為:Object.getPrototypeOf(f); 獲取的是f建構函式上的prototype屬性

31. function foo() { }

var oldName = foo.name; foo.name = "bar";

[oldName, foo.name]

執行結果:["foo", "foo"]因為:函式的名字不可修改,但修改也不會報錯

32."1 2 3".replace(/\d/g, parseInt)

執行結果:"1 NaN 3" 。執行一下 "1 2 3".replace(/\d/g, console.log) 就知道了

33.  function f() {}

       var parent = Object.getPrototypeOf(f);

       f.name // ?

       parent.name // ?

      typeof eval(f.name) // ?

      typeof eval(parent.name) // ?

執行結果:"f"  ""  "function"  "undefined"

34. var lowerCaseOnly = /^[a-z]+$/;

[lowerCaseOnly.test(null), lowerCaseOnly.test()]

執行結果:[true, true] => [lowerCaseOnly.test(‘null’), lowerCaseOnly.test('undefined')]

35. [,,,].join(", ")

執行結果:", ,"

36. var a = {class: "Animal", name: 'Fido'};

a.class

執行結果:chrom下為"Animal",ie可能不同

37. var a = new Date("epoch")

執行結果: Invalid Date。 引數是無效的,必須是一個數字

38. var a = Function.length,

      b = new Function().length

      a === b

執行結果: false 因為函式.length,得到是函式的形參。Function.length為1,(new Function()).length => (function f(){}; f.lenght)形參為0

39. var a = Date(0);

var b = new Date(0);

var c = new Date();

[a === b, b === c, a === c]

執行結果:[false, false, false] 第一個返回當前時間的字串,第二個返回起始時間物件,第三個返回當前時間物件。

40. var min = Math.min(), max = Math.max()

     min < max

執行結果:false,因為Math.min returns +Infinity,Math.max returns -Infinity.

41.  var match = re.exec(str); return match && match[1]; }

var numRe = /num=(\d+)/ig, wordRe = /word=(\w+)/i,

a1 = captureOne(numRe, "num=1"),

a2 = captureOne(wordRe, "word=1"),

a3 = captureOne(numRe, "NUM=2"),

a4 = captureOne(wordRe, "WORD=2");

[a1 === a2, a3 === a4]

執行結果:[true, false]

42. var a = new Date("2014-03-19"),

     b = new Date(2014, 03, 19);

    [a.getDay() === b.getDay(), a.getMonth() === b.getMonth()]

執行結果:[false, false] 因為:a => Wed Mar 19 2014 08:00:00 GMT+0800 (中國標準時間)  b => Sat Apr 19 2014 00:00:00 GMT+0800 (中國標準時間)

43. if ('http://giftwrapped.com/picture.jpg'.match('.gif'))

           { 'a gif file' }

      else { 'not a gif file' }

執行結果:'a gif file' 因為.被當成了元字元

44. function foo(a) { var a; return a; }

     function bar(a) { var a = 'bye'; return a; }

      [foo('hello'), bar('hello')]

執行結果:["hello", "bye"]