This topic created in 4489 days ago, the information mentioned may be changed or developed.
>a=[1,2,3]
[1, 2, 3]
>a.x=2
2
>a.x
2
>b=1
1
>b.x=2
2
>b.x
undefined
============================================
这里为什么a.x可以赋值,b.x确不行呢?
14 replies • 2014-07-21 21:18:19 +08:00
 |
|
数组也是对象,所以可以有自己的属性,而 b 是一个数值,虽然在Javascript中也算是对象,但是事实上和数值对象是不同的,通过 b = new Number(2) 可以得到一个数值对象,此时 b.x 是存在的
|
 |
|
通过 typeof 就可以发现两个 b 的不同
|
 |
|
lijshJul 21, 2014 via Android 1
3
针对楼上的回答补充一下,b不属于复杂对象,不能在上面定义方法;但b.toString()是可以正常使用的,js会在后台临时创建一个包装对象,toString()就是在此对象上调用,调用结束后该对象会被销毁。
|
 |
|
理解JS的基本数据类型的包装对象这个概念就能明白了。String和Boolean对象也是如此。
|
 |
|
lijshJul 21, 2014 via Android 1
5
所以给b.x=2这里其实赋值成功了,但这是赋值在包装对象上,这个对象随后就被销毁了。
|
 |
|
短答案:因为 a 是对象,b 不是对象,只是一个整数 长答案: 1. 从JS的语法的角度来看,「.」操作符的左边应该只能是一个对象(即 object.key 这种形式) 2. 为什么 JS 的 number 也可以接上一个「.」操作符呢?因为 JS 的作者本着「以人为本」的理念,在开发者写出 number.toString() 如上代码的时候,贴心地生成一个和 number 相对应的 Number 对象(临时对象)。 当这句话执行完了,这个临时的 Number 对象也就消失了。 这样,开发者即可以接触简洁的代码,又能享受面向对象带来的方便。 3. 所以,你在写 b.x=2 的时候,其实是把 2 赋值给了临时对象的 x 成员。这句话结束后,b 还是那个整数 b,而不是那个临时对象。 4. 你在写 a.x=2 的时候,就没有临时对象了,2 是直接复制给了 a.x。
|
 |
|
纠正:「可以接触简洁的代码」->「可以写出简洁的代码」
|
 |
|
一点进来发现都被答完了=_=
|
 |
|
推荐那本海龟书,编写可维护的JavaScript,里面有详细的讲解
|
 |
|
这种情况总得来说就是创建完就会消失
|
 |
|
感谢楼上各位了,我知道怎么回事了!
|
 |
|
《JavaScript 高级程序设计》第三版的5.6节「基本包装类型」里对这个也有比较详细的解释。楼主的代码可以看成是下面这样的。 var b = new Number(1); b.x = 2; b = null;
----------------------------------------- 引用类型与基本包装类型的主要区别就是对象的生存期。
|
 |
|
原始值和复杂值的问题。LZ 可以看下 *JavaScript Enligbtenment* 这本书第一章的内容。
|
 |
|
V2果然大神多啊
|