ES6入门详解(二) 解构赋值

关于解构赋值非常简单 是一个es6语法糖 主要有数组解构赋值 对象解构赋值 主要的应用是按需解构exports的对象 解构函数参数 解构JSON等等 下面代码简单演示

数组解构赋值

//数组解构模式匹配 按照固定的左右模式进行匹配
let [a,b,c] = [1,2,3]
console.log(a,b,c)
//匹配多维数组也必须做到模式相同
let [a,b,[c,d,[e]]] = [1,2,[3,4,[5,6,[7]]]]
console.log(a)
//可以使用..来匹配所有匹配b后面所有的数据 这里注意c后面再跟变量就会报错
let [a,b,...c] = [1,2,3,4,5,6,7,[8]]
console.log(c)

对象解构赋值

//最常见的模式即赋值
let {obj1,obj2} = {obj1:123,obj2:123}
console.log(obj1)
//第二种模式与赋值分离 这个时候obj1是匹配模式 :a=>将匹配到的数值赋值给a
let {obj1:a,obj2:b} = {obj1:123,obj2:123}
console.log(a)
//第三种对象数组混合解构
//这个例子稍微有些复杂 首先obj1是模式 匹配到了[1,2,{b:3},[4,5]]
//然后a=>1 b=>2 接下来是匹配一个对象 {b:c}这是b就是模式 c赋值 x y 又是数组匹配
let {obj1:[a,b,{b:c},[x,y]]} = {obj1:[1,2,{b:3},[4,5]]}
console.log(a)
console.log(c)
console.log(x)
console.log(y)
//es6语法中存在块作用域
let x;
{x} = {x:10}
console.log(x) //报错 因为解析到{x}后js引擎会将{x}当成一个代码块也就是作用域 一个作用域 而不是解构赋值的模式
// 正确的做法
let x ;
({x} = {x:10}) //将作用域转为表达式就可以了
console.log(x)
//这里格外说一点 数组在进行解构时 解构的数据必须具有Iterator 接口 关于Iterator 之后会详细说
// 在对象解构的过程中 因为万物皆对象的原理 所以无论如何解构都是符合语法规范的
// ({} = function(){})
// ({} = []) //正确
// ([] = {}) //错误
// ({} = 'sdf')
// ({} = 123)

其他解构 不常用

//字符串解构 上文说过万物皆对象无论什么在进行对象解构时都转成对象 null undefined除外 
let [a,b,c,d] = 'xlln'
let {length:len} = 'xlln'
console.log(a)
console.log(len)
//通过下面这两个例子也可以看出来
let {toString:s} = 123
console.log(s === Number.prototype.toString)

let {slice}  = '123'
console.log(slice === String.prototype.slice)
//无论数组解构和对象解构都有默认值
//这里注意一点es内部在判断是否等于默认值是 是判断是否===严格等于undefined 如果等于才会使用默认值
let [a = 1,b = 2,c = 3] = []
console.log(a)
let {a = 1,b = 2,c = 3} = {a:undefined,b:null,c:null}
console.log(a) //1
console.log(b) //null
console.log(c) //null
//用法一函数参数解构
function fn1({a,b}){
    console.log(a+b)
}

fn1({a:1,b:2})
//可以给参数指定默认值 同样只有在绝对等于undefined 的情况下默认值生效 即模式所匹配的项 等于undefined 必须是当前模式匹配到的否则无效
function fn2({a = 4,b = 5} = {a:1,b:2}){
    console.log(a+b)
}
fn2()
//不是当前模式匹配到的

fn2({}) //9 当前模式是参数 object {undefined,undefined} 
//用法二解构node核心模块 或 JS内置对象
const {push} = [];
console.log(push)
const {join} = require('path')
console.log(join)
//用法三值交换
let x = 1;
let y = 3; //注意这里必须加;要不然会被解析错误
[x , y] = [ y , x]
console.log(x)

 

                                                                 

posted on 2018-04-20 10:57  素心~  阅读(241)  评论(0编辑  收藏  举报

导航