一、let与const:
let声明的变量只在let命令所在的代码块有效,let只能声明一次,不存在变量提升,存在暂时性死区。
const声明一个只读变量,一旦声明,常量的值就不能改变,声明的同时必须初始化,不存在变量提升,存在暂时性死区,只是保证地址不变就可以,如果指向一个{},是可以给该对象添加属性的,但是不能指向别的对象。
var声明的变量在方法块内有效,var可以声明多次,变量提升。
经典案例:for循环下的var和let
变量i是用var声明的,在全局范围内有效,所以全局中只有一个变量i,每次循环时,setTimeout定时器里面的i指的是全局变量i,而循环里的十个setTimeout在循环结束后才执行,所以此时的i都是10。
for(var i=0;i<10;i++){
setTimeout(funciton(){
console.log(i);
});
}
//输出十个10
变量j是用let声明的,当前的j只在本轮循环中有效,每次循环的j都是一个新的变量,所以setTimeout定时器里的j其实是不同的变量,即最后输出123456789。(若每次循环的变量j都是重新声明的,如何知道前一个循环的值?这是因为JavaScript引擎内部会记住前一个循环的值。
for(let j=0;j<10;j++){
setTimeout(funciton(){
console.log(j);
});
}
//输出0123456789
es6声明变量的方法一共有6种:var、function、let、const、import、class
let、const、class声明的全局变量补数据顶层对象(window)的属性
二、变量的解构赋值
ES6允许:按照一定的模式从数组和对象中提取值,然后对变量进行赋值。
1、数组的解构赋值:只要等号两边的模式相同,左边的变量就会被赋予对应的值。
例子1:
例子2:
例子3:
例子4:
let [{b:r},y]=[{a:1,b:[2,3]},{c:4,d:[5]}];
对于Set结构,也可以使用数组的结构赋值:(Set结构成员是唯一的,没有重复的值)
let [x,y,z] = new Set(['a','b','c']);
解构赋值允许赋默认值:
let [x,y='b'] = ['a']; //x为a,y为b
注意:对应默认值的位置,必须是严格的undefined,===undefined,null都不可以
默认值可以引用解构赋值的其他变量,但该变量必须已经声明:
let [x=1,y=x] = []; //x=1,y=1
let [x=1,y=x] = [2]; //x=2,y=2
let [x=1,y=x] = [1,2]; //x=1,y=2
let [x=y,y=1] = []; //ReferenceError 报错是因为x用到默认值y的值,但是y还没有声明
2、对象的解构赋值:数组的元素是按次序排列的,变量的取值是由他的位置决定的;而对象必须与属性同名才能取到正确的值。
例1:let {bar,foo} = {foo:'a',bar:'b'}; //bar为b,foo为a
例2:let {baz} = {foo:'a',bar:'b'}; //解构失败,baz为undefined,因为没有与之对应的key
如果变量名与属性名不一致,必须写成下面这样,指定key:
例3:var {foo:baz} = {foo:'aaa',bar:'bbb'}; //baz为aaa
解构也可以用于嵌套解构的对象:
例4:
证明解构是快照,不是引用。
例5:大括号不可以位于行首,否则会被认为为代码块,要用小括号扩起来
例6、对象解构也可以指定默认值:
var {x:y=3} = {x:5}; //y等于5
默认生效的条件同样是,对象的属性值严格等于undefined。
例7、由于数组的本质是对象,因此可以对数组进行对象属性的赋值:
3、字符串的解构赋值:
字符串被转换成类似数组的对象
const [a,b,c,d,length:len] = 'hello'; //a:h; b:e; c:l; d:l; len:5
4、数值和布尔值的解构赋值:
如果等号右边是数值或布尔值,会先法转为对象。
let{toString:s} = 123;
s===Number.prototype.toString; //true
let{toString:s} = true;
s===Boolean.prototype.toString; //true
5、函数参数的解构赋值:
第一种形式:给x,y指定默认值
第二种形式:给move方法的参数指定默认值
注意:解构时,非必要不要使用圆括号。
6、解构的用途:
1)变换变量的值:
let x=1;
let y=2;
[x,y] = [y,x];
2)从函数返回多个值:
function example(){
return [1,2,3];
}
let [a,b,c] = example();
function example(){
return {
foo:1,
bar:2
}
}
let {foo,bar} = example();
3)函数参数的定义:
function a([x,y,z]){
...
}
a([1,2,3]);
function b({x,y,z}){
...
}
b({y:2,x:1,z:3});
上面这个就很实用了,想要啥拿啥
4)提取json数据:
let jsonData = {
id:42,
status:'ok'
};
let {id,status} = jsonData;
5)遍历Map解构:
var map = new Map();
map.set('first','hello');
map.set('second','world');
for(let [key,value] of map){
...
}
for(let [key] of map){
...
}
for(let [,value] of map){
...
}
6)输入模块指定方法:
const {SourceMapCon,SourseNode} = require('source-map');
三、字符串的扩展