初学 js,有个问题请教

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

-----------------------------------------
引用类型与基本包装类型的主要区别就是对象的生存期。
un
2014-07-21 20:56:49 +08:00
原始值和复杂值的问题。LZ 可以看下 *JavaScript Enligbtenment* 这本书第一章的内容。
Biwood
2014-07-21 21:18:19 +08:00
V2果然大神多啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/123645

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX