es6 新增特性
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();
// 谷歌浏览器结果 undefined
let 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)=>111
let {x:qq,y}={y:'111',x:'222'} ==let{x:x,y:y} //键值对
console.log(x)=>x is not defind
console.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}=obj
let {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}=obj
console.log(ff[1]);
console.log(members.x);