书上这样的关于javascript中对象的属性名这样说,js的对象的属性名是包括空字符串在内的所有字符串。
问题来了,我们平时定义的对象如下,是没有引号""或''的。
如下:
var copy = { first_name : "Jeo", second_name : "Mike" };
可是能否这样写呢?
var stooge = { "first_name" : "Jeo", "second_name" : "Mike" };
我觉得应该没问题,可是究竟有没有问题呢?
做个实验吧,再chrome控制台里写入如下代码
var stooge = { "first_name" : "Jeo", "second_name" : "Mike" }; var copy = { first_name : "Jeo", second_name : "Mike" }; if (stooge.first_name === copy.first_name) { console.log('I am right'); } else { console.log('Wrong!'); }
输出:I am right
也就是说,书上说的没错,是字符串,而且属性名是合法的(不是javascript的保留字)是允许不用引号括起来属性名的。
可是对象的属性又是如何调用(访问)呢?
按照上面的定义方法,我们是使用第一种stooge.first_name,还是 stooge."first_name" 呢?
实验结果表明:
应该是stooge.first_name
应该这么写,也就是说,这种写法也是默认支持不用引号括起来属性名
当然javascript对象属性的访问和数组的访问写法很像,可是按照上面的写法究竟是stooge[first_name],还是 stooge["first_name"] 呢?
答案是stooge["first_name"]
此种写法类似数组,一定要在[]中加入对应有引号的字符串,才能识别出键。
昨天完成了这篇文章之后,遇到了这样的一种情况:
var sample = { 1 : "abc", 5 : 100 }; sample[1]
这个是正常的,没有报错,不太符合上面的结论。。。于是我求助了大神,给了这样一个回复。js 对象的属性使用偏移实现, 与索引的类型没有直接关系, 在运行时均会转换为基准地址与偏移量, 从语法上来说 关联数组中的 数字也会转换为字符串来解释。
我理解,大概的意思就是这里[]里的1是被隐式转换成了字符串。假设是把其中的1换成字符串a,就要报错了。如下图:
至于详细原因,暂时还理解的不是很透彻,之后再复习吧。。。