Number 对象
概述
Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。
作为构造函数时,它用于生成值为数值的对象。
12var n = new Number(1);typeof n // "object"
上面代码中,Number对象作为构造函数使用,返回一个值为1的对象。
作为工具函数时,它可以将任何类型的值转为数值。
1Number(true) // 1
上面代码将布尔值true转为数值1。Number作为工具函数的用法,详见《数据类型转换》一章。
静态属性
Number对象拥有以下一些静态属性(即直接定义在Number对象上的属性,而不是定义在实例上的属性)。
Number.POSITIVE_INFINITY:正的无限,指向Infinity。
Number.NEGATIVE_INFINITY:负的无限,指向-Infinity。
Number.NaN:表示非数值,指向NaN。
Number.MIN_VALUE:表示最小的正数(即最接近0的正数,在64位浮点数体系中为5e-324),相应的,最接近0的负数为-Numbe ...
Boolean 对象
概述
Boolean对象是 JavaScript
的三个包装对象之一。作为构造函数,它主要用于生成布尔值的包装对象实例。
1234var b = new Boolean(true);typeof b // "object"b.valueOf() // true
上面代码的变量b是一个Boolean对象的实例,它的类型是对象,值为布尔值true。
注意,false对应的包装对象实例,布尔运算结果也是true。
1234567if (new Boolean(false)) { console.log('true');} // trueif (new Boolean(false).valueOf()) { console.log('true');} // 无输出
上面代码的第一个例子之所以得到true,是因为false对应的包装对象实例是一个对象,进行逻辑运算时,被自动转化成布尔值true(因为所有对象对应的布尔值都是true)。而实例的valueOf方法,则返回 ...
包装对象
定义
对象是 JavaScript
语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”(wrapper)。
所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
1234567891011var v1 = new Number(123);var v2 = new String('abc');var v3 = new Boolean(true);typeof v1 // "object"typeof v2 // "object"typeof v3 // "object"v1 === 123 // falsev2 === 'abc' // falsev3 === true // false
上面代码中,基于原始类型的值,生成了三个对应的包装对象。可以看到,v1、v2、v3都是对象,且与对应的简 ...
Array 对象
构造函数
Array是 JavaScript
的原生对象,同时也是一个构造函数,可以用它生成新的数组。
123var arr = new Array(2);arr.length // 2arr // [ empty x 2 ]
上面代码中,Array()构造函数的参数2,表示生成一个两个成员的数组,每个位置都是空值。
如果没有使用new关键字,运行结果也是一样的。
123var arr = Array(2);// 等同于var arr = new Array(2);
考虑到语义性,以及与其他构造函数用法保持一致,建议总是加上new。
Array()构造函数有一个很大的缺陷,不同的参数个数会导致不一致的行为。
12345678910111213141516171819// 无参数时,返回一个空数组new Array() // []// 单个正整数参数,表示返回的新数组的长度new Array(1) // [ empty ]new Array(2) // [ empty x 2 ]// 非正整数的数值作为参数,会报错new Array(3.2) // RangeErr ...
属性描述对象
概述
JavaScript
提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes
object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
下面是属性描述对象的一个例子。
12345678{ value: 123, writable: false, enumerable: true, configurable: false, get: undefined, set: undefined}
属性描述对象提供6个元属性。
(1)value
value是该属性的属性值,默认为undefined。
(2)writable
writable是一个布尔值,表示属性值(value)是否可改变(即是否可写),默认为true。
(3)enumerable
enumerable是一个布尔值,表示该属性是否可遍历,默认为true。如果设为false,会使得某些操作(比如for...in循环、Object.keys())跳过该属性。
(4)conf ...
装饰器
[说明] Decorator
提案经过了大幅修改,目前还没有定案,不知道语法会不会再变。下面的内容完全依据以前的提案,已经有点过时了。等待定案以后,需要完全重写。
装饰器(Decorator)是一种与类(class)相关的语法,用来注释或修改类和类方法。许多面向对象的语言都有这项功能,目前有一个提案将其引入了
ECMAScript。
装饰器是一种函数,写成@ + 函数名。它可以放在类和类方法的定义前面。
12345678@frozen class Foo { @configurable(false) @enumerable(true) method() {} @throttle(500) expensiveMethod() {}}
上面代码一共使用了四个装饰器,一个用在类本身,另外三个用在类方法。它们不仅增加了代码的可读性,清晰地表达了意图,而且提供一种方便的手段,增加或修改类的功能。
类的装饰
装饰器可以用来装饰整个类。
12345678910@testableclass MyTestableClass ...
最新提案
本章介绍一些尚未进入标准、但很有希望的最新提案。
do 表达式
本质上,块级作用域是一个语句,将多个操作封装在一起,没有返回值。
1234{ let t = f(); t = t * t + 1;}
上面代码中,块级作用域将两个语句封装在一起。但是,在块级作用域以外,没有办法得到t的值,因为块级作用域不返回值,除非t是全局变量。
现在有一个提案,使得块级作用域可以变为表达式,也就是说可以返回值,办法就是在块级作用域之前加上do,使它变为do表达式,然后就会返回内部最后执行的表达式的值。
1234let x = do { let t = f(); t * t + 1;};
上面代码中,变量x会得到整个块级作用域的返回值(t * t + 1)。
do表达式的逻辑非常简单:封装的是什么,就会返回什么。
12345// 等同于 <表达式>do { <表达式>; }// 等同于 <语句>do { <语句> }
do表达式的好处是可以封装多个语句, ...
ArrayBuffer
ArrayBuffer对象、TypedArray视图和DataView视图是
JavaScript
操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011 年 2
月发布),ES6 将它们纳入了 ECMAScript
规格,并且增加了新的方法。它们都是以数组的语法处理二进制数据,所以统称为二进制数组。
这个接口的原始设计目的,与 WebGL 项目有关。所谓
WebGL,就是指浏览器与显卡之间的通信接口,为了满足 JavaScript
与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式。文本格式传递一个
32 位整数,两端的 JavaScript
脚本与显卡都要进行格式转化,将非常耗时。这时要是存在一种机制,可以像 C
语言那样,直接操作字节,将 4 个字节的 32
位整数,以二进制形式原封不动地送入显卡,脚本的性能就会大幅提升。
二进制数组就是在这种背景下诞生的。它很像 C
语言的数组,允许开发者以数组下标的形式,直接操作内存,大大增强了
JavaScript 处理二进制数据的能力,使得开发者有可能通过 Ja ...
异步遍历器
同步遍历器的问题
《遍历器》一章说过,Iterator
接口是一种数据遍历的协议,只要调用遍历器对象的next方法,就会得到一个对象,表示当前遍历指针所在的那个位置的信息。next方法返回的对象的结构是{value, done},其中value表示当前的数据的值,done是一个布尔值,表示遍历是否结束。
12345678910111213141516function idMaker() { let index = 0; return { next: function() { return { value: index++, done: false }; } };}const it = idMaker();it.next().value // 0it.next().value // 1it.next().value // 2// ...
上面代码中,变量it是一个遍历器(iterator)。每次调用it.next()方法,就返回一个对象,表示当前遍 ...
读懂 ECMAScript 规格
概述
规格文件是计算机语言的官方标准,详细描述语法规则和实现方法。
一般来说,没有必要阅读规格,除非你要写编译器。因为规格写得非常抽象和精炼,又缺乏实例,不容易理解,而且对于解决实际的应用问题,帮助不大。但是,如果你遇到疑难的语法问题,实在找不到答案,这时可以去查看规格文件,了解语言标准是怎么说的。规格是解决问题的“最后一招”。
这对 JavaScript
语言很有必要。因为它的使用场景复杂,语法规则不统一,例外很多,各种运行环境的行为不一致,导致奇怪的语法问题层出不穷,任何语法书都不可能囊括所有情况。查看规格,不失为一种解决语法问题的最可靠、最权威的终极方法。
本章介绍如何读懂 ECMAScript 6 的规格文件。
ECMAScript 6 的规格,可以在 ECMA 国际标准组织的官方网站(www.ecma-international.org/ecma-262/6.0/)免费下载和在线阅读。
这个规格文件相当庞大,一共有 26 章,A4 打印的话,足足有 545
页。它的特点就是规定得非常细致,每一个语法行为、每一个函数的实现都做了详尽的清晰的描述 ...
