在Javascript中假设"constructor"值不是"null"或"undefined"的变量上存在属性是否安全?



我想知道,假设在JavaScript中,如果变量的值不是"null"或"undefined",那么它将始终具有"构造函数"属性是否安全。

我遇到了一种情况,我必须检查是否定义了一个变量,如果它是一个数组,如果是,则检查它的长度是否>0:

if(variable && variable.constructor === Array && variable.length > 0) {
...loop through the array
}

如果变量不是"未定义"或"null",那么我是否正确地假设它将始终具有构造函数?

您的if语句不会抛出,因为您已经做出了这样的假设,因为任何通过第一次检查的语句都将支持您的第二次检查,即使没有constructor属性(您只会得到undefined),事实上即使它不是对象(它会被临时提升)。因此,从这个意义上说,是的,你可以愉快地做你正在做的事情—除非您可以处理来自另一个窗口的数组,在这种情况下,=== Array将失败(正如dandavis所指出的),因为不同的窗口具有不同的Array构造函数实例。

注意,这与具有constructor属性的每个对象不同。只是如果对象没有,你会得到undefined,而不是一个错误。(您可以通过创建一个没有原型的对象来获得一个没有constructor属性的对象:var obj = Object.create(null);,或者使用一个原型为null的对象作为对象的原型。)


然而,在某种程度上,我不会使用该机制来检查某个东西是否是数组。在任何现代环境中,我都会使用Array.isArray;我会在旧的环境中填充它。这也具有从其他窗口处理数组的愉快效果。

undefinednull没有构造函数,如果你试图获取它,就会出错。只需在Ctrl+Shift+I上试用一下,然后再试用一下。不过,我怀疑你的if语句会引起太多麻烦,而且在实际使用中很可能会出错。

您不需要检查长度或任何东西,只需查看它是否存在(或者如果您想要特定的数组,也可以检查它)。

最新更新