直接上代碼及比較結果吧,後續再補充:
// 對象構建: 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
結論:
引用類型比較的是內存地址,所以有:code
{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