1
guchengf 2014-07-20 23:58:12 +08:00 2
数组也是对象,所以可以有自己的属性,而 b 是一个数值,虽然在Javascript中也算是对象,但是事实上和数值对象是不同的,通过 b = new Number(2) 可以得到一个数值对象,此时 b.x 是存在的
|
2
guchengf 2014-07-20 23:59:21 +08:00 1
通过 typeof 就可以发现两个 b 的不同
|
3
lijsh 2014-07-21 00:11:51 +08:00 via Android 1
针对楼上的回答补充一下,b不属于复杂对象,不能在上面定义方法;但b.toString()是可以正常使用的,js会在后台临时创建一个包装对象,toString()就是在此对象上调用,调用结束后该对象会被销毁。
|
4
adeweb 2014-07-21 00:15:03 +08:00
理解JS的基本数据类型的包装对象这个概念就能明白了。String和Boolean对象也是如此。
|
5
lijsh 2014-07-21 00:15:43 +08:00 via Android 1
所以给b.x=2这里其实赋值成功了,但这是赋值在包装对象上,这个对象随后就被销毁了。
|
6
jsonline 2014-07-21 00:18:10 +08:00 3
短答案:因为 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。 |
7
jsonline 2014-07-21 00:19:13 +08:00
纠正:「可以接触简洁的代码」->「可以写出简洁的代码」
|
8
exoticknight 2014-07-21 00:23:19 +08:00
一点进来发现都被答完了=_=
|
9
sneezry 2014-07-21 07:38:17 +08:00 via iPhone
推荐那本海龟书,编写可维护的JavaScript,里面有详细的讲解
|
10
coolicer 2014-07-21 08:20:24 +08:00
这种情况总得来说就是创建完就会消失
|
11
rcmerci OP 感谢楼上各位了,我知道怎么回事了!
|
12
devyps 2014-07-21 08:23:55 +08:00 1
《JavaScript 高级程序设计》第三版的5.6节「基本包装类型」里对这个也有比较详细的解释。楼主的代码可以看成是下面这样的。
var b = new Number(1); b.x = 2; b = null; ----------------------------------------- 引用类型与基本包装类型的主要区别就是对象的生存期。 |
13
un 2014-07-21 20:56:49 +08:00
原始值和复杂值的问题。LZ 可以看下 *JavaScript Enligbtenment* 这本书第一章的内容。
|
14
Biwood 2014-07-21 21:18:19 +08:00
V2果然大神多啊
|