19 以下代碼執(zhí)行后热某,控制臺(tái)中的輸出內(nèi)容為转捕?
var a2 = {}, b2 = Symbol('123'), c2 = Symbol('123');
a2[b2] = 'b';
a2[c2] = 'c';
console.log(a2[b2]);
20 以下代碼執(zhí)行后淋样,控制臺(tái)中的輸出內(nèi)容為耗式?
var a3 = {},
b3 = { key: "123" },
c3 = { key: "456" };
a3[b3] = "b";
a3[c3] = "c";
console.log(a3[b3]);
21 以下代碼執(zhí)行后,控制臺(tái)中的輸出內(nèi)容為趁猴?
const a = {
i: 1,
toString() {
return a.i++;
},
};
console.log(a == 1 && a == 2 && a == 3);
公粽號(hào)【今天也要寫(xiě)bug】
答案與解析
19
// 答案:b
// 考察 Symbol 類(lèi)型
// ES6 引入了一種新的基本數(shù)據(jù)類(lèi)型:Symbol
// 一個(gè) symbol 值能作為對(duì)象屬性的標(biāo)識(shí)符刊咳;這是該數(shù)據(jù)類(lèi)型僅有的目的。
// 每個(gè)從 Symbol() 返回的 symbol 值都是唯一的儡司。
var a2 = {},
b2 = Symbol("123"),
c2 = Symbol("123");
// symbol 值唯一娱挨,所以 b2 和 c2 作為對(duì)象屬性標(biāo)識(shí)符表示兩個(gè)不同的屬性
a2[b2] = "b";
a2[c2] = "c";
console.log(a2[b2]); // 輸出 b
20
// 答案:c
// 考察對(duì)象的屬性、隱式強(qiáng)制類(lèi)型轉(zhuǎn)換
// 對(duì)象的屬性名只能是 string 或 symbol 類(lèi)型
// 如果對(duì)象的屬性名不是這兩者捕犬,則會(huì)將其隱式強(qiáng)制轉(zhuǎn)換為 string
// 對(duì)于非字符串類(lèi)型轉(zhuǎn)換為字符串類(lèi)型
// 基本類(lèi)型:null => 'null', undefined => 'undefined'
// true => 'true', false => 'false', 數(shù)字通常直接加引號(hào)(極小或極大值采用指數(shù)形式加引號(hào))
// 對(duì)象轉(zhuǎn)換為字符串類(lèi)型:如果對(duì)象的 valueOf 方法返回的是基本類(lèi)型跷坝,就按 valueOf 返回值轉(zhuǎn)換
// 否則就按對(duì)象的 toString 方法的返回值來(lái)進(jìn)行轉(zhuǎn)換
var a3 = {},
b3 = { key: "123" },
c3 = { key: "456" };
a3[b3] = "b"; // b3 為普通對(duì)象酵镜,valueOf 返回它本身,不是基本類(lèi)型柴钻,所以使用 toString 返回值來(lái)轉(zhuǎn)換成 string
a3[c3] = "c"; // 同上
// 而普通對(duì)象的 toString 方法均返回 '[object Object]'
// 故經(jīng)過(guò)上述兩次賦值后淮韭,a3 為:{ '[object Object]': 'c' }
console.log(a3[b3]); // 最終輸出 c
21
// 答案:true
// 考察強(qiáng)制類(lèi)型轉(zhuǎn)換
// == 操作會(huì)進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
// 如果操作數(shù)之一是對(duì)象,另一個(gè)是數(shù)字或字符串贴届,
// 會(huì)嘗試使用對(duì)象的valueOf()和toString()方法將對(duì)象轉(zhuǎn)換為原始值靠粪。
// 如果 valueOf 返回基本類(lèi)型,就按該值進(jìn)行轉(zhuǎn)換毫蚓,否則按 toString 的返回值轉(zhuǎn)換
const a = {
i: 1,
toString() {
return a.i++;
},
};
// 對(duì)于 a == 1占键,嘗試將對(duì)象 a 轉(zhuǎn)換為數(shù)字類(lèi)型
// a 為普通對(duì)象,它的 valueOf 返回它本身元潘,所以按 toString 返回值來(lái)轉(zhuǎn)換
// a.toString() 返回 1捞慌,所以 a == 1 為true
// 然后 a.i 自增為 2
// 同理判斷 a == 2,再一次觸發(fā) toString 方法返回 2柬批,a == 2 為 true
// 然后 a.i 自增為 3
// 同理 a == 3 為 true
console.log(a == 1 && a == 2 && a == 3); // 最終輸出 true