你可能已经听说过 ECMAScript 6
(简称 ES6)了。ES6 是 Javascript 的下一个版本,它有很多很棒的新特性。这些特性复杂程度各不相同,但对于简单的脚本和复杂的应用都很有用。在本文中,我们将讨论一些精心挑选的 ES6 特性
,这些特性可以用于你日常的 Javascript 编码中。
请注意,当前浏览器已经全面展开对这些 ES6 新特性的支持,尽管目前的支持程度还有所差异。如果你需要支持一些缺少很多 ES6 特性的旧版浏览器,我将介绍一些当前可以帮助你开始使用 ES6 的解决方案。
文中大多数代码示例都带有“运行代码”链接,你可以查看代码并运行它。
变量
LET
你习惯于用 var
声明变量。现在你也可以用 let
了。两者微妙的差别在于作用域。var
声明的变量作用域为包围它的函数,而 let
声明的变量作用域仅在它所在的块中。
1 2 3 4 |
if(true) { let x = 1; } console.log(x); // undefined |
这样使得代码更加干净,减少滞留的变量。看看以下经典的数组遍历:
1 2 3 4 5 |
for(let i = 0, l = list.length; i < l; i++) { // do something with list[i] } console.log(i); // undefined |
举个例子,通常情况下,我们在同一作用域里使用变量 j
来完成另一个遍历。但是,现在有了 let
,可以安全地再一次声明 i
变量。因为它只在被声明的块中有效。
CONST
还有另一个用于声明块作用域变量的方法。使用 const
,你可以声明一个值的只读引用。必须直接给一个变量赋值。如果尝试修改变量或者没有立即给变量赋值,都将报错:
1 2 3 |
const MY_CONSTANT = 1; MY_CONSTANT = 2 // Error const SOME_CONST; // Error |
注意,对象的属性或数组成员还是可以改变的。
1 2 |
const MY_OBJECT = {some: 1}; MY_OBJECT.some = 'body'; // Cool |
箭头函数
箭头函数为 Javascript 语言增色不少。它使得代码更简洁。我们早早地在本文中介绍箭头函数,这样就可以在后面的示例中加以利用了。以下代码片段是箭头函数和我们熟悉的 ES5 版本的写法:
1 2 3 4 5 6 7 8 |
let books = [{title: 'X', price: 10}, {title: 'Y', price: 15}]; let titles = books.map( item => item.title ); // ES5 equivalent: var titles = books.map(function(item) { return item.title; }); |
如果我们观察箭头函数的语法,会发现其中并没有出现 function
关键词。只保留零或多个参数,“胖箭头”(=>
)和函数表达式。return
声明被隐式加入。
带有零或多个参数时,必须使用括号:
1 2 3 4 5 |
// No arguments books.map( () => 1 ); // [1, 1] // Multiple arguments [1,2].map( (n, index) => n * index ); // [0, 2] |
如果需要写更多的逻辑或更多的空格,可以把函数表达式放在({...}
)块中。
1 2 3 4 |
let result = [1, 2, 3, 4, 5].map( n => { n = n % 3; return n; }); |
箭头函数不单只是为了输入更少的字符,它们的表现也和一般函数不同。它继承了当前上下文的 this
和 arguments
。这就意味着,你可以避免写 var that = this
这样丑陋的代码,也不需要把函数绑定到正确的上下文了。举例如下(注意对比 this.title
和 ES5 版本的 that.title
的不同):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
let book = { title: 'X', sellers: ['A', 'B'], printSellers() { this.sellers.forEach(seller =>console.log(seller + ' sells ' + this.title)); } } // ES5 equivalent: var book = { title: 'X', sellers: ['A', 'B'], printSellers: function() { var that = this; this.sellers.forEach(function(seller) { console.log(seller + ' sells ' + that.title) }) } } |
字符串
方法
几个方便的方法被添加到 String
的原型中。其中大多数用于简化需要用 indexOf()
方法来解决的问题的复杂度,并达到同样的效果:
1 2 3 |
'my string'.startsWith('my'); //true 'my string'.endsWith('my'); // false 'my string'.includes('str'); // true |
很简单但是很有效。添加了另外一个方便的用于创建重复字符串的方法:
1 |
'my '.repeat(3); // 'my my my ' |
模板字符串
模板字符串提供一个简洁的方式来实现字符串插值。你可能已经对这种语法很熟悉了;它基于美元符号和花括号 ${..}
。模板字符串置于引号之中。以下是快速示例:
1 2 3 4 5 6 7 8 9 10 11 |
let name = 'John', apples = 5, pears = 7, bananas = function() { return 3; } console.log(`This is ${name}.`); console.log(`He carries ${apples} apples, ${pears} pears, and ${bananas()} bananas.`); // ES5 equivalent: console.log('He carries ' + apples + ' apples, ' + pears + ' pears, and ' + bananas() +' bananas.'); |
以上形式对比 ES5 仅仅是便于字符串拼接。事实上,模板字符串还可以用于多行字符串。记住空格也是字符串的一部分。
1 2 3 4 5 6 7 8 9 10 |
let x = `1... 2... 3 lines long!`; // Yay // ES5 equivalents: var x = |