暂时性死区: 作用域开始 到用let定义变量这段区间内为暂时性死区。let 不会变量提升
let
- 不会变量提升。


在同一个作用域下不可以重复声明 会出现引用错误


只能在当前作用域下生效 出现ReferrenceError


let 和 const 的区别
总结
// let 在同一个作用域下不可重复声明// let 不会提升// let 只能在当前作用域下生效// demo1{let a = 1;}console.log(a) // 报错 a.is not defined// demo2if(1){let a = 1;}console.log(a) // 报错 a.is not defined// demo3for(;1;){let a = 1;}console.log(a)// 不报错 但是死循环了、// demo4for(let i = 0; i < 10; i++){}console.log(i)// 报错 i.is not defined// demo5var arr = [];for(var i = 0;i< 10; i++){arr[i] = function(){console.log(i);}}for(var i=0;i<arr.length;i++){arr[i]();//0-9}// demo6for (var i = 0; i < 5; i++) {i = 'a';console.log(i);}// demo7// 好像可以拿到i的值for (let i = 0; i < 5; i++) {i = 'a';console.log(i);}// demo8for (let i = 0; i < 5; i++) {var i = 'a';// i has already been declaredconsole.log(i);}// demo9for(let i = 0;i< 10; i++){let i = 0;// i has already been declaredconsole.log(i);}if(1){let a = 1;{let a = 2;}}// let 本质就是为了js添加一个块级作用域////////// 结构结构赋值//let = [ a ]= [1];let {(a: b)} = {}; // 报错 Uncaught SyntaxError: Unexpected token '('let {(a):b} = {}; // 报错 Uncaught SyntaxError: Unexpected token '('let (a:(b))= {}; // 报错 Uncaught SyntaxError: Unexpected token '('// 用 let/var 声明加括号就报错。function foo([z]){return z;}console.log(foo([1]))let arr = [1,2,3];let {0:first,[arr.length-1]:last} = arr;// 数组也是特殊的对象 也能进行解构赋值// [(b)] = [3] // 3// ([b]) = [3] // 报错({a:(b) = {}}); // b = {} 本身并未匹配 {a:b={}};默认值// var a= {};// [(a.b)] = [3]; // a.b = 3;// console.log(b) // b is not defined////// let a = 'x',b = 'y',obj = {};// ({a: obj[a + b]} = {a: 2});// console.log(obj) //{xy:2};//////// let obj={a: 1,b: 2,c: 3},obj2={} ;// ({a: obj2.x,b:obj2.y,c:obj2.z})////// 值交换// let a =10,b=20;// [b,a] = [a,b];////// 变量的解构 就是变量的赋值,变量通过模式匹配来解构赋值。////// let {a:x,a:y} = {a:1};// console.log(x,y);//1 1////var x = 200,y = 300, z = 100;var obj1 = {x: {y: 42},z: {y: z}};({y:x = {y:y}}={obj1})({z:y = {y:z}}={obj1})({x:z = {y:x}}={obj1})解构中使用对象或者数组的时候慎用 代码可读性很差function test([x,y]){console.log(x,y);}// test(1,2) //1,2// test([1]) //1// test() //报错function foo({x,y}){console.log(x,y);}foo({x:1,y:1});function foo({x = 10} = {},{y} = {y:10}){console.log(x,y);}// foo() 10,10// foo({},{}) 10 undefined// foo({x:2},{y:3}) 2,3// {X:X=3}==>{X=3};// 解构的隐式类型转换// 字符串->数组const [a,b,c,d,e] = "hello";// 'hello' => 数组// 字符串->类数组let {length:len} = "hello";// number->包装类let {toString:s} = 123;// console.log(s === Number.prototype.toString) true// 布尔值,number,string 都能进行隐式类型转换。转换成相对应的包装类////// undefined ,null 不能进行隐式类型转换let {prop} = undefined;/***************************************************/// 形参有默认值的时候 形参和实参的映射关系就不存在了。function foo ({x,y=5} = {}) {}// foo({}) undefined 5// foo({x:1}) 1,5// foo() undefined 5// fetch(url, options)// body:body= "";function fetch(url,{body = "",methods="get",header={}}={}){console.log(method)}
