ES6重点小结
let & const
let和const是ES6新增的指令。
块级作用域-仅在所在的代码块内有效。
不存在变量提升-变量仅在声明语句之后才可以使用。
暂时性死区(temporal dead zone, TDZ)-在代码块内,使用let命令声明变量之前,该变量都是不可用的。
不允许重复声明-在相同作用域内,重复声明同一个变量会报错。
const声明一个只读常量,必须在声明时赋值,赋值后该常量不可改变。
变量的解构赋值
- 数组的解构赋值
只要等号两边的模式相同,左边的变量就会被赋予对应的值:
如果解构不成功,变量的值等于undefined:var [a, b, c] = [1, 2, 3]; //a = 1, b = 2, c = 3 var [a, [[b], c]] = [1, [[2], 3]]; //a = 1, b = 2, c = 3 var [a, ... b] = [1, 2, 3, 4]; // a = 1, b = [2, 3, 4]
对undefined/null解构会报错(解构只能用于数组或对象):var [a] = []; var [a] = 1; var [a] = 's'; ...
解构赋值允许指定默认值:var [a] = undefined; var [a] = null;
除var外,解构赋值也适用于let/const。var [a = 'b'] = []; //a = 'b';
对象的赋值解构
对象的解构与数组有一个重要的不同-数组元素按次序排列,变量的取值由其位置决定。对象的属性没有次序,变量必须与属性同名才能取到正确的值。var {bar, foo} = {foo: 'aaa', bar: 'bbb'}; console.log(bar); //aaa console.log(foo); //bbb var {baz} = {foo: 'aaa'}; console.log(baz); //undefined
变量与属性名不一致的赋值方式:
var {foo: baz} = {foo: 'aaa'}; console.log(baz); //aaa
对象的嵌套解构:
var o = { p: [ 'Hello', {y: 'World'} ] }; var {p: [x, {y}]} = o; console.log(x); //Hello console.log(y); //World
字符串的扩展
- ES6新提供了三种方法判断某字符串是否包含在另一个字符串中:
前两个函数中的第二个参数均表示开始位置,endsWith中的beginLength表示查看前n个字符:boolean contains(string [, beginIndex]); boolean startsWith(string [, beginIndex]); boolean endsWith(string [, beginLength]);
"abc".endsWith("bc"); //true "abc".endsWith("bc", 2); //false "abc".endsWith("ab", 2); //true
- repeat(n):返回一个新字符串,该字符串将原字符串返回n次:
let b = "a".repeat(3); console.log(b); //"aaa";
- 模板字符串(template string)-用反引号(`)标志,用三种作用:
i. 同单引号”‘“一样,用于定义普通字符串
ii. 用于定义多行字符串let a = `ddd`; console.log(a); //ddd
iii. 定义模板let a = `ab c`; console.log(a); //ab(换行)c
这里需要注意的是模板并不会随变量内容的改变而改变:let name = "Alex"; let t = `hello ${name}` console.log(t); //hello Alex
且在使用前要预先定义好该变量:let name = "Alex"; let t = `hello ${name}`; console.log(t); //hello Alex name = 'John'; console.log(t); //hello Alex
let t = `hello ${undefinedVar}`; //Uncaught ReferenceError: undefinedVar is not defined