ES6特性:对象的扩展

对象(object)是JavaScript重要的数据结构,ES6对它进行了很大的改善。

(1)属性的简洁表示法

ES6允许直接写入变量和函数,作为对象的属性和方法。

ES6允许在对象之中直接写变量。这时属性名就是变量名,属性值就是变量值。同时方法也可以简写,如果是Generator函数,前面需要加上星号。

const foo='aa';
const baz={foo};
baz     // {foo:"aa"}
// 等同于
const baz={foo:foo}

function f(x,y){
    return {x,y}
}
// 相当于
function f(x,y){
    return {x:x,y:y}
}
f(1,2);    // {x:1,y:2}

const o={
    method(){}
    // 相当于method:function(){}
}

const obj={
    * m(){
        yield 'hello'
    }
}

(2)属性名表达式

ES6允许用表达式作为属性名,但是一定要将表达式放在方括号内。

let obj={
    ["na"+"me"](){
        return "张三"
    }
}
obj.name    // "张三"

(3)对象新增方法

1. Object.is():判断两个值是否严格相等

与ES5的严格运算符不同的是:ES5中+0等于-0,NaN不等于NaN;而该方法+0不等于-0,NaN等于自身

+0 === -0    // true
NaN === NaN    // false
Object.is(+0,-0)    // false
Object.is(NaN,NaN)    // true

2. Object.assign():用于对象的合并,将源对象的所有可枚举属性,复制到目标对象

let target={a:1};
let source1={b:2};
let source2={b:3};
Object.assign(target,source1,source2);
target    // {a:1,b:2,c:3}

如果目标对象与源对象有同名属性,或者多个源对象有同名属性,那么后面的属性会覆盖前面的 ;如果只有一个参数,会直接返回该参数;如果参数不是对象,会先转换成对象;undefined和null无法转成对象,它们作为参数会报错。

如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着,如果undefined和null不在首参数,就不会报错

Object.assign(1)    // Number {1}
Object.assign(null)    // 报错
Object.assign(2,null)    // Number {2}

注意:

Object.assign实行的是浅拷贝,即源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用

let o1={a:{b:1}};
let o2=Object.assign({},o1);
o2    // {a:{b:1}}
o1.a.b=123;
o2    // {a:{b:123}}

同名属性会替换,发生覆盖。

数组的处理,会把数组视为对象

Object.assign([1,2,3],[4,5])    // [4,5,3]
// 会将数组处理成对象,所以先将[1,2,3]转为{0:1,1:2,2:3},然后再进行属性复制,源对象的0号 1号属性覆盖了目标对象

取值函数的处理:如果要复制的值是一个取值函数,先求值再复制

let source={
    get foo(){
        return 1+1;
    }
}
Object.assign({},source);    // {foo:2}

猜你喜欢

转载自blog.csdn.net/qq_41049816/article/details/88682179