ES6学习笔记1(let、const及变量的解构赋值)
Reading Time:The full text has 811 words, estimated reading time: 5 minutes
Creation Date:2017-06-29
Previous Article:ES6学习笔记2(基础语法的拓展)
Next Article:渗透测试之目标主机识别
BEGIN
申明
阮一峰老师的ECMAScript 6学习笔记。
let声明变量
- let申明的变量只在当前代码块中有效。
- let申明变量不存在变量提升,一定遵循先声明后使用的原则。
- 暂时性死区(temporal dead zone):当代码块中有let申明的变量,不管外部是否有此同名变量的其它申明,在此代码块中依然严格遵循先申明后使用的原则。由于此特性,变量的类型检测typeof将不再安全。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
- 不允许重复申明。
const申明常量
- const申明常量的同时必须立即赋值。
- 一旦申明,常量的值不能改变。
- const申明的常量只在当前代码块中有效。
- 同let存在暂时性死区及不可重复申明的特性。
- 本质 {% cq %}const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。{% endcq %}
变量的解构赋值
概念:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。只要某种数据结构可迭代,都可以采用数组形式的解构赋值。
数组的解构赋值:
let [a, [b, c], d] = [1, [2, 3], 4]; //a=1, b=2 ,c=3, d=4
let [ , , c] = [1, 2, 3]; //c=3
let [a, ...c] = [1, 2, 3]; //a=1, c=[2, 3]
let [a, b, ...d] = [1]; //a=1, b=underfined, c=[]
//默认值的使用,生效条件:数组的值对应严格等于undefined
let [a, b = 2] = [1]; //a=1, b=2
let [a, b = 2] = [1, undefined]; //a=1, b=undefined
let [a, b = 2] = [1, 3]; //a=1, b=3
对象的解构赋值:
let {a, b, c} = { a: 1, b: 2}; //a=1, b=2, c=unfefined
let {first: f, last: l} = {first: 'hello', last: 'world'}; //f=hello, l=world
let {p: [x, {y}]} = {p: ['hello', {y: 'world'}]}; //x=hello, y=world, p此时为模式不是变量
//默认值的使用,生效条件:对象的属性值严格等于undefined
let {x, y = 5} = {x: 1}; //x=1, y=5
let {x: y = 3} = {} //y=3
let {x: y = 3} = {x: 5} //y=5
将现有对象的方法,赋值到某个变量let {log, sin, cos} = Math
字符串的解构赋值
字符串将被转换成一个类似数组的对象。
let [a, b, c, d] = 'hello' //a=h, b=e, c=l, d=l
let {length: ll} = 'hello' //ll=5
函数参数的解构赋值
function add([x, y]){
return x+y;
}
add([1,2]) //3
[[1, 2], [3, 4]].map(([a, b]) => a + b); //[3, 7]
用途举例
- 交换变量的值。
- 函数返回多个值。
- 函数参数的定义。
- 提取json数据。
- 遍历Map解构。
var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
- 提取模块的指定方法:
const { SourceMapConsumer, SourceNode } = require("source-map");
FINISH
Previous Article:ES6学习笔记2(基础语法的拓展)
Next Article:渗透测试之目标主机识别