diff --git a/docs/object.md b/docs/object.md index 981f320..f86f30c 100644 --- a/docs/object.md +++ b/docs/object.md @@ -488,8 +488,8 @@ let { x, y, ...z } = undefined; // 运行时错误 解构赋值必须是最后一个参数,否则会报错。 ```javascript -let { ...x, y, z } = obj; // 句法错误 -let { x, ...y, ...z } = obj; // 句法错误 +let { ...x, y, z } = someObject; // 句法错误 +let { x, ...y, ...z } = someObject; // 句法错误 ``` 上面代码中,解构赋值不是最后一个参数,所以会报错。 @@ -571,6 +571,42 @@ foo // {0: "a", 1: "b", 2: "c"} ``` +如果扩展运算符后面是一个空对象,则没有任何效果。 + +```javascript +{...{}, a: 1} +// { a: 1 } +``` + +如果扩展运算符后面不是对象,则会自动将其转为对象。 + +```javascript +// 等同于 {...Object(1)} +{...1} // {} +``` + +上面代码中,扩展运算符后面是整数`1`,会自动转为数值的包装对象`Number{1}`。由于该对象没有自身属性,所以返回一个空对象。 + +下面的例子都是类似的道理。 + +```javascript +// 等同于 {...Object(true)} +{...true} // {} + +// 等同于 {...Object(undefined)} +{...undefined} // {} + +// 等同于 {...Object(null)} +{...null} // {} +``` + +但是,如果扩展运算符后面是字符串,它会自动转成一个类似数组的对象,因此返回的不是空对象。 + +```javascript +{...'hello'} +// {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"} +``` + 对象的扩展运算符等同于使用`Object.assign()`方法。 ```javascript @@ -655,19 +691,6 @@ const obj = { }; ``` -如果扩展运算符后面是一个空对象,则没有任何效果。 - -```javascript -{...{}, a: 1} -// { a: 1 } -``` - -如果扩展运算符的参数是`null`或`undefined`,这两个值会被忽略,不会报错。 - -```javascript -let emptyObject = { ...null, ...undefined }; // 不报错 -``` - 扩展运算符的参数对象之中,如果有取值函数`get`,这个函数是会执行的。 ```javascript