- 使用var声明变量时,该变量的作用域是其最近的函数。
- 而使用let声明变量,它的作用域只在包含它的块。
if(true) {
let x = 1;
}
console.log(x); // x is not defined
let list = [1, 3, 5, 8];
for(let i =0, l = list.length; i < l; i++) {
// do something
}
console.log(i); // i is not defined
for(var i =0, l = list.length; i < l; i++) {
// do something
}
console.log(i); // 4
此方案很容易出现Bug
- 使用const,你可以声明一个只读的值,必须直接指定一个值
- 如果尝试改变它的值或者没有立即指定一个值,就会得到下面的错误:
repl: Line 26: "MY_CONSTANT" is read-only repl: Unexpected token (27:16)
const MY_CONSTANT = 1;
// MY_CONSTANT = 2; // Error
// const SOME_CONST; // Error
const MY_OBJECT = {name: 'AidenZou'};
MY_OBJECT.name = '子凡'; // Cool
注意,你还是可以修改对象的属性或者数组的成员
let users = [{name: 'AidenZou', age: 18}, {name: '子凡', age:15}];
let names = users.map( item => item.name);
console.log(names) // ["AidenZou","子凡"]
let ages = users.map(function(item) {
return item.age;
});
console.log(ages); // [18,15]
箭头函数的语法,其中没有function关键字,剩下的就是0个或多个参数、(=>)箭头和函数表达式。注意:return语句将隐式地被添加进来。 如果是0个或多个参数,必须添加括号:
console.log([1, 2].map( () => 1 )); // [1,1]
console.log([1, 2].map( (n, index) => n * index )); // [0,2]
如果需要更多的逻辑或者空白区域,可以将函数表达式放在({…})块中。
[1, 3, 5].map( n => {
n = n % 3;
return n;
});
箭头函数不仅仅意味着更少的字符,它的行为也不同于常规的函数。一个箭头函数从它的外界上下文中继承this和arguments关键字。这表示你可以摆脱以前那些难看的语句,比如var that = this,而且不需要绑定函数到正确的上下文中。下面有一个例子(注意:this.title等同于ES5版本的that.title):
// ES6
let book = {
title: 'X',
sellers: ['A', 'B'],
printSellers() {
this.sellers.forEach(seller => console.log(seller + ' sells ' + this.title));
}
}
book.printSellers();
// ES5
var book5 = {
title: 'X',
sellers: ['A', 'B'],
printSellers: function() {
var that = this;
this.sellers.forEach(function(seller) {
console.log(seller + ' sells ' + that.title)
})
}
}
book5.printSellers();
String的prototype中添加了几个方便的方法,大部分是indexOf方法的变通:
'aiden zou'.startsWith('aiden'); // true
'aiden zou'.endsWith('aiden'); // false
'aiden zou'.includes('aiden'); // true
// 方便创建重复字符串的方法
'aiden zou'.repeat(3); // aiden zouaiden zouaiden zou
模板字符串提供了一个简洁的方式去创建字符串和实现字符串插值。你可能已经熟悉了它的语法,模板字符串基于符号和花括号符号和花括号{…},要使用引号将其包围。
let name = 'Aiden',
apples = 5,
pears = 7,
bananas = function() { return 3; }
console.log(`This is ${name}.`); // This is Aiden.
console.log(`He carries ${apples} apples, ${pears} pears, and ${bananas()} bananas.`); // He carries 5 apples, 7 pears, and 3 bananas.
// ES5
console.log('He carries ' + apples + ' apples, ' + pears + ' pears, and ' + bananas() +' bananas.'); // He carries 5 apples, 7 pears, and 3 bananas.
和ES5相比较,模板字符串仅仅只是方便字符串的串联。模板字符串通常应用于多行字符串,请记住,空白是字符串的一部分。
let xstr = `1...
2...
3 lines long!`; // Yay
console.log(xstr)
// 1...
// 2...
// 3 lines long!
// ES5
var xstr5 = "1...\n" +
"2...\n" +
"3 lines long!";
// res
var res = "1...\n2...\n3 lines long!";