ES6笔记
这篇blog用来收集学习ES6过程中遇到的大坑小坑、容易忽略的知识点等~ 可能会有二吧
参考资料
let和const命令
不存在变量提升
var
声明的变量存在变量提升个性,即先引用后声明,变量值为undefined
,let
声明的变量不允许变量提升,和一般的编译型语言相同,需要先声明后引用,否则将会抛出ReferenceError
错误
块级作用域
let
声明的变量只在所在的块级作用域中生效,ES6规定的块级作用域由{}
构成,可用于取代传统的立即执行函数表达式(IIFE)1
2
3
4
5
6
7
8
9
10//IIFE
(function (){
var a = 5;
console.log(a);
})();
//ES6块级作用域
{
let a = 5;
console.log(a);
}
其他
与var
不同,在外部用let
声明的变量并**到顶层对象window
/global
上1
2let x = 6;
console.log(window.x); //undefined
const命令的本质
const
命令保证的是该变量指向的内存地址中储存的值不发生变动,对于简单类型值,内存所保存的值就是自己,所以看起来就像常量无法改动;然而对于复合类型——数组、对象来说,内存所保存的值是一个指针,该指针指向的才是真正的数据结构
因此,将对象、数组声明为常量时,并不能保证内部数据不可变,只能保证该对象/数组还是原来的对象/数组1
2
3
4
5const t = {name: 'Mike'};
//可以执行
t.age = 17;
//报错 // TypeError: "t" is read-only
t = {};
变量的解构赋值
数组的解构赋值
解构不成功的情况下,变量值等于
undefined
1
2let [a, b, c] = ['a']
// a='a', b = undefined, c = undefined解构赋值的右边必须为可遍历的结构(如Array, Set, Generator函数或其他含有Iterator接口的对象)
1
let [a, b, c] = new Set(['a', 'b', 'c']);
解构赋值的默认值只有在右边数组成员存在
undefined
情况下才能生效1
2
3
4let [a, b='b'] = [1, undefined];
b //b
let [a, b='b'] = [1, null];
b //null解构赋值的默认值还可以是其他(已声明)的变量或者函数执行结果
1
2let [a=f()] = [...];
let [b=a] = [...]
对象的结构赋值
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
若变量不与属性同名,需写成:
1
let {foo: var_1, bar: var_2} = {foo: 'foo', bar: 'bar'};
与数组解构赋值一样,支持嵌套的解构赋值
1
2
3
4
5
6let obj = {
p: ['Hello', {y: 'World' }]
};
let { p: [x, { y }] } = obj;
x // "Hello"
y // "World"此处
p
为匹配的属性,后接匹配模式将一个已声明的变量用于解构赋值时,需要注意:
1
2
3let x;
{x} = {x: 'zed'};
// SyntaxError: syntax error因为JS引擎会将
{x}
解释为一个块级作用域,导致赋值不合法,正确的写法为:1
2
3let x;
({x} = {x: 'zed'});
x //zed对象解构赋值一个应用之处在于将某个对象的方法一次性赋值给变量:
1
let {sin, cos, log} = Math;
字符串、布尔值、数值的解构赋值
对于字符串,可看作是字符数组;对于布尔值与数值,会先转换为对象,再通过对象的toString
方法解构:1
2
3
4
5
6let {toString: s} = 123;
let {toString: k} = true;
console.log(s === Number.prototype.toString) //true
console.log(k === Boolean.prototype.toString) //true
console.log(s.apply(1234)); //1234
函数参数的解构赋值
1 | function func([x, y]) { |
- 可以使用默认值
用途
交换变量的值
1
2
3let x = 1;
let y = 2;
let [x, y] = [y, x];从函数返回多个值
1
2
3
4function func() {
return [1, 2, 3];
}
let [r1, r2, r2] = func();便于函数传参(自动对应)
- 提取JSON数据
- 输入模块的指定方法
- 指定函数参数的默认值
1
2
3
4
5
6
7
8
9
10
11
12jquery.ajax = function(url, {
async = true,
beforeSend = function () {},
cache = true,
complete = function () {},
crossDomain = false,
global = true,
// ... more config
} = {}) {
...
}
//其中第二个参数若未指定,则默认值为一个空对象
字符串扩展
箭头函数
箭头函数有几个使用注意点:
没有自身的this对象,也不能绑定this对象
1
2
3
4
5
6
7function outer() {
let x = 5;
return () => {
console.log(this.x);
}
}
console.log(outer()());不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误
- 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替
- 不可以使用yield命令,因此箭头函数不能用作Generator函数