1. 程式人生 > >javascript面試題(二)

javascript面試題(二)

test .text 繼續 更改 object value 循環數組 name屬性 undefine

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面試題(二)