ES6 let const var和解构赋值-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1.let/const和var的区别
1.变量提升var会发生变量提升let和const不存在变量提升
2.暂时性死区变量声明之前变量不可用称为暂时性死区。var不存在let和const存在暂时性死区
3.typeof 不再是百分百不会报错let声明前不能使用typeof
typeof x; // Uncaught ReferenceError: Cannot access 'x' before initialization
let x;
4.不允许重复声明var重复声明会覆盖前一个let和const不允许重复声明用var声明过的也不允许let和const声明
5.函数内部var声明过的也不允许let和const声明有形参后不能再使用let声明
// 函数内部
function get(){
var b =1;
let b =6;
}
function get(b){
let b
}
2.块级作用域
1. 为什么要有块级作用域?
ES5 只有全局作用域和函数作用域没有块级作用域这带来很多不合理的场景
第一种场景内层变量可能会覆盖外层变量。
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}}
f(); // undefined
第二种场景用来计数的循环变量泄露为全局变量for (var i = 0; i < s.length; i++)
2. 特点允许块级作用域的任意嵌套里面可以访问外面的外面不可以访问里面的
每一层都是一个单独的作用域。每一层中的数据是不互通的。里面可以访问外面的外面不可以访问里面的
{
{
let a = 123;
}
console.log(a) // 報錯
}
// 里面可以访问外层的a
{
{
let a = 123;
{
console.log(a)
}
}
}
3. 对比es5之前的代码块需要使用匿名函数进行嵌套
let a = '全局';
{
let a = '局部'
console.log(a);
}
console.log(a);
var aa = '全局';
(function(){
var aa = '局部'
console.log(aa);
})()
console.log(aa);
3.const特殊的地方
1. const声明一个只读的常量。一旦声明常量的值就不能改变
2. const声明的变量不得改变值这意味着const一旦声明变量就必须立即初始化不能留到以后赋值
3.内存地址不变 里面的东西可以边
const foo = {};
// 为 foo 添加一个属性可以成功foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象就会报错
foo = {}; // TypeError: "foo" is read-only
4.如果真的想将对象冻结应该使用Object.freeze方法。const不能真正冻结对象
常量foo指向一个冻结的对象所以添加新属性不起作用严格模式时还会报错。
const foo = Object.freeze({});
// 常规模式时下面一行不起作用// 严格模式时该行会报错
foo.prop = 123;
'use strict';
const foo = Object.freeze({});
foo.prop = 123; // 報錯
5.for循环内使用let变量。
for循环还有一个特别之处就是设置循环变量的那部分是一个父作用域而循环体内部是一个单独的子作用域。
这种for循环和循环体内使用的是用一个变量所以最后输出的是6
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};}
a[6](); // 6
以下这种for循环和循环体内都由单独的作用域变量所以每次输出的都是自己作用域的变量‘abc’
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc// abc// abc