javascript面試題(二)
24.
function foo() { } var oldName = foo.name; foo.name = "bar"; [oldName, foo.name]
// [foo,foo]
函數實例會有一個內置的name屬性,這個函數使只讀的不可修改,所以兩個都是foo
25.
var ary = Array(3); ary[0]=2; ary.map(function(elem) { return ‘1‘; });
// logs [1, , ]
設置一個空數組var ary = [ , , , ],然後更改ary裏的索引為0 的數為2,則為ary = [2, , ],然後用數組方法map循環數組,返回1,map循環時只會循環有數據的內容,所以只會把2改為1,當後面為空時,map不會繼續執行.
26
[1 < 2 < 3, 3 < 2 < 1]
//logs[true,true]
true 1; false -1
數據運算會按順序運算,1<2<3,運算時,先比比較1<2,然後返回true,true和3比較,true轉換為數組類型,為1,1<3所以為true
3<2<1,先比較3<2,返回false,然後false和1比較,會轉換為數據類型,false轉化為-1,-1<1所以返回true
27.
var a = 111111111111111110000, b = 1111; a + b;//
111111111111111110000;
js中數值的取值範圍為-2^53-2^53,a的範圍已經超過了2^53,超過最大值,和其他數做加減法,都為這個最大值
28
var val = ‘c‘; var str = ‘Value is‘ + (val === ‘c‘) ? ‘a‘:‘b‘; console.log(str); // a;
這道題考得是運算的先後順序,先運算 val === "c",返回true,然後 + 的運算符大於其他運算符,,即最後的結果Value is true? ‘a‘ : ‘b‘;,布爾值為true,所以返回a
29.
var a = /123/, b = /123/; console.log(a == b); //false console.log(a === b); //false
/123/是一個正則表達式,所以比較的是兩個的引用地址,a和b顯然不同,所以返回false
第二個 === 全等比較,與第一個相似,所以說地址不同返回仍為false
30
var lowerCase = /^[a-z]+$/; [lowerCase.test(null), lowerCase.test()]
//logs [true , true ]
lowerCase.text(null)的內容為null,null轉為字符串"null",以n開頭,符合正則表達式,所以為true
lowerCase.text()的內容為undefined,轉為字符串"undefined",以u開頭,符合正則表達式,所以為true
31
[typeof null, null instanceof Object]
//logs [object , false ]
typeof會返回簡單的數據類型,null會返回object
instanceof是基於原型鏈的比較,null並不是object原型上創建出來的,null._propto_最終指向null,所以會返回false
32
var ary = [0,1,2]; ary[10] = 10; ary.filter(function(x) { return x === undefined; });
//logs []
filter的意思是過濾掉通過函數的元素,然後返回未通過的數據,這道題,ary = [0,1,3];然後添加了ary[10] = 10;添加後的數組變為了ary = [0,1,2,empty*7,10],過濾條件為x=undefined,所以會把數組全部過濾掉,剩下的只有空數組,所以結果為[];
33
var ary = Array(3); ary[0] = 2; ary.map(function(elem) { return ‘1‘; });
// logs [1, , ]
這題考的是map,創建一數組,ary= [ , , ];然後給ary[0] = 2,數組變為ary= [2 , , ],map循環時,只會循環有索引且賦值的數據,而且會按原來的順序依次進行,當循環完ary[0]後不會繼續循環,所以返回的數據為ary =[1,empty*2]
34
function effect(ary) { ary[0] = ary[2]; } function run(a,b,c) { c = 10; effect(arguments); return a + b + c; } run(1,1,1);
//logs [21]
在非嚴格模式下,arguments的值會跟蹤參數的值,無論修改arguments[i]本身還是修改的響應的參數本身,兩個值都會同步,所以當調用run時,數組為ary= [1,1,10];當執行到effect時,把ary[2]的值賦值給ary[0],
即數組變為ary = [10,1,10]相加為10+10+1=21;但是在嚴格模式下arguments參數的值不會跟蹤參數的值,ary = [1,1,10].最後的結果為1+1+10=12
35
var min = Math.min(); var max = Math.max(); min < max
// logs false
Math.min()如果傳入數組就會返回數組中的最小值;
Math.max()如果傳入數組就會返回數組的最大值;
但是如果比較非數字時會自動轉化toString或value of方法為字符串後比較,如果不傳數組的話,Math.min()會出現infinite(無窮大),Math,max()會出現(-infinite)即無窮小,所以Math.min()>Math.max();
36
function foo(a) { var a; return a; } function bar(a) { var a = ‘bye‘; return a; } [foo(‘hello‘), bar(‘hello‘)]
// logs [hellow, bye ]
函數提升,會轉化成如下效果
function foo (a) { return a; } function bar(a) { a = ‘bye‘; return a; } [foo(‘hellow‘),bar(‘hellow‘)]
var申明提升,所以var a = undefined;參數會賦值給a,bar()時,修改了a的值所以為‘bye‘,所以最後返回 [‘hellow‘,‘bye‘]
37
function f() {} var a = f.prototype; var b = Object.getPrototypeOf(f); a === b
// logs false
函數的原型與它的prototype無關,所以互不相等
javascript面試題(二)