一些有趣的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"]