《你不知道的JavaScript》【5】——对象

注 1:原理是这样的,不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判 断为 object 类型,null 的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“object”。

——译者注

对象 | 103

内置对象

JavaScript 中还有一些对象子类型,通常被称为内置对象。有些内置对象的名字看起来和 简单基础类型一样,不过实际上它们的关系更复杂,我们稍后会详细介绍。

• String
• Number
• Boolean • Object
• Function • Array

 

• Date
• RegExp • Error

使用以上两种方法,我们都可以直接在字符串字面量上访问属性或者方法,之所以可以这 样做,是因为引擎自动把字面量转换成 String 对象,所以可以访问属性和方法。

同样的事也会发生在数值字面量上

null 和 undefined 没有对应的构造形式,它们只有文字形式。相反,Date 只有构造,没有

文字形式。

对于 Object、Array、Function 和 RegExp(正则表达式)来说,无论使用文字形式还是构 造形式,它们都是对象,不是字面量。在某些情况下,相比用文字形式创建对象,构造形 式可以提供一些额外选项。由于这两种形式都可以创建对象,所以我们首选更简单的文字 形式。建议只在需要那些额外选项时使用构造形式。

Error 对象很少在代码中显式创建,一般是在抛出异常时被自动创建。也可以使用 new Error(..) 这种构造形式来创建,不过一般来说用不着。

 

 

 函数好像是在一个全局池里 的赶脚

数组也是对象,所以虽然每个下标都是整数,你仍然可以给数组添加属性:

最好 只用对象来存储键 / 值对,只用数组来存储数值下标 / 值对

 

 

 

 

forEach(..) 会遍历数组中的所有值并忽略回调函数的返回值。every(..) 会一直运行直到

回调函数返回 false(或者“假”值),some(..) 会一直运行直到回调函数返回 true(或者 “真”值)。

every(..) 和 some(..) 中特殊的返回值和普通 for 循环中的 break 语句类似,它们会提前 终止遍历。

使用 for..in 遍历对象是无法直接获取属性值的,因为它实际上遍历的是对象中的所有可 枚举属性,你需要手动获取属性值。

 

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。

 

 

 

许多人都以为“JavaScript 中万物都是对象”,这是错误的。对象是 6 个(或者是 7 个,取 决于你的观点)基础类型之一。对象有包括 function 在内的子类型,不同子类型具有不同 的行为,比如内部标签 [object Array] 表示这是对象的子类型数组。

对象就是键 / 值对的集合。可以通过 .propName 或者 ["propName"] 语法来获取属性值。访 问属性时,引擎实际上会调用内部的默认 [[Get]] 操作(在设置属性值时是 [[Put]]), [[Get]] 操作会检查对象本身是否包含这个属性,如果没找到的话还会查找 [[Prototype]] 链(参见第 5 章)。

属性的特性可以通过属性描述符来控制,比如 writable 和 configurable。此外,可以使用 Object.preventExtensions(..)、Object.seal(..) 和 Object.freeze(..) 来设置对象(及其 属性)的不可变性级别。

属性不一定包含值——它们可能是具备 getter/setter 的“访问描述符”。此外,属性可以是 可枚举或者不可枚举的,这决定了它们是否会出现在 for..in 循环中。

你可以使用 ES6 的 for..of 语法来遍历数据结构(数组、对象,等等)中的值,for..of 会寻找内置或者自定义的 @@iterator 对象并调用它的 next() 方法来遍历数据值。

猜你喜欢

转载自www.cnblogs.com/cx2016/p/13198823.html
今日推荐