[英]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"));
正如名稱所示, hasOwnProperty
方法查看對象以查看它是否具有該屬性本身。
但是當你'propertyName' in test
使用'propertyName' in test
,你不僅要查看對象自己的屬性,還要查看繼承中的屬性。
在這種情況下, constructor
是駐留在Object
原型中的屬性,因此所有對象都具有該屬性,因為它們都從Object
繼承。
來自MDN的報價
來自Object的每個對象都繼承hasOwnProperty方法。 此方法可用於確定對象是否具有指定的屬性作為該對象的直接屬性; 與
in
運算符不同,此方法不會檢查對象的原型鏈。
從MDN文檔 :
繼承的屬性
in運算符為原型鏈中的屬性返回true。
"toString" in {}; // returns true
而hasOwnProperty()
方法只檢查對象上的屬性,而不是繼承(即不在原型鏈上)。
在MDN文檔之后,它不是可枚舉的字段。
您可以執行以下測試:
var obj = {"t": 23};
obj.propertyIsEnumerable("t")
結果:是的
obj.propertyIsEnumerable("constructor")
結果: false
本文檔的完整示例見以下部分:
直接與繼承屬性
我認為這里的正常行為key in object
操作符中的key in object
正在搜索原型鏈並為Object.prototype.constructor
返回true。 請參閱此討論 - 它涉及相關主題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.