首页 > 语言 > JavaScript > 正文

ECMAScript6变量的解构赋值实例详解

2024-05-06 15:26:31
字体:
来源:转载
供稿:网友

数组的解构赋值

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)

var [a, b, c] = [1, 2, 3];

这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

下面是一些使用嵌套数组进行解构的例子

let [foo, [[bar], baz]] = [1, [[2], 3]];foo // 1bar // 2baz // 3let [ , , third] = ["foo", "bar", "baz"];third // "baz"let [x, , y] = [1, 2, 3];x // 1y // 3let [head, ...tail] = [1, 2, 3, 4];head // 1tail // [2, 3, 4]let [x, y, ...z] = ['a'];x // "a"y // undefinedz // []

如果解构不成功,变量的值就等于 undefined

foo 的值都会等于 undefined

var [foo] = [];var [bar, foo] = [1];

不完全解构即等号左边的模式,只匹配一部分的等号右边的数组

let [x, y] = [1, 2, 3];x // 1y // 2let [a, [b], d] = [1, [2, 3], 4];a // 1b // 2d // 4

如果等号的右边不是数组,那么将会报错。

// 报错let [foo] = 1;let [foo] = false;let [foo] = NaN;let [foo] = undefined;let [foo] = null;let [foo] = {};

解构赋值不仅适用于var命令,也适用于let和const命令

var [v1, v2, ..., vN ] = array;let [v1, v2, ..., vN ] = array;const [v1, v2, ..., vN ] = array;

对于Set结构,也可以使用数组的解构赋值。

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

只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值

function* fibs() {  var a = 0;  var b = 1;  while (true) {  yield a;   [a, b] = [b, a + b];  }}var [first, second, third, fourth, fifth, sixth] = fibs();sixth // 5

fibs 是一个Generator函数,原生具有Iterator接口。解构赋值会依次从这个接口获取值

解构赋值允许指定默认值。

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 = 1] = [undefined];x // 1var [x = 1] = [null];x // null

如果一个数组成员是 null ,默认值就不会生效,因为 null 不严格等于 undefined

function f() {console.log('aaa');}let [x = f()] = [1];//等价于let x;if ([1][0] === undefined) {  x = f();} else {  x = [1][0];}

如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选