let 1. 必须先定义再使用 2. 块级作用域
var 函数体作用域
区别:
1.变量提升 let不会存在变量提升而var可以 2.暂时性死区 var a="123"; if(true){ a="qqq"; let a; }console.log(a) > undefined ******************** var a='123';if(true){ let a;a='qqq'; }console.log(a) > 123***********
在同一作用域下不能重复声明 let a=9; let a=10;Uncaught SyntaxError: Identifier 'a' has already been declared***************
let x=y,y=2;function a(){ console.log(x,y)}a()y is not definded***********函数内部重新声明参数function(i){ let i; //不可取 if(true){ let i='123'; //可以 (块级作用域指大括号{} ) }}*****************************
谷歌用的v8引擎在解析的时候 所有var 会优先执行 --变量提升js是浏览器边解析边执行,解析器会优化代码,谷歌用的v8引擎;
var是函数作用域,引擎扫描函数体时会对var优化执行,会变量提升 var str='123';function f(){ console.log(str); if(false){ var str='1234'; }}f();// 谷歌浏览器结果 undefinedlet str='123';
function f(){ console.log(str);if(false){ let str='1234';}}f();// 谷歌浏览器结果 123所以要用let 块级作用域for(var i=0;i<10;i++){
}console.log(i)===>5循环体会暴漏i的值 用let不会2.const
声明一个只读的常量 不能改变不能只声明不赋值,一旦声明变量必须初始化,不能以后赋值操作!!(基本数据类型不能改变 num string 布尔 )复合类型的(对象和数组)是不受控制的const obj=[];//指针不变 里面的值不收控制obj.name='12';obj.action=function(){ return this.name}obj={};obj.action();***
变量的解构赋值a,从数组和对象中提取值,对变量进行赋值,成为解构let x=1;
let y=2;let z=3;let[x,y,z]=[1,2,3] //模式匹配let [x,y,z]=[1,[1,2],3]let [x,y='4',z]=[1,,null]
console.log(x,y,z)=>1 "4" null function f(){ return 'aaa'}let [x=f()]=[]console.log(x) =>aaa****************************************************
对象的解构赋值 是按照名字来的不是顺序
let {x,y}={y:'111',x:'222'}console.log(y)=>111let {x:qq,y}={y:'111',x:'222'} ==let{x:x,y:y} //键值对
console.log(x)=>x is not defindconsole.log(qq)=>222 对象的解构赋值let {x,y}={"x":"aaa","y":"ccc"}区别 :属性的索引,对象不会按照顺序赋值 而是按照属性名let {x:a,y}={"x":"aaa","y":"ccc"}x 匹配模式 a变量名 a的值是 "aaa"let obj={"y":"aaa","x":"ccc"}
let {x:c,y:a}=objlet {x=1}={x:'a'}
let{x:y=3}{x:undefined} > y =>3
let{x:y=3}{x:null} > y =>null//字符串的解构赋值
let [a,b,c,d,e,f]='nodejs'a 'n'b 'o'c 'd'...相当于字符数组//函数参数的解构赋值
function fun(x,y){ return x+y}fun (2,5)====>>>
function fun([x=0,y=0]){
return x+y}fun ([2,5])***function num(){ return [1,2,4];}let [a,b,c]=num();function num(){
let obj={ "a":"aaa", "age":12 } return obj}let {name:name1,age:age}=obj;console.log(name1) //取后面的名字*********JOSN:let obj={ "name":"crystal", "age":19, friends:["aa1","aa2","aa3"], members:{x:1,y:2}}let {name,age,friends:ff,members}=objconsole.log(ff[1]);console.log(members.x);