V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
rcmerci
V2EX  ›  JavaScript

初学 js,有个问题请教

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

    -----------------------------------------
    引用类型与基本包装类型的主要区别就是对象的生存期。
    un
        13
    un  
       2014-07-21 20:56:49 +08:00
    原始值和复杂值的问题。LZ 可以看下 *JavaScript Enligbtenment* 这本书第一章的内容。
    Biwood
        14
    Biwood  
       2014-07-21 21:18:19 +08:00
    V2果然大神多啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:51 · PVG 20:51 · LAX 04:51 · JFK 07:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.