let [c = 3, d = c] = [1];
// c = 1, d = 1
let [e = 3, f = e] = [1, 2];
// e = 1, f = 2
示例代码:
步骤一:新建一个名为 test5.js 的文件,在其中输入以下代码:
console.log(“示例一:”);
console.log(“a 与 b 匹配结果为 undefined,触发默认值:a = 3; b = a =3”);
let [a = 3, b = a] = [];
console.log(“a 的值为” + a);
console.log(“b 的值为” + b);
console.log(“示例二:”);
console.log(
“c 正常解构赋值,匹配结果:c = 1,d 匹配结果 undefined,触发默认值:d = c =1”
);
let [c = 3, d = c] = [1];
console.log(“c 的值为” + c);
console.log(“d 的值为” + d);
console.log(“示例三:”);
console.log(“e 与 f 正常解构赋值,匹配结果:e = 1,f = 2。”);
let [e = 3, f = e] = [1, 2];
console.log(“e 的值为” + e);
console.log(“f 的值为” + f);
在终端使用 node 命令运行:
![请添加图片描述](https://img-blog.csdnimg.cn/923e8c59ff634acebf1ae39bc4493817.png)
[]( )二、对象的解构赋值
============================================================================
解构不仅可以用于数组,还可以用于对象。对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
let { foo, bar } = { foo: ‘aaa’, bar: ‘bbb’ };
// foo = ‘aaa’
// bar = ‘bbb’
let { baz : foo } = { baz : ‘ddd’ };
// foo = ‘ddd’
let person = { name: ‘zhangsan’, age: 20, sex: ‘男’};
let {name, age, sex} = person;
// name = ‘zhangsan’
// age = 20
// sex = ‘男’
示例代码:
步骤一:新建一个名为 test6.js 的文件,在其中输入以下代码:
console.log(“示例一:”);
console.log(
“等号左边的两个变量的次序,与等号右边两个同名属性的次序不一致,但是对取值完全没有影响。”
);
let { foo, bar } = { foo: “aaa”, bar: “bbb” };
console.log(“foo 的值为” + foo);
console.log(“bar 的值为” + bar);
console.log(“示例二:”);
let { baz: ccc } = { baz: “ddd” };
console.log(“ccc 的值为” + ccc);
console.log(“示例三:”);
let person = { name: “zhangsan”, age: 20, sex: “男” };
let { name, age, sex } = person;
console.log(“name :” + name);
console.log(“age :” + age);
console.log(“sex :” + sex);
在终端使用 node 命令运行:
![请添加图片描述](https://img-blog.csdnimg.cn/800cb06a833848e18a706ece0c5c6aca.png)
下面这个例子的变量没有对应的同名属性,导致取不到值,最后等于 undefined。
var { baz } = { foo: “aaa”, bar: “bbb” };
// baz = undefined
新建 index.html 文件,示例代码:
<script>
var { baz } = { foo: "aaa", bar: "bbb" };
document.write("baz 的值为" + baz);
</script>
显示效果:
![请添加图片描述](https://img-blog.csdnimg.cn/50ba8dee5da54eef9d37724abcb2d04e.png)
如果变量名与属性名不一致,必须写成下面这样。
var { foo: baz } = { foo: ‘aaa’, bar: ‘bbb’ };
// baz = “aaa”
let obj = { first: ‘hello’, last: ‘world’ };
let { first: f, last: l } = obj;
// f = ‘hello’
// l = ‘world’
[]( )三、可嵌套可忽略
===========================================================================
和数组一样,解构也可以用于嵌套结构的对象。
let obj = {p: [‘hello’, {y: ‘world’}] };
let {p: [x, { y }] } = obj;
// x = ‘hello’
// y = ‘world’
let obj = {p: [‘hello’, {y: ‘world’}] };
let {p: [x, { }] } = obj;
// x = ‘hello’
示例代码一:
新建一个名为 index1.html 的文件,在其中输入以下代码:
<script>
let obj = { p: ["hello", { y: "world" }] };
let {
p: [x, { y }],
} = obj;
document.write("x 的值为" + x + "</br>");
document.write("y 的值为" + y);
</script>
显示效果:
![请添加图片描述](https://img-blog.csdnimg.cn/c8a3a4704ceb4edf9e476e744edace7a.png)
示例代码二:
新建一个名为 index2.html 的文件,在其中输入以下代码:
<script>
let obj = { p: ["hello", { y: "world" }] };
let {
p: [x, {}],
} = obj;
document.write("x 的值为" + x);
</script>
显示效果:
![请添加图片描述](https://img-blog.csdnimg.cn/05087e7dbbbd4b79889d72d0e65156c2.png)
下面是嵌套赋值的例子。
let obj = {};
let arr = [];
({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
//obj = {prop:123}
//arr = [true]
[]( )四、解构默认值
==========================================================================
对象的解构也可以指定默认值。
let {a = 10, b = 5} = {a: 3};
// a = 3; b = 5;
let {c: aa = 10, d: bb = 5} = {c: 3};
// aa = 3; bb = 5;
var { message: msg = ‘Something went wrong’ } = {};
//msg = “Something went wrong”
示例代码:
步骤一:新建一个名为 test7.js 的文件,在其中输入以下代码:
console.log(“示例一:”);
let { a = 10, b = 5 } = { a: 3 };
console.log(“a 的值为” + a);
console.log(“b 的值为” + b);
console.log(“示例二:”);
let { c: aa = 10, d: bb = 5 } = { c: 3 };
console.log(“aa 的值为” + aa);
console.log(“bb 的值为” + bb);
console.log(“示例三:”);
var { message: msg = “Something went wrong” } = {};
console.log(“msg 的值为” + msg);
步骤二:在终端使用 node 命令运行:
![请添加图片描述](https://img-blog.csdnimg.cn/506e93f85f8548ac90af2e79cac8e6d1.png)
[]( )五、不完全解构
==========================================================================
let obj = {p: [{y: ‘world’}] };
let {p: [{ y }, x ] } = obj;
// x = undefined
// y = ‘world’
示例代码:
步骤一:新建一个名为 test8.js 的文件,在其中输入以下代码:
let obj = { p: [{ y: “world” }] };
let {
p: [{ y }, x],
} = obj;
console.log(“x =” + x);
console.log(“y =” + y);
步骤二:在终端使用 node 命令运行:
![请添加图片描述](https://img-blog.csdnimg.cn/75d59dbed57747a983a7f7a7c7bf236f.png)
[]( )六、剩余运算符
==========================================================================
let {a, b, …rest} = {a: 10, b: 20, c: 30, d: 40};
// a = 10
// b = 20
// rest = {c: 30, d: 40}
示例代码:
步骤一:新建一个名为 test9.js 的文件,在其中输入以下代码:
let { a, b, …rest } = { a: 10, b: 20, c: 30, d: 40 };
console.log(“a =” + a);
console.log(“b =” + b);
console.log(“rest =” + rest.c);
console.log(“rest =” + rest.d);
步骤二:在终端使用 node 命令运行:
![请添加图片描述](https://img-blog.csdnimg.cn/606b2329acee4a1c93c835ac951da796.png)
[]( )七、注意事项
=========================================================================
如果要将一个已经声明的变量用于解构赋值,必须非常小心。
// 错误的写法
var x;
{x} = {x: 1};
// SyntaxError: syntax error
上面代码的写法会报错,因为 JavaScript 引擎会将 {x} 理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。
// 正确的写法
({x} = {x: 1});
上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。关于圆括号与解构赋值的关系,如下。
解构赋值允许,等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。
({} = [true, false]);
({} = ‘abc’);
({} = []);
[]( )八、字符串的解构赋值
=============================================================================
在数组的解构中,解构的目标若为可遍历对象,皆可进行解构赋值。
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。新建文件 index3.html ,示例代码:
<script>
let [a, b, c, d, e] = "hello";
document.write("a 的值为" + a + "</br>");
document.write("b 的值为" + b + "</br>");
document.write("c 的值为" + c + "</br>");
document.write("d 的值为" + d + "</br>");
document.write("e 的值为" + e);
</script>
显示效果:
![请添加图片描述](https://img-blog.csdnimg.cn/95c1b2406c6e43689d98c523e0cef7fa.png)
类似数组的对象都有一个 length 属性,因此还可以对这个属性解构赋值。新建文件 index4.html ,示例代码:
<script>
let { length: len } = "hello";
document.write("len =" + len);
</script>
显示效果:
![请添加图片描述](https://img-blog.csdnimg.cn/de61ce85e03f4c61b4c9a70d98fff991.png)
[]( )九、圆括号问题
==========================================================================
解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。
由此带来的问题是,如果模式中出现圆括号怎么处理。ES6 的规则是,只要有可能导致解构的歧义,就不得使用圆括号。但是,这条规则实际上不那么容易辨别,处理起来相当麻烦。因此,建议只要有可能,就不要在模式中放置圆括号。
不得使用圆括号的情况
变量声明语句中,不能带有圆括号。
var [(a)] = [1];
var {x: ©} = {};
var ({x: c}) = {};
var {(x: c)} = {};
var {(x): c} = {};
最后
除了简历做到位,面试题也必不可少,整理了些题目,前面有117道汇总的面试到的题目,后面包括了HTML、CSS、JS、ES6、vue、微信小程序、项目类问题、笔试编程类题等专题。