ECMAScript6笔记(一)
一、let
1、let声明的变量拥有块级作用域。
2、解决了循环绑定事件等问题
for(let i = 0;i < 10;i ++){
a[i] = function(){
console.log(i);
}
}
a[5]();// 5
3、没有变量提升
块级作用域中有let和外部有var声明同一变量时,let生效,var不生效。
var tmp = 1;
if(a){
tmp = 2; // 报错
let tmp;
tmp = 3; // tmp = 3
}
// tmp = 1
4、同级作用域不能重复声明同一变量
5、可用{}自定义块级作用域
6、块级作用域中的函数声明
在块级作用域中声明函数不能在作用域外调用,函数声明只提升到块级作用域的顶部,尽量块级作用域中少使用函数声明,可以用函数表达式
二、const
1、声明常量
声明必须和初始化一起,不允许先声明后初始化,如果仅仅声明也会报错。
只在声明的块级作用域中有效,不能重复声明,没有变量提升。
2、声明复合类型变量
复合类型变量变量名不指向数据,而是指向地址,const只能保证变量的地址不会改变,不会保证地址的数据不会变,也就是说声明对象的时候,对象内的值可以改变,也可以添加新属性。可以通过Object.freeze({})冻结对象,这样对象的就不能添加新的属性了。可以通过如下函数将对象的属性也冻结
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, value) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
三、全局变量
var和function声明的变量可以成为全局变量的属性,let、class和const声明的变量不会成为全局变量的属性。也就是说
var a = 1;
window.a; // 1
let a = 2;
window.b; // undefined
四、解构赋值
1、数组的解构赋值
只要左右格式相似就可以实现解构赋值(右边必须是数组,如果不是会报错),如果左边有右边没有的则是undefined,let和const也可以。
var [a,[b],c] = [1,[2]];
//a = 1;b = 2;c = undefined;
数组解构复制的默认值是undefined
function f(){
console.log('aa');
}
var [a,b = 'c',d = 'e',x = f(),y = x] = [1,undefined,null,1];
// a = 1,b = c,d = null,x = 1,y = 1(如果x右边没有值才会等于f())
2、对象的解构赋值
var {foo,bar,www} = {bar : "bbb",foo : "aaa"};
// foo = aaa,bar = bbb,www = undefined
var obj = {foo : "aaa",baz : "ccc"};
var {foo:one,baz:two} = obj;
// one = aaa,two = ccc
对象解析的内部机制是,先找到同名属性,然后赋值给后者变量(foo:baz,foo是同名属性是模式,baz是后者)。":"左边的都是模式,右边才是赋值,如果有嵌套,直到最后的”:“右边才是变量
let,const在同级作用域下声明和赋值必须是一起的。但是var没事,可以通过{}改变作用域来实现,但是避免如下情况
let foo;
let {foo} = {foo : "bbb"}// 报错
let baz;
(let {baz} = {baz : "bb"})// 成功
var a;
{a} = {a:"cc"}// 报错
var b;
({a} = {a : 1})// 成功
var let {sin,cos} = Math;//很方便的赋值
其他跟数组解构赋值相似
3、字符串解构赋值
let [a,b,c,d,e] = 'hello';
// a = 'h',b = 'e',c = 'l',d = 'l'.e = 'o'
let {length : len} = 'hello';
//len = 5,length是获取'hello'的length
4、数值和布尔值的解构赋值
会将等号右边是数值和布尔值转换为对象然后进行解构赋值,但是null和undefined无法转换,会报错
5、函数参数解构赋值
function a([foo,bar]){}
a([1,2]);
function b({foo,bar}){}
b({foo:1,bar:2});
6、圆括号
在解构非模式部分使用
7、用途
(1)交换变量的值
(2)从函数返回值
function f(){
return [1,2,3];
}
let [a,b,c] = f();
(3)提取JSON数据
var json = {
id : 12,
name : ""123
}
let {a,b} = json;
(4)函数传参
(5)遍历Map结构
var map = new Map();
map.set('first','hello');
map.set('second','nihao');
for(let[key,value] of map){
console.log(key + value);
}
// first hello
// second nihao
for(let[key] of map)
//遍历键值
for(let[,value] of map)
//遍历值

浙公网安备 33010602011771号