• 对象的键名只能是字符串和 Symbol 类型。
  • 其他类型的键名会被转换成字符串类型。
  • 对象转字符串默认会调用 toString 方法。

当键名是非字符串或 Symbol 时,会先转换成字符串再进行赋值

var obj={}, a='123', b=123;
obj[a]='a';
obj[b]='b';
console.log(obj[a])    //b

当执行 obj[a] = 'a' 时,a 是 string,直接赋值
image.png
当执行 obj[b] = 'b' 时,b 是 number,会调用toString转换成字符串 '123' ,覆盖掉a
image.png

当键名是 Symbol 时, 因为 Symbol 的唯一性,因此无法覆盖

var obj={}, a= Symbol('123'), b= Symbol('123');
obj[a]='a';
obj[b]='b';
console.log(obj[a])       //a    

当执行 obj[a] = 'a' 时,a是 Symbol ,直接赋值
image.png
当执行 obj[b] = 'b' 时,因为 a 不等于 b ,直接赋值,
image.png

当 a,b 是object时,也会调用 toString ,转换成字符串 [object Object]

var obj={}, a= {}, b= {};
obj[a]='a';
obj[b]='b';
console.log(obj[a])          //b

当执行 obj[a]='a' ; a 是 object ,会被转换成字符串 [object Object]
image.png

当执行 obj[b]='b' ; b 是 object ,会被转换成字符串 [object Object], 覆盖掉 a
image.png


REMZ
4 声望0 粉丝