[学习笔记]02.变量的解构赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[学习笔记]02.变量的解构赋值相关的知识,希望对你有一定的参考价值。

一:数组的解构赋值

 ES6.0规定按照一定的模式,从数组到对象中提取值,对变量进行赋值,这被称为解构。

 以前的时候赋值是这样的形式:

var a = 1;

var b = 2;

var c = 3;

 

现在是:

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

从上面可以看出来可以从数组中提取值,按照对应位置,对变量赋值。

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

 let [foo, [[bar], baz]] = [1, [[2], 3]];

foo // 1

bar // 2

baz // 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 [star]=[];

       var [foo,star]=[1];

上面的两种情况star的值都为undefined,属于解构不成功。还有一种情况是解构不成功,即等号左边的值只匹配了等号右边一部分值,这样也算是解构成功。如下例:

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

a // 1

b // 2

d // 4

 

如果等号右边不是可遍历的结构,那也会报错。

// 报错

let [foo] = 1;

let [foo] = false;

let [foo] = NaN;

let [foo] = undefined;

let [foo] = null;

let [foo] = {};

上面的这几种都会报错,原因是左边是的数组结构,右边的是不是数组结构所以系统就会报错。解构不仅适合var命令,也适合let,const命令,还有就是没有学过的set结构。

 

 二:对象的解构赋值

解构不仅可以用于数组,还可以用于对象。

 

var {foo,bar}={foo: "aaa",bar:"bbb"}

console.log(foo);

console.log(bar);

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

 

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

 

上面代码的第一个例子,等号左边的两个变量的次序,与等号右边两个同名属性的次序不一致,但是对取值完全没有影响。第二个例子的变量没有对

应的同名属性,导致取不到值,最后等于undefined。

 

对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。如下例:

var { foo: baz } = { foo: "aaa", bar: "bbb" };

baz // "aaa"

foo // error: foo is not defined

上面代码中,真正被赋值的是变量baz,而不是模式foo。

注意,采用这种写法时,变量的声明和赋值是一体的。对于let和const来说,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错。

 

let foo;

let {foo} = {foo: 1}; // SyntaxError: Duplicate declaration "foo"

let baz;

let {bar: baz} = {bar: 1}; // SyntaxError: Duplicate declaration "baz"

 

上面代码中,解构赋值的变量都会重新声明,所以报错了。不过,因为var命令允许重新声明,所以这个错误只会在使用let和const命令时出现。如果

没有第二个let命令,上面的代码就不会报错。

 

对象的解构也可以指定默认值。

var {x = 3} = {};

x // 3

var {x, y = 5} = {x: 1};

x // 1

y // 5

 

三:字符串的解构赋值

字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。

const [a, b, c, d, e] = ‘hello‘;

a // "h"

b // "e"

c // "l"

d // "l"

e // "o"

类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

let {length : len} = ‘hello‘;

len // 5

 

四:数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。

 

let {toString: s} = 123;

s === Number.prototype.toString // true

let {toString: s} = true;

s === Boolean.prototype.toString // true

上面代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。

解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。

let { prop: x } = undefined; // TypeError

let { prop: y } = null; // TypeError

 

五:函数参数的解构赋值

函数的参数也可以使用解构赋值。

function add([x, y]){

return x + y;

}

add([1, 2]); // 3

 

函数参数的解构也可以使用默认值。

function move({x = 0, y = 0} = {}) {

return [x, y];

}

move({x: 3, y: 8}); // [3, 8]

move({x: 3}); // [3, 0]

move({}); // [0, 0]

move(); // [0, 0]

以上是关于[学习笔记]02.变量的解构赋值的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript学习笔记 -- ES6学习 变量的解构赋值

ES6学习笔记(letconst变量的解构赋值字符串扩展)

ES6学习笔记之数组的解构赋值

ES6学习笔记之数组的解构赋值

ES6-个人学习笔记二--解构赋值

ES6学习笔记二 新的声明方式和变量的解构赋值!