一 . let定义变量
1)let定义的变量只在代码块{ }内使用有效,在代码块外使用会报错(for循环的计数器很适用,f0r循环的内部是一个父作用域,循环体内部是一个单独的作用域)
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
2)vart定义的变量存在预解析(即变量可以在声明之前使用,值为undefind).let定义的变量须先定义后使用。
暂时性死区(TDZ):在代码块内,变量使用let声明,在声明之前使用(死区)就会报错。
// 不报错
var x = x;
// 报错
let x = x;
// ReferenceError: x is not defined
3)let定义的变量不允许在相同作用域内重复声明,所以不能再函数体内部重新声明参数。
二.块级作用域
1.外层代码块不受内层代码块的影响,各个代码块之间的变量互不影响
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
三. const定义常量
定义常量( 作用于块级作用域),一旦声明,常量的值就不能改变,所以const一旦声明变量,就必须立即初始化,不能留到以后赋值。其他特性和let一样。
四. 解构赋值
1.作用:ajax交互数据
2.数组的解构赋值 注意:左右结构格式一致,左边等于右边
let[a,b,c]=[12,[5,6]];
console.log(a,b,c) //12 [5,6] undefind
let [a,[b,c]]=[12,[5,6]]
console.log(a,b,c) //12 5 6
let json={name:'nana',age:18,job:'fe'};
let {name,age,job}=json;
console.log(name,age,job) //nana 18 fe
let {name,age,job:ui}=json
console.log(name,age,ui) //nana 18 fe(如果打印job结果为undefind, job:ui 意思为给job取个别名为ui)
给一个默认值:ES6 内部使用严格相等运算符(===
),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined
,默认值才会生效。
let=[a,b,c="暂无数据"]=['aa','bb'];
console.log(a,b,c) //aa bb 暂无数据
let [a,b,c]=['aa','bb',undefind];
console.log(a,b,c) //aa bb undefind
let=[a,b,c="暂无.."]=['aa','bb',undefind];
console.log(a,b,c) //aa bb 暂无..
let=[a,b,c="暂无.."]=['aa','bb',null];
console.log(a,b,c) //aa bb null 定义为null时代表有值,不是没值,一个空对象
3.对象的解构赋值
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
foo // error: foo is not defined
//对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。