Happy New Year!

09.ES6 之 let ,conts.结构赋值


ES6


ECMAScript 6 (js语言的标准 规范) js是它是实现


编写复杂大型的项目


let var

var 函数作用域


let 块级作用域

-----------

function a(){
if(true){
var str = "shaozhu";
}
console.log(str);
};
a();

 

shaozhu

-----------

function a(){
if(true){
let str = "shaozhu";
}
console.log(str);
};
a();

 

报错

---------------------------------

let 变量不能重复声明一样的变量

let a=1;
let a=2;

 

报错

-------------

箭头函数

变量名= 参数 =>函数体

var f = function(v){

return v
}

var f = v => v;


不传参

var f = () =>"123";

---------

var f =(a1,a2,a3)=>a1+a2+a3;
f(5,5,5)
15

---------

 

 

---------------------------------------------------------------

ES6

ECMAscript 6.0 复杂/大型应用程序/企业开发语言


1. let var {} 大括号来区分

var 1.函数作用域


let 1.块级作用域 2.必须先定义然后再使用


这个要注意 不然在浏览器可能会出现取不到值

 


区别:作用域

--------------------------------------------

区别

变量 提升


let 不存在变量提升 不能再声明前使用

var 可以在变量声明前使用


在同一作用域里面 不予许重复声明

--------------------------------------------

2.暂时性的死区

 

var a = "123";

if(true){
a="qqq";
let a;
}

 

a is not defined

 

---------------------
暂时性的死区

var x=y,y=2;
function a(){
console.log(x,y);
}
a();

 

undefined 2

------------------------------------------

let x=y,y=2;
function a(){
console.log(x,y);
}
a();

 


VM112:1 Uncaught ReferenceError: y is not defined

 

ES6 更加严格了!

---------------------

函数内部重新声明参数

 

function fun(i){

let i;///xxxxxxxxx 不能这样定义 这个是错的

if(trun){let i};//这样就是可以 let 的作用域是块
conslole.log(1);
}

 


---------------------

谷歌 V8 引擎

var str = '124';
function f(){
console.log(str);
if(false){
var str = "1234";//进不去
}

}
f();

 

undefined (BUG)

变量提升的原因

1 1

---------------------

var str = '124';
function f(){
console.log(str);
if(false){
let str = "1234";//进不去
}

}
f();

124

 

能打出来

------------------------------------------------

为什么需要块级作用域?

变量提升

js是浏览器边解析边执行,解析器会优化代码,谷歌 v8引擎

函数作用域 引擎扫描函数体会对var优先执行,会变量提升。


---------------------------------------------------------


let 没有变量提升 严格的块级作用域

 

for(var i=0;i<5;i++){};//i 泄露全局

console.log(i);//取得到

 

5

---------------------------------

for(let i=0;i<5;i++){};

console.log(i);//取不到

 

i is not defined


前面一直在将 var 和 let

let 更加严谨

---------------------------------


总计下:

let 作用域 不存在变量的提升(预加载) 不存在暂时性的死区。

 


---------------------------------

const 声明一个只读的常量,常量的值 不能变化(包括 简单类型 数组/字符串/布尔)

const 和let 一样的 但是是一个常量!

复合类型:数组/对象 存的这些是可以改变的

 

const str ="12345";//不能在变化了 OK

str="12";//报错!!!! 不能在赋值

const str;//报错 不能声明不赋值!!! 一定要初始化 赋值

 


-------------------

存对象是可以改变的

const obj = {};
obj.name = "12";
obj.action = function(){

console.log(this.name);
};
pbj = {};//又重复声明,会报错
obj.action();

obj is not defined

 

---------------------------------

 

const arr = [];

arr.push("12");
//这样是可以的
console.log(arr);

 

 


---------------------------------


变量的解构赋值

从数组和对象中提取,对变量进行赋值,称为解构。

var a =1,b=2,c=3;

var x =1;
var y =2;
var z =3;

 

----------------------

let xx=1;
let yy=2;
let zz=3;

//数组 是按照次序来匹配

let[x,y,z] =[1,2,3];//模式匹配


let[x,y,z] =[1,,3];//模式匹配 中间空了个也可以 按照位置来匹配的

let [x,y,z] = [1,[1,2,3,4,5,6],3];//也可以放数组

 

 

//允许指定默认值

let[x,y='4',z] =[1,,3];//模式匹配 y默认4


let[x,y='4',z] =[1];//模式匹配 x1 y4 z undefinde


let[x,y='4',z] =[1,5,3];//模式匹配 y默认4

//这个时候 y是5 后面的赋值会高于默认值 会覆盖了。

 

 

 

let[x,y='4',z] =[1,,null];//模式匹配

//1 4 null //null 会被覆盖4

 

 


----------------------

function f(){
return '123';
};

let[x=f()]=[];
console.log(x)

123

 

后面这个值有 就给赋值后面的那个 没有就算前面那个


上面是数组的

------------------------------------------------------------------

对象的解构赋值 {}

 

let {x,y} = {y:'111',x:'222'};//按照名字来匹配 不是按照次序来的

//x

//"111"

 


--------------------------------------------

let {x:qq,y} = {y:'111',x:'222'};//按照名字来匹配

 

--------------------------------------------------

let {x:qq,y} = {y:'111',x:'222'};

//(x:qq x 是模式 qq才是变量名字)

//x 报错

//qq 不报错

 

个人学习笔记 喷子勿扰

 

posted @ 2018-03-25 10:16  义美-小义  阅读(687)  评论(0编辑  收藏  举报
返回顶部小火箭
世界很公平,想要最好,就一定得付出!
x
github主页