对象是通过new操作符构建出来的,所以对象之间不相等,除引用以外
console.log([1, 2, 3] === [1, 2, 3]) // false
对象要注意引用类型
var obj1 = {a:1}
var obj2 = obj1
console.log(obj1 === obj2) //true
对象的key都是字符串类型,'[object Object]'
var o = {b: 'bbb'}
var obj1 = {a: 1, '张三':'你好'}
obj1[o] = '123'
for(var k in obj1){
console.log(k, obj1[k], typeof k);
}
// a 1 string
// 张三 你好 string
// [object Object] 123 string
对象查找某个属性|方法
每个对象都是由构造函数创建(new)的,可以通过constructor属性找到对象的构造函数
function Fun(){}
let obj = new Fun()
console.log(obj.constructor) // [Function: Fun]
function Arr(){}
let arr = new Arr()
console.log(arr.constructor) // [Function: Arr]
1.每一个函数都自带一个prototype(原型),注意对象拥有__proto__
2.new Fun该Fun构造函数的原型指向于对象(new Fun)的原型
function Fun(){}
let obj = new Fun()
console.log(obj.__proto__===Fun.prototype) // true
面试题一
var obj1 = {a: 'hello'}
var obj2 = obj1
obj2.a = 'world'
console.log(obj1) // {a: 'world'}
(function(){
console.log(a); //undefined
var a = 1;
})()
面试题二
因为b和c都是对象,当它们成为a的key的时候都是'[object Object]',所以a[c]会覆盖掉a[b]
var a = {}
var b = {key:'a'}
var c = {key:'c'}
a[b] = '123'
a[c] = '456'
console.log(a[b]); //456
console.log(a); //{ '[object Object]': '456' }
面试题三
找a属性的优先级(原型链)
对象本身 > 构造函数本身 > 对象原型上找 > 构造函数原型上找
obj.a > this.a > obj.__proto__.a > Fun.prototype.a
function Fun(){
this.a = '在Fun函数中添加的a'
}
Fun.prototype.a = '这是Fun函数原型添加的a'
let obj = new Fun()
obj.a = "在obj添加的a"
obj.__proto__.a = "在obj原型上添加的a"