ES6知识点电子版(from阮一峰)持续更新

1 篇文章 0 订阅

一、let与const:

let声明的变量只在let命令所在的代码块有效,let只能声明一次,不存在变量提升,存在暂时性死区。

const声明一个只读变量,一旦声明,常量的值就不能改变,声明的同时必须初始化,不存在变量提升,存在暂时性死区,只是保证地址不变就可以,如果指向一个{},是可以给该对象添加属性的,但是不能指向别的对象。

var声明的变量在方法块内有效,var可以声明多次,变量提升。

经典案例:for循环下的var和let

变量i是用var声明的,在全局范围内有效,所以全局中只有一个变量i,每次循环时,setTimeout定时器里面的i指的是全局变量i,而循环里的十个setTimeout在循环结束后才执行,所以此时的i都是10。

for(var i=0;i<10;i++){
    setTimeout(funciton(){
        console.log(i);
    });
}
//输出十个10

变量j是用let声明的,当前的j只在本轮循环中有效,每次循环的j都是一个新的变量,所以setTimeout定时器里的j其实是不同的变量,即最后输出123456789。(若每次循环的变量j都是重新声明的,如何知道前一个循环的值?这是因为JavaScript引擎内部会记住前一个循环的值。

for(let j=0;j<10;j++){
    setTimeout(funciton(){
        console.log(j);
    });
}
//输出0123456789

es6声明变量的方法一共有6种:var、function、let、const、import、class

let、const、class声明的全局变量补数据顶层对象(window)的属性

二、变量的解构赋值

ES6允许:按照一定的模式从数组和对象中提取值,然后对变量进行赋值。

1、数组的解构赋值:只要等号两边的模式相同,左边的变量就会被赋予对应的值。

例子1:

例子2:

例子3:

例子4:

let [{b:r},y]=[{a:1,b:[2,3]},{c:4,d:[5]}];

对于Set结构,也可以使用数组的结构赋值:(Set结构成员是唯一的,没有重复的值)

let [x,y,z] = new Set(['a','b','c']);

解构赋值允许赋默认值:

let [x,y='b'] = ['a']; //x为a,y为b

注意:对应默认值的位置,必须是严格的undefined,===undefined,null都不可以

默认值可以引用解构赋值的其他变量,但该变量必须已经声明:

let [x=1,y=x] = [];   //x=1,y=1

let [x=1,y=x] = [2];   //x=2,y=2

let [x=1,y=x] = [1,2];   //x=1,y=2

let [x=y,y=1] = [];   //ReferenceError 报错是因为x用到默认值y的值,但是y还没有声明

2、对象的解构赋值:数组的元素是按次序排列的,变量的取值是由他的位置决定的;而对象必须与属性同名才能取到正确的值。

例1:let {bar,foo} = {foo:'a',bar:'b'};   //bar为b,foo为a

例2:let {baz} = {foo:'a',bar:'b'}; //解构失败,baz为undefined,因为没有与之对应的key

如果变量名与属性名不一致,必须写成下面这样,指定key:

例3:var {foo:baz} = {foo:'aaa',bar:'bbb'};   //baz为aaa

解构也可以用于嵌套解构的对象:

例4:

证明解构是快照,不是引用。

例5:大括号不可以位于行首,否则会被认为为代码块,要用小括号扩起来

例6、对象解构也可以指定默认值:

var {x:y=3} = {x:5};   //y等于5

默认生效的条件同样是,对象的属性值严格等于undefined。

例7、由于数组的本质是对象,因此可以对数组进行对象属性的赋值:

3、字符串的解构赋值:

字符串被转换成类似数组的对象

const [a,b,c,d,length:len] = 'hello';   //a:h;  b:e;  c:l;  d:l;  len:5
4、数值和布尔值的解构赋值:

如果等号右边是数值或布尔值,会先法转为对象。

let{toString:s} = 123;

s===Number.prototype.toString;   //true

let{toString:s} = true;

s===Boolean.prototype.toString;   //true

5、函数参数的解构赋值:

第一种形式:给x,y指定默认值

第二种形式:给move方法的参数指定默认值

注意:解构时,非必要不要使用圆括号。

6、解构的用途:

1)变换变量的值:

let x=1;

let y=2;

[x,y] = [y,x];

2)从函数返回多个值:

function example(){
    return [1,2,3];
}
let [a,b,c] = example();
function example(){
    return {
        foo:1,
        bar:2
    }
}
let {foo,bar} = example();

3)函数参数的定义:

function a([x,y,z]){
    ...
}
a([1,2,3]);
function b({x,y,z}){
    ...
}
b({y:2,x:1,z:3});

上面这个就很实用了,想要啥拿啥

4)提取json数据:

let jsonData = {
    id:42,
    status:'ok'
};
let {id,status} = jsonData;

5)遍历Map解构:

var map = new Map();
map.set('first','hello');
map.set('second','world');
for(let [key,value] of map){
    ...
}
for(let [key] of map){
    ...
}
for(let [,value] of map){
    ...
}

6)输入模块指定方法:

const {SourceMapCon,SourseNode} = require('source-map');

三、字符串的扩展

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值