【发布时间】:2019-01-30 12:35:24
【问题描述】:
对于某些值,调用 hasOwnProperty 会引发错误。
让我们检查以下代码:
null.hasOwnProperty('bar') // Error
undefined.hasOwnProperty('bar') // Error
(0).hasOwnProperty('bar') // Returns false
除了null 和undefined 之外,是否还有其他变量在使用.hasOwnProperty 调用时会引发错误?
设置对象属性的相同问题:
null.bar // Error
undefined.bar // Error
(0).bar === undefined // Returns true
=========
在我的 Node.js 环境中引发错误的另一种情况:
在浏览器中
'use strict';
(0).bar = 0; // Nothing happens
在 Node.js v.10.3.0 中:
(0).bar = 0; // Nothing
'use' strict';
(0).bar === undefined; // Returns true
true.bar === undefined; // Returns true
''.bar = '';// STILL NOTHING HAPPENS
(0).bar = 0; //TypeError: Cannot create property 'bar' on number '0'
(true).bar = true; // TypeError: Cannot create property 'bar' on boolean 'true'
========
最终,我找到了Check if a value is an object in JavaScript:
if (obj instanceof Object) obj.hasOwnProperty(...) // Or set a property on it
这个解决方案完全满足我的需求。
【问题讨论】:
-
null和undefined不是变量,它们是类型。从概念上讲,不存在的东西 (null) 或未定义的东西 (undefined) 不可能有任何属性。 -
从
null派生的任何对象都没有hasOwnProperty方法,但是您可以创建该方法。 -
hasOwnProperty 需要一个对象(或从对象继承的东西)。要查看什么是 not 对象,请参见此处:quora.com/Is-everything-an-object-in-Javascript
-
不确定
(0).bar = 0与您最初的问题有什么关系……?无论如何,请参阅stackoverflow.com/questions/49682661/…。 -
@Ry- 我在对象上递归设置属性。我只想涵盖所有可能发生的情况。例如,
recursivelySet(obj, path, value)。如果有人通过recursivelySet(1, 'foo.bar', 0),我希望该功能检测到这种情况并且什么都不做。或者更明显的情况,recursivelySet({foo: 1}, 'foo.bar', 0)
标签: javascript node.js ecmascript-6 strict hasownproperty