55ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。
66
77``` javascript
8- var foo = ' bar' ;
9- var baz = {foo};
8+ const foo = ' bar' ;
9+ const baz = {foo};
1010baz // {foo: "bar"}
1111
1212// 等同于
13- var baz = {foo: foo};
13+ const baz = {foo: foo};
1414```
1515
1616上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。下面是另一个例子。
@@ -32,15 +32,15 @@ f(1, 2) // Object {x: 1, y: 2}
3232除了属性简写,方法也可以简写。
3333
3434``` javascript
35- var o = {
35+ const o = {
3636 method () {
3737 return " Hello!" ;
3838 }
3939};
4040
4141// 等同于
4242
43- var o = {
43+ const o = {
4444 method : function () {
4545 return " Hello!" ;
4646 }
@@ -50,9 +50,9 @@ var o = {
5050下面是一个实际的例子。
5151
5252``` javascript
53- var birth = ' 2000/01/01' ;
53+ let birth = ' 2000/01/01' ;
5454
55- var Person = {
55+ const Person = {
5656
5757 name: ' 张三' ,
5858
@@ -69,8 +69,8 @@ var Person = {
6969
7070``` javascript
7171function getPoint () {
72- var x = 1 ;
73- var y = 10 ;
72+ const x = 1 ;
73+ const y = 10 ;
7474 return {x, y};
7575}
7676
@@ -81,7 +81,7 @@ getPoint()
8181CommonJS 模块输出一组变量,就非常合适使用简洁写法。
8282
8383``` javascript
84- var ms = {};
84+ let ms = {};
8585
8686function getItem (key ) {
8787 return key in ms ? ms[key] : null ;
@@ -107,7 +107,7 @@ module.exports = {
107107属性的赋值器(setter)和取值器(getter),事实上也是采用这种写法。
108108
109109``` javascript
110- var cart = {
110+ const cart = {
111111 _wheels: 4 ,
112112
113113 get wheels () {
@@ -126,7 +126,7 @@ var cart = {
126126注意,简洁写法的属性名总是字符串,这会导致一些看上去比较奇怪的结果。
127127
128128``` javascript
129- var obj = {
129+ const obj = {
130130 class () {}
131131};
132132
@@ -142,7 +142,7 @@ var obj = {
142142如果某个方法的值是一个 Generator 函数,前面需要加上星号。
143143
144144``` javascript
145- var obj = {
145+ const obj = {
146146 * m () {
147147 yield ' hello world' ;
148148 }
@@ -186,9 +186,9 @@ let obj = {
186186下面是另一个例子。
187187
188188``` javascript
189- var lastWord = ' last word' ;
189+ let lastWord = ' last word' ;
190190
191- var a = {
191+ const a = {
192192 ' first word' : ' hello' ,
193193 [lastWord]: ' world'
194194};
@@ -214,13 +214,13 @@ obj.hello() // hi
214214
215215``` javascript
216216// 报错
217- var foo = ' bar' ;
218- var bar = ' abc' ;
219- var baz = { [foo] };
217+ const foo = ' bar' ;
218+ const bar = ' abc' ;
219+ const baz = { [foo] };
220220
221221// 正确
222- var foo = ' bar' ;
223- var baz = { [foo]: ' abc' };
222+ const foo = ' bar' ;
223+ const baz = { [foo]: ' abc' };
224224```
225225
226226注意,属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串` [object Object] ` ,这一点要特别小心。
@@ -346,10 +346,10 @@ Object.defineProperty(Object, 'is', {
346346` Object.assign ` 方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
347347
348348``` javascript
349- var target = { a: 1 };
349+ const target = { a: 1 };
350350
351- var source1 = { b: 2 };
352- var source2 = { c: 3 };
351+ const source1 = { b: 2 };
352+ const source2 = { c: 3 };
353353
354354Object .assign (target, source1, source2);
355355target // {a:1, b:2, c:3}
@@ -360,10 +360,10 @@ target // {a:1, b:2, c:3}
360360注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
361361
362362``` javascript
363- var target = { a: 1 , b: 1 };
363+ const target = { a: 1 , b: 1 };
364364
365- var source1 = { b: 2 , c: 2 };
366- var source2 = { c: 3 };
365+ const source1 = { b: 2 , c: 2 };
366+ const source2 = { c: 3 };
367367
368368Object .assign (target, source1, source2);
369369target // {a:1, b:2, c:3}
@@ -372,7 +372,7 @@ target // {a:1, b:2, c:3}
372372如果只有一个参数,` Object.assign ` 会直接返回该参数。
373373
374374``` javascript
375- var obj = {a: 1 };
375+ const obj = {a: 1 };
376376Object .assign (obj) === obj // true
377377```
378378
@@ -400,11 +400,11 @@ Object.assign(obj, null) === obj // true
400400其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。
401401
402402``` javascript
403- var v1 = ' abc' ;
404- var v2 = true ;
405- var v3 = 10 ;
403+ const v1 = ' abc' ;
404+ const v2 = true ;
405+ const v3 = 10 ;
406406
407- var obj = Object .assign ({}, v1, v2, v3);
407+ const obj = Object .assign ({}, v1, v2, v3);
408408console .log (obj); // { "0": "a", "1": "b", "2": "c" }
409409```
410410
@@ -444,8 +444,8 @@ Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' })
444444` Object.assign ` 方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
445445
446446``` javascript
447- var obj1 = {a: {b: 1 }};
448- var obj2 = Object .assign ({}, obj1);
447+ const obj1 = {a: {b: 1 }};
448+ const obj2 = Object .assign ({}, obj1);
449449
450450obj1 .a .b = 2 ;
451451obj2 .a .b // 2
@@ -456,8 +456,8 @@ obj2.a.b // 2
456456对于这种嵌套的对象,一旦遇到同名属性,` Object.assign ` 的处理方法是替换,而不是添加。
457457
458458``` javascript
459- var target = { a: { b: ' c' , d: ' e' } }
460- var source = { a: { b: ' hello' } }
459+ const target = { a: { b: ' c' , d: ' e' } }
460+ const source = { a: { b: ' hello' } }
461461Object .assign (target, source)
462462// { a: { b: 'hello' } }
463463```
@@ -838,7 +838,7 @@ d.a // "a"
838838
839839``` javascript
840840// es6的写法
841- var obj = {
841+ const obj = {
842842 method : function () { ... }
843843};
844844obj .__proto__ = someOtherObj;
@@ -895,7 +895,7 @@ Object.getPrototypeOf({ __proto__: null })
895895Object .setPrototypeOf (object, prototype)
896896
897897// 用法
898- var o = Object .setPrototypeOf ({}, null );
898+ const o = Object .setPrototypeOf ({}, null );
899899```
900900
901901该方法等同于下面的函数。
@@ -957,7 +957,7 @@ function Rectangle() {
957957 // ...
958958}
959959
960- var rec = new Rectangle ();
960+ const rec = new Rectangle ();
961961
962962Object .getPrototypeOf (rec) === Rectangle .prototype
963963// true
@@ -1033,15 +1033,15 @@ for (let [key, value] of entries(obj)) {
10331033` Object.values ` 方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。
10341034
10351035``` javascript
1036- var obj = { foo: ' bar' , baz: 42 };
1036+ const obj = { foo: ' bar' , baz: 42 };
10371037Object .values (obj)
10381038// ["bar", 42]
10391039```
10401040
10411041返回数组的成员顺序,与本章的《属性的遍历》部分介绍的排列规则一致。
10421042
10431043``` javascript
1044- var obj = { 100 : ' a' , 2 : ' b' , 7 : ' c' };
1044+ const obj = { 100 : ' a' , 2 : ' b' , 7 : ' c' };
10451045Object .values (obj)
10461046// ["b", "c", "a"]
10471047```
@@ -1051,14 +1051,14 @@ Object.values(obj)
10511051` Object.values ` 只返回对象自身的可遍历属性。
10521052
10531053``` javascript
1054- var obj = Object .create ({}, {p: {value: 42 }});
1054+ const obj = Object .create ({}, {p: {value: 42 }});
10551055Object .values (obj) // []
10561056```
10571057
10581058上面代码中,` Object.create ` 方法的第二个参数添加的对象属性(属性` p ` ),如果不显式声明,默认是不可遍历的,因为` p ` 的属性描述对象的` enumerable ` 默认是` false ` ,` Object.values ` 不会返回这个属性。只要把` enumerable ` 改成` true ` ,` Object.values ` 就会返回属性` p ` 的值。
10591059
10601060``` javascript
1061- var obj = Object .create ({}, {p:
1061+ const obj = Object .create ({}, {p:
10621062 {
10631063 value: 42 ,
10641064 enumerable: true
@@ -1095,7 +1095,7 @@ Object.values(true) // []
10951095` Object.entries ` 方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。
10961096
10971097``` javascript
1098- var obj = { foo: ' bar' , baz: 42 };
1098+ const obj = { foo: ' bar' , baz: 42 };
10991099Object .entries (obj)
11001100// [ ["foo", "bar"], ["baz", 42] ]
11011101```
@@ -1127,8 +1127,8 @@ for (let [k, v] of Object.entries(obj)) {
11271127` Object.entries ` 方法的另一个用处是,将对象转为真正的` Map ` 结构。
11281128
11291129``` javascript
1130- var obj = { foo: ' bar' , baz: 42 };
1131- var map = new Map (Object .entries (obj));
1130+ const obj = { foo: ' bar' , baz: 42 };
1131+ const map = new Map (Object .entries (obj));
11321132map // Map { foo: "bar", baz: 42 }
11331133```
11341134
@@ -1220,7 +1220,7 @@ o3.a // undefined
12201220下面是另一个例子。
12211221
12221222``` javascript
1223- var o = Object .create ({ x: 1 , y: 2 });
1223+ const o = Object .create ({ x: 1 , y: 2 });
12241224o .z = 3 ;
12251225
12261226let { x, ... { y, z } } = o;
0 commit comments