Skip to content

Commit 7c2ba1b

Browse files
committed
edit object
1 parent 6f98097 commit 7c2ba1b

File tree

4 files changed

+47
-8
lines changed

4 files changed

+47
-8
lines changed

docs/class.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Point {
3131
}
3232

3333
toString() {
34-
return '('+this.x+', '+this.y+')';
34+
return '(' + this.x + ', ' + this.y + ')';
3535
}
3636

3737
}

docs/function.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -839,7 +839,7 @@ setTimeout(() => console.log(timer.seconds), 3100)
839839

840840
上面代码中,`Timer`函数内部的`setInterval`调用了`this.seconds`属性,通过箭头函数让`this`总是指向Timer的实例对象。否则,输出结果是0,而不是3。
841841

842-
`this`指向的固定化,并不是因为箭头函数内部有绑定`this`的机制,实际原因是箭头函数根本没有自己的`this`,导致内部的`this`就是外层代码块的`this`
842+
`this`指向的固定化,并不是因为箭头函数内部有绑定`this`的机制,实际原因是箭头函数根本没有自己的`this`,导致内部的`this`就是外层代码块的`this`正是因为它没有`this`,所以也就不能用作构造函数。
843843

844844
请问下面的代码之中有几个`this`
845845

@@ -875,7 +875,7 @@ foo( 2, 4, 6, 8 );
875875

876876
上面代码中,箭头函数内部的变量`arguments`,其实是函数`foo``arguments`变量。
877877

878-
另外,由于箭头函数内部没有`this`,所以当然也就不能用`call()``apply()``bind()`这些方法去改变`this`的指向。
878+
另外,由于箭头函数没有自己的`this`,所以当然也就不能用`call()``apply()``bind()`这些方法去改变`this`的指向。
879879

880880
长期以来,JavaScript语言的`this`对象一直是一个令人头痛的问题,在对象方法中使用`this`,必须非常小心。箭头函数”绑定”`this`,很大程度上解决了这个困扰。
881881

docs/iterator.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -719,11 +719,9 @@ for (var index in myArray) {
719719

720720
for...in循环有几个缺点。
721721

722-
1)数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。
723-
724-
2)for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。
725-
726-
3)某些情况下,for...in循环会以任意顺序遍历键名。
722+
- 数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。
723+
- for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。
724+
- 某些情况下,for...in循环会以任意顺序遍历键名。
727725

728726
总之,`for...in`循环主要是为遍历对象而设计的,不适用于遍历数组。
729727

docs/object.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,47 @@ Object.getOwnPropertyDescriptor(class {foo() {}}.prototype, 'foo').enumerable
491491

492492
总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以,尽量不要用`for...in`循环,而用`Object.keys()`代替。
493493

494+
## 属性的遍历
495+
496+
ES6一共有6种方法可以遍历对象的属性。
497+
498+
**(1)for...in**
499+
500+
`for...in`循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)。
501+
502+
**(2)Object.keys(obj)**
503+
504+
`Object.keys`返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。
505+
506+
**(3)Object.getOwnPropertyNames(obj)**
507+
508+
`Object.getOwnPropertyNames`返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。
509+
510+
**4)Object.getOwnPropertySymbols(obj)**
511+
512+
`Object.getOwnPropertySymbols`返回一个数组,包含对象自身的所有Symbol属性。
513+
514+
**(5)Reflect.ownKeys(obj)**
515+
516+
`Reflect.ownKeys`返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。
517+
518+
**(6)Reflect.enumerate(obj)**
519+
520+
`Reflect.enumerate`返回一个Iterator对象,遍历对象自身的和继承的所有可枚举属性(不含Symbol属性),与`for...in`循环相同。
521+
522+
以上的6种方法遍历对象的属性,都遵守同样的属性遍历的次序规则。
523+
524+
- 首先遍历所有属性名为数值的属性,按照数字排序。
525+
- 其次遍历所有属性名为字符串的属性,按照生成时间排序。
526+
- 最后遍历所有属性名为Symbol值的属性,按照生成时间排序。
527+
528+
```javascript
529+
Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 })
530+
// ['2', '10', 'b', 'a', Symbol()]
531+
```
532+
533+
上面代码中,`Reflect.ownKeys`方法返回一个数组,包含了参数对象的所有属性。这个数组的属性次序是这样的,首先是数值属性`2``10`,其次是字符串属性`b``a`,最后是Symbol属性。
534+
494535
## `__proto__`属性,Object.setPrototypeOf(),Object.getPrototypeOf()
495536

496537
**(1)`__proto__`属性**

0 commit comments

Comments
 (0)