本节书摘来自异步社区《深入理解JavaScript》一书中的第1章,第1.4节,作者: 【美】AxelRauschmayer(罗彻麦尔)译者: 王玉林 , 杜欢 , 庄婷婷 , 章子鹏,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.4 值
JavaScript有很多值,都是我们预期的编程语言的值:布尔值、数字、字符串、数组等。在JavaScript中所有的值都有属性。每一个属性都有一个key(或者是name)和一个value。可以认为,属性就像是一条记录的字段。通过点(.)操作符可以读取属性:
例如,字符串'abc'有length这个属性:
这段代码也可以写为:
点操作符同样可以用于给属性赋值:
我们也可以通过点操作符来调用方法:
在上面的示例中,我们在值hello上调用了toUpperCase()方法。
1.4.1 原始值和对象
JavaScript中,对值的区分有点自由。
原始值包括布尔值、数字、字符串、null和undefined。
其他的值都是对象。
这两者之间最主要的区别在于它们的比较方式;每个对象都有唯一的标识且只(严格地)等于自己:
相反,所有的原始值,只要编码值相同,则被认为相等:
后面两节将更详细地介绍原始值和对象。
1.4.2 原始值
以下即为所有的原始值(或简称为primitives)。
布尔值:true、false(参见1.5“布尔值”)
数字:20156、1.351(参见1.6“数字”)
字符串:'dh'、"abc"(参见1.8“字符串”)
两个“空值”:undefined、null(参见1.4.4“undefined和null”)
原始值具有以下特点。
(1)按值进行比较
内容比较:
(2)不可改变
其属性不能被改变、添加或移除:
(读取一个未知属性时,总会返回undefined。)
1.4.3 对象
所有的非原始值都是对象。最常见的对象如下。
简单对象,可以通过对象字面量来创建(参见1.14.1“单一对象”):
上述对象有两个属性:属性firstName的值是Jane,属性lastName的值是Doe。
数组,可以通过数组字面量来创建(参见1.15“数组”):
上面的数组有3个元素,可以通过数字索引来访问它们。例如,'apple'的索引是0。
正则表达式,可以通过正则表达式字面量来创建(参见1.16“正则表达式”):
对象具有以下特点。
(1)按引用进行比较
比较身份标识;每个值都有各自的身份标识:
(2)默认可变
对象属性可以很自由地被改变、添加和移除(参见1.14.1“单一对象”):
1.4.4 undefined和null
大多数编程语言都会有一些值去表示丢失的信息。JavaScript有两个类似的“空值”,undefined和null。
undefined的意思是“没有值”。未被初始化的变量即为undefined:
丢失的参数也会是undefined:
访问不存在的属性,也会得到undefined:
null的意思是“没有对象”。在用到对象的时候它表示空值(例如参数、对象链中的最后一个元素等)。
警告:
undefined和null没有属性,甚至连toString()这种标准方法都没有。
检查undefined或null
通常,函数允许透过undefined或null来表示缺失的值。可以通过以下显式的检查来做到同样的事情:
也可以利用undefined和null都可被视为false这一事实来处理:
警告:
false, 0, NaN, 和 '' 都可被视为false(参见1.5.1“真值与假值”)。
1.4.5 使用typeof和instanceof对值分类
有两种对值进行分类的操作符:typeof主要用于原始值,instanceof用于对象。
typeof用法形如:
它的返回值会是一个表示这个值“类型”的字符串。如以下示例:
表1.1列出了typeof会得到的所有结果:
typeof null返回object是一个不能去修正的bug,因为这会破坏现有的代码。但这并不表示null是一个对象。
instanceof用法形如:
如果value是一个通过Constr构造器创建的对象,则返回true(参见1.14.5“构造函数:对象工厂”)。如以下示例: