读书人

JavaScript 并非全部的东西都是对象

发布时间: 2013-01-02 13:08:44 作者: rapoo

JavaScript 并非所有的东西都是对象

原文:JavaScript values: not everything is an object

译文:JavaScript 并非所有的东西都是对象

译者:justjavac


2012-08-14 更新:重写了大部分内容。 添加了第四节,解释了和类型密切相关的两个运算:typeofinstanceofJavaScript 并非全部的东西都是对象

虽然很多语言宣称:“一切皆是对象”,但是 javascript 中,并不是所有的值都是对象。 这篇博文解释了 javascript 中的两种值类型:原始值(primitive)和对象(object),以及混合使用两种类型时的注意事项。

原始值 vs 对象

javascript 中的值可以被划分为两大类:原始值(primitive)和对象(object)。

定义

javascript 的两种值的定义:

下面的值是原始值

    字符串数字:在 JavaScript 中所有的数字都是浮点数布尔值nullundefined

所有其它的值都是对象(object)。对象可以进一步划分:

    原始值的包装器:Boolean, Number, String。很少直接使用。

    用字面量创建的对象。 下面的字面量产生对象,也可以通过构造函数创建对象。您可以使用字面量创建对象。

      [] 就是 new Array(){} 就是 new Object()function() {} 就是 new Function()/\s*/ 就是 new RegExp("\\s*")

      日期:new Date("2011-12-24")

区别

您可以通过枚举的原语和定义对象非原语定义原语和对象。 但你也可以描述的原语和对象是什么。 让我们开始与对象。

    对象是可变的:

     > var obj = {}; > obj.foo = 123;  // 添加属性和值 123 > obj.foo  // 读属性,返回属性的值 123

    每个对象都有自己唯一的标识符,因此通过字面量或构造函数创建的对象和任何其他对象都不相等,我们可以通过 === 进行比较。

     > {} === {} false

    对象是通过引用来比较的,只有两个对象有相同的标识,才认为这个对象是相等的

     > var obj = {}; > obj === obj true

    变量保存了对象的引用,因此,如果两个变量应用了相同的对象——我们改变其中一个变量时,两一个也会随之改变。

     > var var1 = {}; > var var2 = var1; > var1.foo = 123;   // 修改变量 val1 的属性 123 > var2.foo  // val2 也改变了 123

正如预期的那样,原始值和对象不一样:

    原始值是不可变的;你不能给它们添加属性:

     > var str = "abc"; > str.foo = 123;  // 添加属性(此操作将被忽略) 123 > str.foo  // 读属性的值,返回 undefined undefined

    原始值没有内部标识,原始值是按值比较的: 比较两个原始值的依据是他们的内容,如果两个原始值的内容相同,这认为这两个原始值相同。

      > "abc" === "abc"  true

    这意味着,一个原始值的标识就是它的值,javascript 引擎没有为原始值分配唯一标识。

最后两个事实结合起来的意思是:我们无法区分一个变量到底是对象的引用,还是原始值的副本。

陷阱:原始值和它们的包装类型

规则:忽略尽可能多的包装类型。 在其他编程语言如Java,你很少会注意到他们。

原始值类型 boolean, number 以及 string 都有自己对应的包装类型 Boolean, Number 和 String。 包装类型的实例都是对象值,两种类型之间的转换也很简单:

读书人网 >JavaScript

热点推荐