我们知道 for..in 循环不关心属性是否是对象原型链的属性。所以它会全部输出属性。让我们做一个测试
var o={};
for(var i in o){
console.log(o[i]);// output none
}
一个对象(通过这种方式创建:{})来自Object,
但是当我们运行代码时,没有输出Object原型链方法(如toString)
为什么没有输出Object原型链中的方法(toString) ???
我们知道 for..in 循环不关心属性是否是对象原型链的属性。所以它会全部输出属性。让我们做一个测试
var o={};
for(var i in o){
console.log(o[i]);// output none
}
一个对象(通过这种方式创建:{})来自Object,
但是当我们运行代码时,没有输出Object原型链方法(如toString)
为什么没有输出Object原型链中的方法(toString) ???
toString
不可枚举:
("toString" in {}) === true
({}).propertyIsEnumerable("toString") === false
您可以创建自己的不可枚举属性,如下所示:
var object = {};
Object.defineProperty(object, "property", { enumerable: false, value: 5 });
从技术上讲,您可以省略enumerable: false
, 因为这是默认设置。
这在第 15 条总括条款的规范中有所说明:
在任何情况下,本节中描述的内置
Function
对象的长度属性都具有属性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }
。除非另有说明,否则本节中描述的所有其他属性都具有属性。{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }