正则的扩展
RegExp 构造函数
在 ES5 中,RegExp构造函数的参数有两种情况。
第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag)。
123var regex = new RegExp('xyz', 'i');// 等价于var regex = /xyz/i;
第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝。
123var regex = new RegExp(/xyz/i);// 等价于var regex = /xyz/i;
但是,ES5 不允许此时使用第二个参数添加修饰符,否则会报错。
12var regex = new RegExp(/xyz/, 'i');// Uncaught TypeError: Cannot supply flags when constructing one RegExp from another
ES6
改变了这种行为。如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会 ...
字符串的新增方法
本章介绍字符串对象的新增方法。
String.fromCodePoint()
ES5 提供String.fromCharCode()方法,用于从 Unicode
码点返回对应字符,但是这个方法不能识别码点大于0xFFFF的字符。
12String.fromCharCode(0x20BB7)// "ஷ"
上面代码中,String.fromCharCode()不能识别大于0xFFFF的码点,所以0x20BB7就发生了溢出,最高位2被舍弃了,最后返回码点U+0BB7对应的字符,而不是码点U+20BB7对应的字符。
ES6
提供了String.fromCodePoint()方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode()方法的不足。在作用上,正好与下面的codePointAt()方法相反。
1234String.fromCodePoint(0x20BB7)// "?"String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y ...
字符串的扩展
本章介绍 ES6
对字符串的改造和增强,下一章介绍字符串对象的新增方法。
字符的 Unicode 表示法
ES6 加强了对 Unicode
的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的
Unicode 码点。
12"\u0061"// "a"
但是,这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。
12345"\uD842\uDFB7"// "?""\u20BB7"// " 7"
上面代码表示,如果直接在\u后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript
会理解成\u20BB+7。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。
ES6
对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
1234567891011"\u{20BB7}"// "?&quo ...
变量的解构赋值
数组的解构赋值
基本用法
ES6
允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
以前,为变量赋值,只能直接指定值。
123let a = 1;let b = 2;let c = 3;
ES6 允许写成下面这样。
1let [a, b, c] = [1, 2, 3];
上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。
1234567891011121314151617181920let [foo, [[bar], baz]] = [1, [[2], 3]];foo // 1bar // 2baz // 3let [ , , third] = ["foo", "bar", "baz"];third // "baz"let [x, , y] = [1, 2, 3];x // 1y // 3let [h ...
let 和 const 命令
let 命令
基本用法
ES6
新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
1234567{ let a = 10; var b = 1;}a // ReferenceError: a is not defined.b // 1
上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。
for循环的计数器,就很合适使用let命令。
123456for (let i = 0; i < 10; i++) { // ...}console.log(i);// ReferenceError: i is not defined
上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。
下面的代码如果使用var,最后输出的是10。
1234567var a = [];for (var i = 0; i ...
Object 对象
概述
JavaScript
原生提供Object对象(注意起首的O是大写),本章介绍该对象原生的各种方法。
JavaScript
的所有其他对象都继承自Object对象,即那些对象都是Object的实例。
Object对象的原生方法分成两类:Object本身的方法与Object的实例方法。
(1)Object对象本身的方法
所谓“本身的方法”就是直接定义在Object对象的方法。
1Object.print = function (o) { console.log(o) };
上面代码中,print方法就是直接定义在Object对象上。
(2)Object的实例方法
所谓实例方法就是定义在Object原型对象Object.prototype上的方法。它可以被Object实例直接使用。
123456Object.prototype.print = function () { console.log(this);};var obj = new Object();obj.print() // Object
上面代码中,Obje ...
ECMAScript 6 简介
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在
2015 年 6 月正式发布了。它的目标,是使得 JavaScript
语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
ECMAScript 和 JavaScript
的关系
一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?
要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者
Netscape 公司,决定将 JavaScript 提交给标准化组织
ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262
号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为
ECMAScript,这个版本就是 1.0 版。
该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫
JavaScript,有两个原因。一是商标,Java 是 Sun
公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript
...
console 对象与控制台
console 对象
console对象是 JavaScript 的原生对象,它有点像 Unix
系统的标准输出stdout和标准错误stderr,可以输出各种信息到控制台,并且还提供了很多有用的辅助方法。
console的常见用途有两个。
调试程序,显示网页代码运行时的错误信息。
提供了一个命令行接口,用来与网页代码互动。
console对象的浏览器实现,包含在浏览器自带的开发工具之中。以
Chrome 浏览器的“开发者工具”(Developer
Tools)为例,可以使用下面三种方法的打开它。
按 F12 或者Control + Shift + i(PC)/
Command + Option + i(Mac)。
浏览器菜单选择“工具/开发者工具”。
在一个页面元素上,打开右键菜单,选择其中的“Inspect Element”。
打开开发者工具以后,顶端有多个面板。
Elements:查看网页的 HTML 源码和 CSS 代码。
Resources:查看网页加载的各种资源文件(比如代码文件、字体文件
CSS 文件等),以及在硬盘上创建的各种内容 ...
编程风格
概述
“编程风格”(programming
style)指的是编写代码的样式规则。不同的程序员,往往有不同的编程风格。
有人说,编译器的规范叫做“语法规则”(grammar),这是程序员必须遵守的;而编译器忽略的部分,就叫“编程风格”(programming
style),这是程序员可以自由选择的。这种说法不完全正确,程序员固然可以自由选择编程风格,但是好的编程风格有助于写出质量更高、错误更少、更易于维护的程序。
所以,编程风格的选择不应该基于个人爱好、熟悉程度、打字量等因素,而要考虑如何尽量使代码清晰易读、减少出错。你选择的,不是你喜欢的风格,而是一种能够清晰表达你的意图的风格。这一点,对于
JavaScript 这种语法自由度很高的语言尤其重要。
必须牢记的一点是,如果你选定了一种“编程风格”,就应该坚持遵守,切忌多种风格混用。如果你加入他人的项目,就应该遵守现有的风格。
缩进
行首的空格和 Tab 键,都可以产生代码缩进效果(indent)。
Tab 键可以节省击键次数,但不同的文本编辑器对 Tab
的显示不尽相同,有的显示四个空格,有的显示两个空格,所以有人觉得,空格 ...
错误处理机制
Error 实例对象
JavaScript
解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。JavaScript
原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例。
12var err = new Error('出错了');err.message // "出错了"
上面代码中,我们调用Error()构造函数,生成一个实例对象err。Error()构造函数接受一个参数,表示错误提示,可以从实例的message属性读到这个参数。抛出Error实例对象以后,整个程序就中断在发生错误的地方,不再往下执行。
JavaScript
语言标准只提到,Error实例对象必须有message属性,表示出错时的提示信息,没有提到其他属性。大多数
JavaScript
引擎,对Error实例还提供name和stack属性,分别表示错误的名称和错误的堆栈,但它们是非标准的,不是每种实现都有。
message:错误提示信息
name:错误名称(非标准属性)
stack:错误的堆栈(非标准属性)
使用name和message这两个属 ...
