簡體   English   中英

用於檢查對象中的“構造函數”鍵的奇怪的javascript行為

[英]Odd javascript behavior for checking “constructor” key in object

我實際上不確定我是不是偶然發現了javascript中的不需要的行為,或者這是否是某種預期的行為。

以下代碼生成一個真實的語句:

var test= {"test":1}
document.write("constructor" in test);    

http://jsfiddle.net/xyatxm2g/2/

如果我將其更改為以下代碼,它將返回false,因為它應該:

var test= {"test":1}
document.write(test.hasOwnProperty("constructor"));

http://jsfiddle.net/fg06ovvc/2/

正如名稱所示, hasOwnProperty方法查看對象以查看它是否具有該屬性本身。

但是當你'propertyName' in test使用'propertyName' in test ,你不僅要查看對象自己的屬性,還要查看繼承中的屬性。

在這種情況下, constructor是駐留在Object原型中的屬性,因此所有對象都具有該屬性,因為它們都從Object繼承。

來自MDN的報價

來自Object的每個對象都繼承hasOwnProperty方法。 此方法可用於確定對象是否具有指定的屬性作為該對象的直接屬性; in運算符不同,此方法不會檢查對象的原型鏈。

MDN文檔

繼承的屬性
in運算符為原型鏈中的屬性返回true。
"toString" in {}; // returns true

hasOwnProperty()方法只檢查對象上的屬性,而不是繼承(即不在原型鏈上)。

在MDN文檔之后,它不是可枚舉的字段。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable

您可以執行以下測試:

var obj = {"t": 23};
obj.propertyIsEnumerable("t")

結果:是的

obj.propertyIsEnumerable("constructor")

結果: false

本文檔的完整示例見以下部分:

直接與繼承屬性

我認為這里的正常行為key in object操作符中的key in object正在搜索原型鏈並為Object.prototype.constructor返回true。 請參閱此討論 - 它涉及相關主題。

如何檢查對象是否在JavaScript中具有屬性?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM