一,在定义时,对象的属性名可以是包含空字符串在内的任何字符串。
二,当给对象添加属性时,属性名key也可以是其他数据类型
1,当key是数组时:转化为逗号分割的字符串作为key:
var a={
}
var arr1=[22,2,3]
var arr2=[3,2,5]
a[arr1]='123'
a[arr2]='456'
console.log(a)
于是当一个是字符串,一个是数组时,会有这种情况发生:
var a={
}
var str1='3,2,5'
var arr2=[3,2,5]
a[str1]='123'
a[arr2]='456'
console.log(a)
第一个被覆盖了,这里只要知道,数组作为key时,是转化为逗号分割的字符串就行,因为两者值一样,自然后者覆盖前者。
2,当key是对象时,无论对象的内容是啥,都会转化为‘【object Object】’作为key值,也就是说,无论是啥对象,最后一个赋值必然覆盖之前的对象(还会覆盖【object Object】这个字符串)
var a={
}
var str='[object Object]'
var obj1={
name:'zhangsan'
}
var obj2={
age:14
}
a[str]='也是'
a[obj1]='123'
a[obj2]='456'
console.log(a)
3,当是其他特殊值时:
var a={
}
var key1=null
var key2=undefined
var key3=function (){
console.log('a')}
var key4=1
var key5=NaN
a[key1]='null'
a[key2]='undefined'
a[key3]='function'
a[key4]='1'
a[key5]='NaN'
console.log(a)
三,总结:实际上是把它们调用toString()方法转化为字符串了,并且因为null和undefined没有toString()方法,所以他俩用的是String()函数
至于为什么所有的对象,无论内容是啥,都是同一个?这是因为Object的原型对象上的toString方法就是那个判断数据类型的toString方法,而也就是说所有Object的实例对象的原型链上,都只能调用这个判断类型的toString