// c = “aaa” // a = error: a is not defined
就是把’aaa’的值赋值给c,a只是一个匹配模式,c才是真正的变量,这是针对这一种对象的解构赋值
- 如果要将一个已经声明的变量用于解构赋值
// 错误的写法 let x; {x} = {x: 1}; // SyntaxError: syntax error // 正确的写法 let x; ({x} = {x: 1});
由于let x;该语句以及结束,js解释器就会把{x}解析成代码块
默认值
var {x = 3} = {}; // x = 3 var {x = 3} = {x: undefined}; // x = 3 var {x = 3} = {x: null}; // x = null
属性的简写
- ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法
// 1.属性简写 function fn(x, y){ return{ x: x, y: y } } // ==> function fn(x,y){ return {x,y}; } // 2.方法简写 const obj1 = { fn : function(){ return 0; } } // ==> const obj2 = { fn(){ return 0; } } // 3.常用实例 let ms = {}; function getItem (key) { return key in ms ? ms[key] : null; } function setItem (key, value) { ms[key] = value; } function clear () { ms = {}; } const exports1 = { getItem: getItem, setItem: setItem, clear: clear }; // ==> const exports2 = { getItem, setItem, clear }; // 4.简写的对象方法不能用作构造函数,会报错 const obj3 = { f() { this.foo = ‘bar’; } }; new obj3.f() // 报错
属性表达式
JavaScript定义属性的方式,在ES6之前只有一种方法
- 直接用标识符作为属性名称(ES6以前)
// 1. 用于属性 let a = ‘he’; const obj1 = { [a] : true, } console.log(obj1[a]) // true console.log(obj1.ab) // 2 console.log(obj1[‘ab’]) // 2 // 2. 用于方法名称 const obj2 = { ‘h’+‘e’{ return ‘2’; } } obj2.he() //“2” // 3. 注意属性名不能为对象 const keyA = {a: 1}; const keyB = {b: 2}; const myObject = { }; myObject // Object {[object Object]: “valueB”} // keyA和keyB得到的都是[object Object],所以keyB会把keyA覆盖掉,而myObject最后只有一个[object Object]属性,这就是","的操作
- 属性名表达式与简洁表示法,不能同时使用,会报错
const baz = { [foo] };
- 属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]
回到顶部 目录
函数参数的解构赋值
语法:[[1, 2], [3, 4]].map(([a, b]) => a + b); \\ [3, 7]
function fn({ a, b, c = 10, d = 20, } = {}){ return a+b+c+d; } fn({a:1,b:2}) // 33
语法都是上面数组和对象的解构赋值
尽量不要写带有()的语句出来
解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道,乱加圆括号也是导致编译报错
不能使用圆括号的情况:
- 变量声明语句
let [(a)] = [1]
- 函数参数
function fn([(z)]){}