JavaScript中的对象(一)

Email:longsu2010 at yeah dot net

最近我和朋友谈起JavaScript中对象的问题。朋友以写JavaScript为生,而且生活的很好,然而我发现他并不真正懂这们语言的某些核心特征。如果你也有同样的困惑,我下面尝试解答。

朋友引用了一本书中的解释,如下:
“有趣的是ECMAScript的原始值(像boolean,number和string)是伪对象,那就是说他们是有属性和方法的。”
真的很抱歉,他不是这样的。
我们先看一个例子

var a = 5;
a.t = 3;
alert(a.t);

这个例子将会alert “undefined”。为什么呢?如果a是一个伪对象那么为什么没有保存属性呢?实际上a不是一个对象,甚至不是一个伪对象。它是原始的number。他没有属性。众多周知JavaScript自动将变量从一个类型转为另一个类型。看下面的代码片段:

var b = "w" + a + [1, 2, 3];

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?

JavaScript交流贴

原文地址:https://www.cnblogs.com/dyllove98/p/3184519.html