Skip to content

Commit 52bca44

Browse files
committed
docs(object): edit spread operator
1 parent 7397a7a commit 52bca44

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

docs/object.md

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,8 @@ let { x, y, ...z } = undefined; // 运行时错误
488488
解构赋值必须是最后一个参数,否则会报错。
489489

490490
```javascript
491-
let { ...x, y, z } = obj; // 句法错误
492-
let { x, ...y, ...z } = obj; // 句法错误
491+
let { ...x, y, z } = someObject; // 句法错误
492+
let { x, ...y, ...z } = someObject; // 句法错误
493493
```
494494

495495
上面代码中,解构赋值不是最后一个参数,所以会报错。
@@ -571,6 +571,42 @@ foo
571571
// {0: "a", 1: "b", 2: "c"}
572572
```
573573

574+
如果扩展运算符后面是一个空对象,则没有任何效果。
575+
576+
```javascript
577+
{...{}, a: 1}
578+
// { a: 1 }
579+
```
580+
581+
如果扩展运算符后面不是对象,则会自动将其转为对象。
582+
583+
```javascript
584+
// 等同于 {...Object(1)}
585+
{...1} // {}
586+
```
587+
588+
上面代码中,扩展运算符后面是整数`1`,会自动转为数值的包装对象`Number{1}`。由于该对象没有自身属性,所以返回一个空对象。
589+
590+
下面的例子都是类似的道理。
591+
592+
```javascript
593+
// 等同于 {...Object(true)}
594+
{...true} // {}
595+
596+
// 等同于 {...Object(undefined)}
597+
{...undefined} // {}
598+
599+
// 等同于 {...Object(null)}
600+
{...null} // {}
601+
```
602+
603+
但是,如果扩展运算符后面是字符串,它会自动转成一个类似数组的对象,因此返回的不是空对象。
604+
605+
```javascript
606+
{...'hello'}
607+
// {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
608+
```
609+
574610
对象的扩展运算符等同于使用`Object.assign()`方法。
575611

576612
```javascript
@@ -655,19 +691,6 @@ const obj = {
655691
};
656692
```
657693

658-
如果扩展运算符后面是一个空对象,则没有任何效果。
659-
660-
```javascript
661-
{...{}, a: 1}
662-
// { a: 1 }
663-
```
664-
665-
如果扩展运算符的参数是`null``undefined`,这两个值会被忽略,不会报错。
666-
667-
```javascript
668-
let emptyObject = { ...null, ...undefined }; // 不报错
669-
```
670-
671694
扩展运算符的参数对象之中,如果有取值函数`get`,这个函数是会执行的。
672695

673696
```javascript

0 commit comments

Comments
 (0)