中級JavaScript 思維面試題(二)

1、 問:下面代碼結果是什麼? 爲什麼?

  console.log({} == {});

答案:false
問:如何讓它相等呢?

解析:引用值對比的是地址,兩個空對象創建了不同的存儲地址。所以不相等。 創建一個空對象賦值給 obj1, obj2 == obj1 。

  var obj1 = {};
  obj2 = obj1;
  console.log(obj2 == obj1);

2、 問:下面的代碼會輸出什麼 ? 爲什麼?

var x = 1,
    y = z = 0;

  function add(n) {
    return n = n + 1;
  }

  y = add(x);

  function add(n) {
    return n = n + 3;
  }

  z = add(x);
  console.log(x, y, z);

答案:1 4 4

解析:預編譯 global object 1 變量聲明 2 方法定義 3 解釋一行執行一行 。 在預編譯時方檢查提升到最頂部 add() 會被替換


3、 問:下面的代碼會輸出什麼 ? 爲什麼?

  function Test(a, b, c) {
    var d = 1;
    this.a = a;
    this.b = b;
    this.c = c;

    function f() {
      d++;
      console.log(d);
    }

    this.g = f;
  }

  var test1 = new Test();
  test1.g();
  test1.g();
  var test2 = new Test();
  test2.g();

答案:2 3 2

解析:構造函數實例化形成閉包, 所以 d 在一次實例化會保存。 二次實例化重新賦值


4、 問:下面的代碼會輸出什麼 ? 爲什麼?

var name = 'baozhuang';
name += 10;
var type = typeof name;
if (type.length === 6) {
  type.text = 'string';
}
console.log(type.text);

答案:undefined

解析:type.text 爲 new String(type).text =“string” 包裝類無法存儲, 所以下面直接 delete 掉 。
注意:如果想要保存 type.text 可以再var type = new String(typeof name) 中獲得一個對象, 這樣下面就可以保存text屬性了


5、問:下面哪個能輸出 1,2,3,4,5 ? 爲什麼?

  // 1
  function fn1(x) {
    console.log(arguments);
    return x;
  }

  fn1(1, 2, 3, 4, 5);

  // 2
  function fn2(x) {
    console.log(arguments);
    return x;
  }(1, 2, 3, 4, 5);

  // 3
  (function fn3(x) {
    console.log(arguments);
    return x;
  }(1, 2, 3, 4, 5));

答案:1 3

解析:1 正常調用方法 2 函數聲明後面不能跟立即執行符號會報錯。如果括號裏面填寫內容會當成一個獨立的表達式。不會報錯但不執行 3 立即執行函數


6、問:下面的代碼輸出什麼結果 ? 爲什麼?

  function fn(x, y, z) {
    z = 10;
    console.log(arguments[2]);
  }

  fn(1, 2, 3);

答案:10

解析:實參和賦值的形參是映射關係同時存儲於堆內存的一個位置


7、問:下面的代碼輸出什麼結果 ? 爲什麼?

  function fn1() {
    fn2.apply(null, arguments);
  }

  function fn2() {
    console.log(arguments)
  }

  fn1(1, 2, 3, 4, 5)

答案:1, 2, 3, 4, 5

解析:所有的函數執行都有一個 fn2.call() 的過程, apply也一樣。this指向不改變,傳入參數還是一樣調用fn2()


8、 問:下面代碼結果爲 true 的有哪個? 爲什麼?

  // 1
  console.log(undefined == null);
  // 2
  console.log(undefined === null);
  // 3
  console.log(isNaN('100'));
  // 4
  console.log(parseInt('1a') == 1);

答案:1 4

解析:undefined , null 都不等於0 ,但是undefined == null ,一定要記住。isNaN('100') 隱式類型轉換爲isNaN(100)。parseInt('1a') 從第一位檢查是數字留下直到不是數字爲止


9、 問:下面代碼會輸出什麼結果 ? 爲什麼?

  var a = '1';

  function fn() {
    var a = '2';
    this.a = '3';
    console.log(a);
  }

  fn();
  new fn();
  console.log(a);

答案:2 2 3

解析:fn() 內輸出 a 的值,所以只能爲 2 。 在調用fn()函數的時候this.a =3 修改了 window下的a 值 所以 window.a = 3


10、 問:下面代碼會輸出什麼結果 ? 爲什麼?

var a = 5;

function fn() {
  a = 0;
  console.log(a);
  console.log(this.a);
  var a;
  console.log(a);
}

fn();
new fn();

答案:0 5 0 0 “undefined” 0

解析:fn() 函數調用時, a = 0; 已經被賦值所以a 只能等於 0; this.a = window.a =5; new fn() 構造函數內 a=0不變;this.a 在構造函數內並沒有定義所以是undefined


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