Javascript hasOwnProperty是否仍应在语句中与for..一起使用
有很多博客说只要使用Javascript hasOwnProperty是否仍应在语句中与for..一起使用,javascript,Javascript,有很多博客说只要使用for..in循环,就应该使用hasOwnProperty检查,但我不明白为什么会这样。无论有没有检查,我们都得到相同的结果 签出。如果您使用{}创建一个基本对象,或者使用JSON.parse从JSON获取它,那么hasOwnProperty在全局上是无用的 但是,如果您正在扩展一个“类”(使用原型),那么它将帮助您了解您是否正在访问“自己的属性”(直接属性,包括直接函数) 请注意,基本对象至少有一个(非直接)属性,您可以使用console.log({})发现该属性或cons
for..in
循环,就应该使用hasOwnProperty
检查,但我不明白为什么会这样。无论有没有检查,我们都得到相同的结果
签出。如果您使用
{}
创建一个基本对象,或者使用JSON.parse
从JSON获取它,那么hasOwnProperty
在全局上是无用的
但是,如果您正在扩展一个“类”(使用原型),那么它将帮助您了解您是否正在访问“自己的属性”(直接属性,包括直接函数)
请注意,基本对象至少有一个(非直接)属性,您可以使用console.log({})发现该属性
或console.log({}.toString)
但在中用于。。。在
循环中:
for…in循环不会迭代不可枚举的属性。
从内置构造函数(如Array和Object)创建的对象
从Object.prototype和继承的不可枚举属性
不可枚举的String.prototype,例如字符串的indexOf
方法或对象的toString方法。循环将遍历所有
对象的可枚举属性或从其继承的属性
建造商的原型(包括覆盖内置
属性)
如果没有
hasOwnProperty
,您就不知道该属性是对象的本机属性还是从其原型继承的属性
var obj1 = {a:"10",b:"20"};
Object.prototype.c = "prototype:30";
var i;
for(i in obj1) {
document.getElementById("div1").innerHTML += obj1[i]+" ";
}
// result 10 20 prototype:30
for(i in obj1) {
if(obj1.hasOwnProperty(i)) {
document.getElementById("div2").innerHTML += obj1[i] +" ";
}
}
// result 10 20
在这种情况下,
obj1
从它的原型Object
继承属性c
,您会在第一个循环中错误地列出它。通常,无论是否使用hasOwnProperty
,您都会得到相同的结果,但后者忽略了继承的属性,而不是直接存在于相关对象上
考虑一下这个基本的继承系统。狗是从动物大师班继承来的
function Animal(params) { this.is_animal = true; }
function Dog(params) { for (var i in params) this[i] = params[i]; }
Dog.prototype = new Animal();
var fido = new Dog({name: 'Fido'});
如果我们查看fido
,hasOwnProperty
可以帮助我们确定哪些是它自己的属性(名称),哪些是继承的
for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]);
…警报
name=Fido
而非是\u animal=true
这就是为什么我们需要hasOwnProperty()方法的原因。在语句中:这不是无用的,这对于确保代码安全并使其始终正确运行非常重要。因为某些库或某些依赖项可以随时在程序上下文中接触Object.prototype,而无需进行hasOwnProperty检查,您的for…in语句可能会迭代意外的键。因此,您需要使用hasOwnProperty()使for…in语句安全
var obj={
答:1,,
b:2
};
Object.prototype.haha=3;
用于(obj中的var k){
if(对象hasOwnProperty(k)){
console.log(k);//打印a、b
}
}
var obj={
答:1,,
b:2
};
Object.prototype.haha=3;
用于(obj中的var k){
console.log(k);//打印a,b,哈哈
}
当您无法完全控制页面中的代码时,检查此FIDLE outhasOwnProperty
并非无用且必要。假设某人修改了对象。原型,就像克里斯托夫的回答一样。。即使是一个简单的对象,如果没有hasOwnProperty
,你也会得到不可预测的结果。我想说,弄乱你没有完全控制权的代码与用{}创建基本对象或从JSON获取它是不同的类别