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);

转载于:https://www.cnblogs.com/crystal2018/p/8657120.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值