19 以下代碼執行後,控制臺中的輸出內容為? var a2 = {}, b2 = Symbol('123'), c2 = Symbol('123'); a2[b2] = 'b'; a2[c2] = 'c'; console.log(a2[b2]); 20 以下代碼執行後,控制臺中的輸出內容為? va ...
19 以下代碼執行後,控制臺中的輸出內容為?
var a2 = {}, b2 = Symbol('123'), c2 = Symbol('123');
a2[b2] = 'b';
a2[c2] = 'c';
console.log(a2[b2]);
20 以下代碼執行後,控制臺中的輸出內容為?
var a3 = {},
b3 = { key: "123" },
c3 = { key: "456" };
a3[b3] = "b";
a3[c3] = "c";
console.log(a3[b3]);
21 以下代碼執行後,控制臺中的輸出內容為?
const a = {
i: 1,
toString() {
return a.i++;
},
};
console.log(a == 1 && a == 2 && a == 3);
公粽號【今天也要寫bug】
答案與解析
19
// 答案:b
// 考察 Symbol 類型
// ES6 引入了一種新的基本數據類型:Symbol
// 一個 symbol 值能作為對象屬性的標識符;這是該數據類型僅有的目的。
// 每個從 Symbol() 返回的 symbol 值都是唯一的。
var a2 = {},
b2 = Symbol("123"),
c2 = Symbol("123");
// symbol 值唯一,所以 b2 和 c2 作為對象屬性標識符表示兩個不同的屬性
a2[b2] = "b";
a2[c2] = "c";
console.log(a2[b2]); // 輸出 b
20
// 答案:c
// 考察對象的屬性、隱式強制類型轉換
// 對象的屬性名只能是 string 或 symbol 類型
// 如果對象的屬性名不是這兩者,則會將其隱式強制轉換為 string
// 對於非字元串類型轉換為字元串類型
// 基本類型:null => 'null', undefined => 'undefined'
// true => 'true', false => 'false', 數字通常直接加引號(極小或極大值採用指數形式加引號)
// 對象轉換為字元串類型:如果對象的 valueOf 方法返回的是基本類型,就按 valueOf 返回值轉換
// 否則就按對象的 toString 方法的返回值來進行轉換
var a3 = {},
b3 = { key: "123" },
c3 = { key: "456" };
a3[b3] = "b"; // b3 為普通對象,valueOf 返回它本身,不是基本類型,所以使用 toString 返回值來轉換成 string
a3[c3] = "c"; // 同上
// 而普通對象的 toString 方法均返回 '[object Object]'
// 故經過上述兩次賦值後,a3 為:{ '[object Object]': 'c' }
console.log(a3[b3]); // 最終輸出 c
21
// 答案:true
// 考察強制類型轉換
// == 操作會進行強制類型轉換
// 如果操作數之一是對象,另一個是數字或字元串,
// 會嘗試使用對象的valueOf()和toString()方法將對象轉換為原始值。
// 如果 valueOf 返回基本類型,就按該值進行轉換,否則按 toString 的返回值轉換
const a = {
i: 1,
toString() {
return a.i++;
},
};
// 對於 a == 1,嘗試將對象 a 轉換為數字類型
// a 為普通對象,它的 valueOf 返回它本身,所以按 toString 返回值來轉換
// a.toString() 返回 1,所以 a == 1 為true
// 然後 a.i 自增為 2
// 同理判斷 a == 2,再一次觸發 toString 方法返回 2,a == 2 為 true
// 然後 a.i 自增為 3
// 同理 a == 3 為 true
console.log(a == 1 && a == 2 && a == 3); // 最終輸出 true