Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript hasOwnProperty是否仍应在语句中与for..一起使用_Javascript - Fatal编程技术网

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 out
hasOwnProperty
并非无用且必要。假设某人修改了对象。原型,就像克里斯托夫的回答一样。。即使是一个简单的对象,如果没有
hasOwnProperty
,你也会得到不可预测的结果。我想说,弄乱你没有完全控制权的代码与用{}创建基本对象或从JSON获取它是不同的类别