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