es6 对象扩展

一. 对象简洁语法

let name = 'doudou';
let age = 18;

let obj = {
    name,
    age,
    run() {
        console.log('running')
    }
}

console.log(obj)

二.属性名表达式

JavaScript 定义对象的属性,有两种方法。

// 方法一
obj.foo = true;

// 方法二
obj['a' + 'bc'] = 123;

但是,如果使用字面量方式定义对象(使用大括号),在 ES5 中只能使用方法一(标识符)定义属性。

var obj = {
  foo: true,
  abc: 123
};

ES6 允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内。

let propKey = 'foo';

let obj = {
  [propKey]: true,
  ['a' + 'bc']: 123
};

表达式还可以用于定义方法名。

let obj = {
  ['h' + 'ello']() {
    return 'hi';
  }
};

obj.hello() // hi

注意,属性名表达式与简洁表示法,不能同时使用,会报错。

// 报错
const foo = 'bar';
const bar = 'abc';
const baz = { [foo] };

// 正确
const foo = 'bar';
const baz = { [foo]: 'abc'};

三. 对象新增

1. Object.is() 用来比较两个值是否相等

ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0

JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。

ES6 提出同值相等算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。

对于基本数据类型;我们用户肉眼上看着相等就为true,看着不等就为false

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

// 引用数据类型还是比较内存地址
Object.is({}, {})
// false
2. Object.assign() 用来合并对象的

用法

let 新对象 = Object.assign(目标对象,需要合并的对象)

// 返回目标对象

let json = {a:1};
let json2 = {b:2};
let json3 = {c:3};

// 后面的添加到第一个对象里并返回
let obj = Object.assign({},json,json2,json3);
console.log(obj);     // {a: 1, b: 2, c: 3}

// 如果要合并的对象具有相同的的属性,则后面的覆盖前面的
let json = {a:1};
let json2 = {b:2 , a:2};   // a属性和json对象重复
let json3 = {c:3};

let obj = Object.assign({},json,json2,json3);
console.log(obj);     // {a: 2, b: 2, c: 3}
2.1 如果属性名有重复,

如果合并的对象的属性名有重复就是后面的覆盖前面的

let json = {name:'wuwei'}
let json2 = {name:'haha',age:18}
let json3 = {name:'xiaxia',age:18,sex:1}

let obj = Object.assign({},json,json2,json3);
// {name: "xiaxia", age: 18, sex: 1}
2.2如果只有一个参数,Object.assign会直接返回该参数。
const obj = {a: 1};
Object.assign(obj) === obj // true
2.4 可以利用这个方法来拷贝数组

该方法拷贝数组为浅拷贝;
Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。也就是说,如果对象的属性值为简单类型(如string, number),通过Object.assign({},srcObj);得到的新对象为深拷贝;如果属性值为对象或其它引用类型,那对于这个对象而言其实是浅拷贝的。

let arr = [1,2,3]
let arr2 = Object.assign([],arr);
console.log(arr2);   // [1, 2, 3]
arr2.push(4);
console.log(arr2);   // [1, 2, 3, 4]
console.log(arr);    // [1, 2, 3]
3. Object.keys() Object.entries() Object.values()

循环json 和对象

let json = {
    name: "wuwei",
    age : 18,
    sex: "男"
}
// 遍历属性
for(let key of Object.keys(json)){
    console.log(key);   // name age sex
}

// 遍历属性值
for(let val of Object.values(json)){
    console.log(val);   // wuwei  18  男
}

// 遍历键值对
for(let item  of Object.entries(json)){
    console.log(item);   // ["name", "wuwei"] ["age", 18] ["sex", "男"]
}

// 解构遍历的键值对
for(let [key,value] of Object.entries(json)){
    console.log(key,value);   // name wuwei age 18 sex 男
}

也可以通过解构将Object身上的是哪个方法解构出来

// 解构Object身上的方法
let {keys,values,entries} = Object;

let json = {
    name: "wuwei",
    age : 18,
    sex: "男"
}
// 遍历属性
for(let key of keys(json)){
    console.log(key);   // name age sex
}

// 遍历属性值
for(let val of values(json)){
    console.log(val);   // wuwei  18  男
}

// 遍历键值对
for(let item of entries(json)){
    console.log(item);   // ["name", "wuwei"] ["age", 18] ["sex", "男"]
}
// 解构遍历的键值对
for(let [key,value] of entries(json)){
    console.log(key,value);   // name wuwei age 18 sex 男
}

四.对象的扩展运算符

解构赋值与…运算符
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1
y // 2
z // { a: 3, b: 4 }

由于解构赋值要求等号右边是一个对象,所以如果等号右边是undefinednull,就会报错,因为它们无法转为对象。

let { x, y, ...z } = null; // 运行时错误
let { x, y, ...z } = undefined; // 运行时错误

解构赋值必须是最后一个参数,否则会报错。

let { ...x, y, z } = obj; // 句法错误
let { x, ...y, ...z } = obj; // 句法错误

注意,解构赋值的拷贝是浅拷贝,即如果一个键的值是复合类型的值(数组、对象、函数)、那么解构赋值拷贝的是这个值的引用,而不是这个值的副本。

let obj = { a: { b: 1 } };
let { ...x } = obj;
obj.a.b = 2;
x.a.b // 2

扩展运算符

扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。

let z = { a: 3, b: 4 };
let n = { ...z };
n // { a: 3, b: 4 }

这等同于使用Object.assign方法。

let aClone = { ...a };
// 等同于
let aClone = Object.assign({}, a);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值