Fn和Fn()的区别
当new 执行的时候,如果不传递实参,那么可以写成new Fn,也就是不加小括号,这被称为无参数列表。相反的,如果是new Fn()被称为带参数列表。
两者在优先级上也有区别
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
同时再强调一下,每一次new都是把函数重新执行,重新形成一个新的上下文,重新创造一个新的实例对象,代码重新执行。
检测属性是否为当前对象的成员
1.首先辨析两个概念:变量和属性。变量在stack里面的or当前上下文中。而属性是堆内存(heap)的成员。变量和属性完全没有共同点。
2.现在上前菜:检测一个属性是否为当前对象的成员
①key in obj:不论公有还是私有,只要有就是true
②obj.hasOwnProperty:必须是对象的私有属性,结果才是true;
3.正餐:自己拓展的检测对象的私有属性的
function hasPubProperty(attr, obj) {
//思路1:一个属性key,如果是obj的属性,但是不是公有的,那就是私有的。
//bug:如果一个属性既是私有的,又是公有的,那检测出来的结果就是不准的。
return (attr in obj) && (!obj.hasOwnProperty)
}
function hasPubProperty(attr, obj) {
//思路2:检测对象的原型上的属性,因为原型上的属性都是公共的
let proto = Object.getPrototypeOf(obj)
while (proto) {
if (proto.hasOwnProperty(attr)) {
return ture
}
proto = Object.getPrototypeOfObject.getPrototypeOf(proto)
//依次查找原型链,直到找到object.prototype为止。
}
}
遍历对象获取symbol属性
1.Object.keys(obj)获取当前对象obj的所有非symbol的私有属性[数组]
2. Object.getOwnPropertyNames(obj)返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
3. Object.getOwnPropertySymbols(obj):获取对象所有的symbol私有属性[数组]。
4. for…in循环遍历对象
①优先遍历数字属性,此时‘12’和12没有区别,同时数字属性按照从小到大的顺序排列。
②不会遍历symbol属性
③会遍历到自己拓展到类原型上的公共属性方法(可枚举的),内置的公共属性是不可枚举的,也就是不可遍历的。
Object.prototype.AA = 'WORKHARD'
let obj = {
name: 'doug',
age: 23,
0: 100,
[Symbol('AA')]: 200,
[Symbol.toPrimitive]: function() {
return 0;
}
}
for (let key in obj) {
if (!obj.hasOwnProperty(key));
break
console.log(key)
}
let keys = [
...Object.keys(obj),
...Object.getOwnPropertySymbols(obj)
]
keys.forEach(key => {
console.log(`属性名:${String(key)},属性值:${obj[key]}`);
})
/*属性名:0,属性值:100
VM12:21 属性名:name,属性值:doug
VM12:21 属性名:age,属性值:23
VM12:21 属性名:Symbol(AA),属性值:200
VM12:21 属性名:Symbol(Symbol.toPrimitive),属性值:function() {
return 0;
} */