直接上代码及比较结果吧,后续再补充:
// 对象构建:
var obj1 = {name:'hx'};
var obj2 = new Object({name:'hx'});
var obj3 = new Object(obj1);
var obj4 = Object.create({name:'hx'});
var obj5 = Object.create(obj1);
// 对象比较:
obj1 === obj2; // false
obj1 === obj3; // true (只此一个例外)
obj2 === obj3; // false
obj1 === obj4; // false
obj1 === obj5; // false
obj2 === obj4; // false
obj2 === obj5; // false
obj4 === obj5; // false
// 原型对象比较:
obj1.__proto__ === obj2.__proto__; // true
obj2.__proto__ === obj3.__proto__; // true
obj1.__proto__ === obj4.__proto__; // false
obj1.__proto__ === obj5.__proto__; // false
obj2.__proto__ === obj4.__proto__; // false
obj2.__proto__ === obj5.__proto__; // false
obj4.__proto__ === obj5.__proto__; // false
结论:
-
引用类型比较的是内存地址,因此有:
{a:1} === {a:1}; // false
-
var a = {}
是一种语法糖,相当于var a = new Object({})
,因此:({x:1}).__proto__.constructor === Object; // true
(new Object({y:2})).__proto__.constructor === Object; // true
-
Object.create创建的是一个“空”对象,不继承Object的属性和方法,因此:
(Object.create(null)).__proto__; // undefined
(Object.create({})).__proto__.hasOwnProperty('__proto__'); // false
(new Object({})).__proto__.hasOwnProperty('__proto__'); // true
(Object.create({})).__proto__.__proto__.__proto__; // null
(new Object({})).__proto__.__proto__; // null
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。