博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
es6 新增特性
阅读量:5291 次
发布时间:2019-06-14

本文共 2443 字,大约阅读时间需要 8 分钟。

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

你可能感兴趣的文章
[51Nod1089] 最长回文子串 V2(Manacher算法)
查看>>
Asp.Net生命周期系列六
查看>>
php引用 =& 详解
查看>>
Codeforces 914D Bash and a Tough Math Puzzle (ZKW线段树)
查看>>
POJ 3009: Curling 2.0
查看>>
DLNA介绍(包含UPnP,2011/6/20 更新)
查看>>
ANGULARJS5从0开始(2) - 整合bootstrap和font-awesome
查看>>
Android 使用Parcelable序列化对象
查看>>
Python Web框架Django (零)
查看>>
Foxmail出现 错误信息:553 mailbox not found怎么解决
查看>>
spring_远程调用
查看>>
js 中基本数据类型和引用数据类型 ,,,, js中对象和函数的关系
查看>>
登录服务器,首先用到的5个命令
查看>>
多米诺骨牌
查看>>
区间DP 等腰三角形
查看>>
mysql 存储引擎对索引的支持
查看>>
Linq 学习(1) Group & Join--网摘
查看>>
asp.net 调用前台JS调用后台,后台掉前台JS
查看>>
【转】iOS 宏(define)与常量(const)的正确使用-- 不错
查看>>
【转】iOS开发UI篇—iPad和iPhone开发的比较
查看>>