ES6对JavaScript的对象方法进行了大量的扩展和优化,为开发者提供了更强大的工具来处理对象。以下是一些关键的Object方法及其应用实例:
1. **Object.is()**
`Object.is()` 方法用于判断两个值是否完全相等,它考虑了NaN的特殊情况以及+0和-0的差异。与传统的`===`运算符不同,`Object.is()`在比较NaN时会返回true,而`===`则会返回false。此外,对于+0和-0,`Object.is()`也会区分它们。
```javascript
console.log(Object.is({},{}), {} === {}); // false, false
console.log(Object.is(NaN,NaN), NaN === NaN); // true, false
console.log(Object.is(+0,-0), +0 === -0); // false, true
```
2. **Object.assign()**
`Object.assign()` 方法用于合并或拷贝对象的属性。它将源对象的可枚举属性复制到目标对象,并且如果有多源对象,后面的属性会覆盖前面的同名属性。
```javascript
var obj = {};
var obj2 = Object.assign(obj,{name:'Joh'},{age:10});
console.log(obj === obj2, obj); // true, {name:'Joh', age:10}
```
这个方法在处理默认选项或配置对象时非常有用,例如:
```javascript
const DEFAULT_OPTIONS = { name:"Joh"};
function test(opts) {
let options = Object.assign({}, DEFAULT_OPTIONS, opts);
console.log(options);
}
test(); // {name: "Joh"}
test({name:"Lily",age:10}); // {name: "Lily", age: 10}
```
3. **Symbol属性拷贝**
`Object.assign()` 也可以拷贝Symbol属性,即使这些属性是不可枚举的。
```javascript
var skey1 = Symbol('test');
var skey2 = Symbol('test');
var obj = {};
Object.assign(obj,{name:'Joh'},{age:10},{[skey1]: 'I am test1'},{[skey2]: 'I am test2'});
console.log(obj[skey1]); // I am test1
console.log(obj); // {name: "Joh", age: 10, Symbol(test): "I am test1", Symbol(test): "I am test2"}
```
4. **Object.keys(), Object.getOwnPropertyNames(), Object.getOwnPropertySymbols()**
这些方法用于获取对象的属性信息。
- `Object.keys()` 返回对象自身的所有可枚举属性的数组,不包括原型链上的属性和Symbol属性。
- `Object.getOwnPropertyNames()` 类似,但返回的是对象的所有可枚举属性(包括不可枚举但非Symbol的属性)。
- `Object.getOwnPropertySymbols()` 返回对象的所有Symbol属性。
```javascript
class A { constructor() { this.name = 'Joh'; } [Symbol('fullnameA')] () { } getName() { }}
class B extends A { constructor() { super(); this.age = 22; } [Symbol('fullnameB')] () { } getAge() { }}
B.prototype.getColor = function () {};
var b = new B();
console.log(Object.keys(b)); // ["name", "age"]
console.log(Object.getOwnPropertyNames(b)); // ["name", "age"]
console.log(Object.keys(B.prototype)); // ["getColor"]
console.log(Object.getOwnPropertyNames(B.prototype)); // ["constructor", "getColor", "getAge"]
```
5. **Object.getOwnPropertyDescriptor()**
这个方法返回指定对象上一个属性的描述符,包括属性的可枚举性、可写性和值。这对于查看和修改对象的属性特性非常有用。
```javascript
const descriptor = Object.getOwnPropertyDescriptor(B.prototype, 'getAge');
console.log(descriptor);
```
ES6中的这些Object方法极大地增强了我们处理和操作JavaScript对象的能力,使代码更加灵活和可维护。通过熟练掌握这些方法,开发者能够编写出更高效、更健壮的代码。