Email:longsu2010 at yeah dot net 最近我和朋友谈起JavaScript中对象的问题。朋友以写JavaScript为生,而且生活的很好,然而我发现他并不真正懂这们语言的某些核心特征。如果你也有同样的困惑,我下面尝试解答。 朋友引用了一本书中的解释,如下:“有趣的是ECMAScript的原始值(像boolean,number和string)是伪对象,那就是说他们是有属性和方法的。” 真的很抱歉,他不是这样的。 我们先看一个例子 这个例子将会alert “undefined”。为什么呢?如果a是一个伪对象那么为什么没有保存属性呢?实际上a不是一个对象,甚至不是一个伪对象。它是原始的number。他没有属性。众多周知JavaScript自动将变量从一个类型转为另一个类型。看下面的代码片段: number a和array [1, 2, 3]将自动转为string。同样的事情发生在点(.)操作符之前,JavaScript简单的将左侧的操作数转为object。因此例子中的第二行会创建一个Number对象,它的值与a相等(本例中是5),然后为刚创建的Number对象的t属性赋值为3。但是新的Number对象不会取代变量a(不会回写给变量a),它只会被垃圾回收器回收掉。第三行会再一次创建一个新对象,之后尝试读取新对象的t属性,t属性是“undefined”。原始类型(boolean、number和string)不是对象,他们有可能像对象转换。转换规则是什么呢?JavaScript有六种内建类型:null、undefined、number、string、boolean和object。转换规则如下: 1、如果是对象那么保持不变。 2、如果是null或者undefined抛出异常。 3、否则创建 (new Number(input)或者new String(input)或者new Boolean(input))。 希望这边文章对于大家理解JavaScript对象有所帮助。下一篇将写原型。 译者: var a = 2; var b = new Number(2); alert(a == b); // true alert(a === b); // false alert(a.valueOf()); // 2 alert(b.valueOf()); // 2 本文讲述了当对JavaScript内建的原始值进行点(.)操作时解析器的行为。如果你读过Nicholas C. Zakas的《JavaScript高级程序设计》你一定会记得其中对此有详细的解释。 相关文章: |
|
来自: 集微笔记 > 《JavaScript》