从前我们对变量赋值时,都是通过赋值运算符,右边赋值给左边这样操作的。
let a = 1;
let b = 2;
let c = 3;
let obj = {};
obj.name = 'mm';
obj.age = 18;
现在我们通过模式匹配的方式来赋值。
左边是解构目标,右边是解构源。
左右结构要保持一致。
数组的解构是有顺序的,是一一对应的。(等号右边直接写数组的变量名也可以。)
let [a,b,c] = [1,2,3];
console.log(a,b,c);
let arr = [4,5,6];
let [x,y,z] = arr;
只要右边的模式和左边相同,那么左边对应的变量就会被赋予对应的值。
let [a,[b,[c,d]],e] = [1,[2,[3,4]],5];
console.log(a,b,c,d,e);
如果右边没有给值,就当做undefined处理。
let [a,b,c] = [1,2]; // let [a,b,c] = [1,2,undefined];
let [a, , b] = [1,2,3];
语法:...变量名
作用:可以将右边数组中剩余的值解构到左边,而且是以数组的形式保存。
let [a, ...b] = [1,2,3,4,5,6];
console.log('a为:', a);
console.log('b为:', b);
剩余运算符只能放在最后一个参数的位置上,否则报错。
let [...b, a] = [1,2,3];
console.log(b);
指定默认值,默认值产生的条件是:右边数组中对应的数据(====)严格等于undefined。
例如下面,y=10就表示,y的默认值为10。
let [x,y=10] = [1]; // let [x,y=10] = [1, undefined];
console.log(x,y);
let [a=10, b=a] = []; // a=10,b=10
let [a=10, b=a] = [1]; // a=1, b=1
let [a=10, b=a] = [1,2]; // a=1, b=2
let [a=b, b=20] = []; // 报错(在用b之前还没初始化值)
分析:
第一行:a和b匹配到undefined,所以采用默认值,a是10,b的值是a,也就是10;
第二行:a匹配到1,b匹配到undefined,所以b的值就是a,也就是1;
第三行:a和b均匹配到数值,因此a为1,b为2;(这里b不会是默认给到a的值,因为它自己有匹配的值)
第四行:a=b,但是b还没有初始化,因此报错。
只有左边对象的变量名和右边对象的属性名相同时,才会取到值。(等号右边写对象的变量名也可以。)
let {a, b} = {a:'foo', b:'bar'}; // a='foo' b='bar'
let obj = {
name: 'mm',
age: 18
}
let {name, age} = obj; // name='mm' age=18
let {say} = {jump:'jump', sing:'sing'}; // say='undefined' (找不到对应的属性名,那就给undefined)
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj; // x='hello' y='world'
左边:p是一种模式匹配,真正解构的是后面的数组中的x和对象中的y。
因此按照数组解构'hello'赋值给x,按照对象解构'world'赋值给y。
那么要想获取对象中p的属性值呢,直接写p就行。
let {p} = obj; // p=['hello', {y: 'world'}]
let {a,b,c} = {a:1,b:2}; // a=1 b=2 c=undefined
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { }] } = obj; // x='hello'
剩下的属性以对象的形式保留。
let {a, b, ...res} = {a:1, b:2, c:3, d:4, e:5}; // a=1 b=2 res={c:3, d:4, e:5}
指定默认值,默认值产生的条件是:对象属性名(====)严格等于undefined。
let {a,b=10,c} = {a:1}; // a=1 b=10 c=undefined
let {x=3} = {x:undefined}; // x=3
let {y=4} = {y:null}; // y=null
对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
例如,等号左边foo对应右边的同名属性是foo,它的值是'foo',这个值最后赋值给foo对应的变量f而非foo。
简而言之,这个f和b相当于是一个别名。
let {foo:f, bar:b} = {foo:'foo', bar:'bar'}; // f='foo' b='bar'
let x=1, y=2;
[x, y] = [y, x];
console.log(x,y); // 2 1
function foo() {
return [1,2,3];
}
let [a,b,c] = foo();
console.log(a,b,c); // 1 2 3
function bar() {
return {
b1: 'bar1',
b2: 'bar2'
}
}
let {b1, b2} = bar();
console.log(b1, b2); // 'bar1' 'bar2'
var json = {
name: 'mm',
age: 18
}
let {name, age, say='暂无数据'} = json;
console.log(name, age); // 'mm' 18 '暂无数据'
导出模块时用export,导入模块时用import。
模块导出:(文件名为:module.js)
let [a,b,c] = [1,'second',true];
export {
a,b,c
}
模块导入:
import {a,b,c} from './module.js';
console.log(a,b,c); // 1,'second',true
箭头函数是ES6中非常重要的性特性。它最显著的作用就是:更简短的函数,并且不绑定this,arguments等属性,它的this永远指向其上下文的 this。它最适合用于非方法函数,并且它们不能用作构造函数。
js模块化的开发并不是随心所欲的,为了便于他人的使用和交流,需要遵循一定的规范。目前,通行的js模块规范主要有两种:CommonJS和AMD
ES6中添加了一个新属性解构,允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量。用途:交换变量的值、从函数返回多个值、函数参数的定义、提取JSON数据、函数参数的默认值...
ES6中let变量的特点:1.let声明变量存在块级作用域,2.let不能先使用再声明3.暂时性死区,在代码块内使用let命令声明变量之前,该变量都是不可用的,4.不允许重复声明
ES6的7个实用技巧包括:1交换元素,2 调试,3 单条语句,4 数组拼接,5 制作副本,6 命名参数,7 Async/Await结合数组解构
ES6装饰器(Decorator)是一个函数,用来修改类的行为 在设计阶段可以对类和属性进行注释和修改。从本质上上讲,装饰器的最大作用是修改预定义好的逻辑,或者给各种结构添加一些元数据。
Query作为曾经Web前端的必备利器,随着MVVM框架的兴起,如今已稍显没落。用ES6写了一个基于class简化版的jQuery,包含基础DOM操作,支持链式操作...
ES6 中的一些技巧:模版字符串、块级作用域、Let、Const、块级作用域函数问题、扩展运算符、函数默认参数、解构、对象字面量和简明参数、动态属性名称、箭头函数、for … of 循环、数字字面量。
Rest/Spread 属性:rest操作符在对象解构中的使用。目前,该操作符仅适用于数组解构和参数定义。spread操作符在对象字面量中的使用。目前,这个操作符只能在数组字面量和函数以及方法调用中使用。
ES6使您的代码更具表现力和可读性。而且它与React完美配合!现在您已了解更多基础知识:现在是时候将你的ES6技能提升到一个新的水平!嵌套props解构、 传下所有props、props解构、作为参数的函数、列表解构
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!