es6--变量的解构赋值
Posted qjuly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es6--变量的解构赋值相关的知识,希望对你有一定的参考价值。
基本用法:
以前为变量赋值只能直接指定值;
var a = 1; var b = 2; var c = 3;
而es6允许写成下面这样:
var [a, b, c] = [1, 2, 3];
上面的代码表示:可以从数组中提取值,按照位置的对应关系对变量赋值。
举个获取元素的例子
<div id="app"> <div id="top">1</div> <div id="main">2</div> <div id="footer">3</div> </div> <script> function $(id) { return document.getElementById(id); } var [mytop, mymain, myfooter] = [$("top"),$("main"),$("footer")]; alert(myfooter.innerhtml) // 1 </script>
本质上,这种写法属于"模式匹配",只要等号两边的模式相同,左边的变量就会赋予对应的值,下面的是使用嵌套数组进行解构的例子。
let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [,, third] = ["foo", "bar", "baz"]; third // "baz" let [x,, y] = [1, 2, 3]; x // 1 y // 3 let [head, ...tail] = [1, 2, 3, 4]; head // 1 tail // [2, 3, 4] let [x, y, ...z] = ["a"]; x // "a" y // "undefined" z // []
如果解析不成功,变量的值就会变成 undefined.
var [foo] = []; var [bar, foo] = [1];
以上两种情况都属于解构不成功,foo的值都会等于undefined.
另一种情况是不完全解构,即左边的模式只匹配等号右边数组的一部分。这种情况下,解构依然可以成功。
let [x, y] = [1, 2, 3]; x // 1 y // 2 let [a, [b],d]] = [1, [2, 3], 4]; a // 1; b // 2 c // 4 上面的例子都属于不完全解构,但是可以成功。 如果等号的右边不是数组(或者严格说,不是可便利的结构),那么将会报错。 // 报错 let [foo] = 1; let [foo] = false; let [foo] = NaN; let [foo] = undefined; let [foo] = null; let [foo] = {};
默认值
解构赋值允许指定默认值。var [foo = true] = [];foo // true
[x, y = "b"] = ["a"]; // x = "a", y = "b" [x, y = "b"] = ["a", undefined] // x = "a", y = "b"; 主要ES6内部使用严格相等符(===)判断一个位置是否有值。所以如果一个数组成员不严格等于undefined,默认值是不会生效的。 var [x, y] = [undefined]; x //1; var [x = 1] = [null] x // null 上面的代码中,如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined. 如果默认值是一个表达式,那么这个表达式是惰性求值,即只有在用到的时候才会求值 function f() { console.log("aaa"); } let [x = f()] = [1]; *上面的代码因为x能取到值,所以函数f根本不会执行。上面的代码其实等价与以下代码。 let x; if ([1][0] === undefined) { x = f(); } else { x = [1][0] }
默认值可以引用解构赋值的其他变量,但该变量必须已经声明。 let [x = 1, y = x] = []; // x = 1; y = 1 let [x = 1, y = x] = [2] // x = 2; y = 2 let [x = y, y = 1] = []; // ReferenceError
上面的最后一个表达式之所以会报错,是因为 x用到默认值y时y还没有声明。
注:
[1] 是只含元素 1 的数组
[0] 是取数组的第 0 个元素
[1][0] 的结果就是 1 拉
[1][0] === undefined 只是个条件判断而已,即 1 === undefined
[1] 是只含元素 1 的数组
[0] 是取数组的第 0 个元素
[1][0] 的结果就是 1 拉
[1][0] === undefined 只是个条件判断而已,即 1 === undefined
以上是关于es6--变量的解构赋值的主要内容,如果未能解决你的问题,请参考以下文章