ES6学习笔记(一)
根据阮一峰老师《ECMAScript 6入门》的ES6学习笔记。
let && const
let
let声明的变量只在let命令所在的代码块内有效。1234567var a = [];for (let i = 0; i < 10; i++) {a[i] = function () {console.log(i);};}a[6](); // 6上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。
- 不存在变量声明提升
- 暂时性死区(TDZ)
- 不允许重复声明
const
只在声明所在的块级作用域有效。对象冻结,应该使用Object.freeze方法- 为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性; 另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。
变量的解构赋值(数组、对象、字符串、数值与布尔值、函数参数、圆括号)
- 等号右边的值,要么转为对象以后不具备Iterator接口,要么本身就不具备Iterator接口({}),这种都会解构失败。 解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
- 解构可以指定默认值,但如果一个数组成员不严格等于undefined,默认值是不会生效的。
- 12let obj = { first: 'hello', last: 'world' };let { first: f, last: l } = obj;
对于{first:f,last:l}来说,first是变量名,l是属性名 也就是说赋值后应该访问的是l;
1let {foo} = {foo: 1}; //这种是变量名与属性名都是 foo 字符串的解构赋值
12const [a, b, c, d, e] = 'hello';let {length : len} = 'hello';//5用途
(1) 交换变量的值1[x, y] = [y, x];(2) 从函数返回多个值
(3)将一组函数参数与变量名连接起来1234567// 参数是一组有次序的值function f([x, y, z]) { ... }f([1, 2, 3]);// 参数是一组无次序的值function f({x, y, z}) { ... }f({z: 3, y: 2, x: 1});(4) 提取JSON数据
12345678910var jsonData = {id: 42,status: "OK",data: [867, 5309]};let { id, status, data: number } = jsonData;console.log(id, status, number);// 42, "OK", [867, 5309](5)函数参数的默认值
1234567891011jQuery.ajax = function (url, {async = true,beforeSend = function () {},cache = true,complete = function () {},crossDomain = false,global = true,// ... more config}) {// ... do stuff};(6)遍历Map结构
123456789var map = new Map();map.set('first', 'hello');map.set('second', 'world');for (let [key, value] of map) {console.log(key + " is " + value);}// first is hello// second is world(7)输入模块的指定方法 加载模块时,往往需要指定输入那些方法。解构赋值使得输入语句非常清晰。
1const { SourceMapConsumer, SourceNode } = require("source-map");