中級JavaScript 思維面試題(一)

答案解析在底部

1、 問:下面的代碼會打印什麼 ? 爲什麼?

window.a || (window.a ='1');
console.log(window.a);

2、 問:下面的代碼會打印什麼 ? 爲什麼?

var a = false + 1 ;
console.log(a);

3、 問:下面的代碼會打印什麼 ? 爲什麼?

var b = false === 1;
console.log(b);

4、 問:下面的代碼會打印什麼結果 ? 爲什麼?

if (typeof(a) && (-true) + (+undefined) + '') {
  console.log('結果爲真');
}else{
  console.log('結果爲假');
}

5、 問:下面的代碼會打印什麼結果 ? 爲什麼?

var a = !!'' + !!' ' - !!false + '1' || '結果爲假';
console.log(a);

6、 問:下面的代碼會打印什麼結果 ? 爲什麼?

var fn = (
  function fn1() {
    return 1;
  },
  function fn2() {
    return 2;
  }
)();
console.log(fn);

7、 問:下面的代碼會打印什麼結果 ? 爲什麼?

var a = 10;
if (function b() {}) {
  a += typeof b;
}
console.log(a);

8、問: 下面幾項會輸出什麼結果? 爲什麼?

function fn() {
  var marty = {
    name: 'marty',
    printName: function () {
      console.log(this.name);
    }
  }
  var test1 = {
    name: 'test1'
  }
  var test2 = {
    name: 'test2'
  }
  var test3 = {
    name: 'test3'
  }
  test3.printName = marty.printName;
  marty.printName.call(test1);//      1:
  marty.printName.apply(test2);//     2:
  marty.printName();//                3:
  test3.printName();//                4:
}

fn();

9、 問:下面的代碼會打印什麼結果 ? 爲什麼?

var bar = {
  a: '1'
}

function fn() {
  bar.a = 'a';
  Object.prototype.b = 'b';
  return function () {
    console.log(bar.a);
    console.log(bar.b);
  }
}

fn()();

  • 1 、答案:“1”

    解析:原理在於小括號的優先級高於其他運算符, 所以先賦值 window.a='1' 然後在進行或運算。

  • 2、答案:1

    解析:隱式類型轉換 false 爲 0 ,0 + 1 結果爲1

  • 3、答案:false

    解析:隱式類型轉換false 爲 0

  • 4、答案:結果爲真

    解析:typeof(a) 爲 “undefined” ,隱式類型轉換 (-true) 爲 -1 ,(+undefined) 爲 NaN 。-1 + NaN + '' = “NaN” , 所以結果爲真

  • 5、答案:“11”

    解析:隱式類型轉換 !!'' 爲 0 , !!' ' 字符串空格爲 1 , !!false 爲 0 , '1' , 1 + “1” =“11”
    注意:對字符串和數字進行加法運算,數字轉成字符串!

  • 6、答案:2

    解析:逗號作爲運算符使用, 結果爲最後一個fn2() 。立即執行fn2()輸出返回結果

  • 7、答案:“10undefined”

    解析:(function b() {}) 是作爲表達式使用,直接忽略掉函數名 。所以b 是一個未定義的狀態

  • 8、答案:test1 test2 marty test3

    解析:這是一個this指向的問題:1、2 分別被 call()、apply() 改變了this的指向 3 、正常調用對象方法。4、將方法賦值給test3調用this指向test3

  • 9、答案:a b

    解析:這裏形成了一個閉包 返回一個函數 , fn() 調用時修改bar.a的值。bar.b 在原型鏈上尋找到頂級Object.prototype的時候獲得 b值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章