1. for in 遍历对象的属性
2. Object.keys()
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,
数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致。
const obj = {
a: 2,
b: 1,
c: 0
}
for (let value of Object.keys(obj)) {
console.log(value) //a,b,c
}
3.Object.create()
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
将现有对象作新对象的 proto;
4. Object.assign()
Object.assign() 方法用于对象的合并,将源对象的所有可枚举属性,复制到目标对象。
返回目标对象。
Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)。
Object.assign(target, …sources)
(1) 可以克隆一个对象
const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
obj.a = 2;
//obj = {a: 2} copy = {a: 1}
(2) object.assign()是浅拷贝
//var obj2 = JSON.parse(JSON.stringify(obj))//深拷贝常用方法
const obj1 = { a: { b: 1 } };
const obj2 = Object.assign({}, obj1);
obj1.a.b = 2;
obj2.a.b // 2
(3) 同名属性会替换
const target = { a: { b: 'c', d: 'e' } }
const source = { a: { b: 'hello' } }
Object.assign(target, source)
// { a: { b: 'hello' } }
(4) 可以合并多个对象
const merge = (target, ...sources) => Object.assign(target, ...sources);
对象中的扩展运算符(…) 用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中
和Object.assign()作用一样,都用于合并对象,并且也是浅拷贝
/* let bar = { a: 1, b: 2 };
let baz = { ...bar }; // { a: 1, b: 2 }
*/
let bar = { a: 1, b: 2 };
let baz = { ...bar, ...{ a: 2, b: 4 } }; // {a: 2, b: 4}
5. Object.hasOwnProperty()
返回一个布尔值
用来检测对象自身属性中是否具有指定的属性。和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
const object1 = new Object();
object1.property1 = 42;
console.log(object1.hasOwnProperty('property1'));
// expected output: true
console.log(object1.hasOwnProperty('toString'));
// expected output: false
console.log(object1.hasOwnProperty('hasOwnProperty'));
// expected output: false
6. Object.isPrototypeOf()
用于测试一个对象是否存在于另一个对象的原型链上。
a.isPrototypeOf(b);判断的是a对象是否存在于b对象的原型链之中
A instanceof B 判断的是B.prototype是否存在与A的原型链之中
function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Foo.prototype);
Baz.prototype = Object.create(Bar.prototype);
var baz = new Baz();
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true
//检查 baz 对象是否继承自 Foo.prototype:
if (Foo.prototype.isPrototypeOf(baz)) {
// do something safe
}
7. Object.defineProperty()
劫持变量的set和get方法,将属性添加到对象,或修改现有属性的特性
var a = {};
Object.defineProperty(a, 'name', {
value : 'kong',
enumerable : true //该属性是否可枚举
})