JavaScript中的真值总是有一个hasOwnProperty方法吗?

Does a truthy value in JavaScript always have a hasOwnProperty method?

本文关键字:hasOwnProperty 有一个 方法 JavaScript      更新时间:2023-09-26

这里我们可以看到JavaScript/ECMAScript中哪些类型的对象求值为false

我的问题是:如果一个变量评估为true,它是否保证有hasOwnProperty方法?

换句话说,下面的测试安全吗?

if (bar && bar.hasOwnProperty("foo")) { ... }

我的目标是防止像Cannot read property 'hasOwnProperty' of null这样的异常。

我的应用场景:在AngularJS $http服务错误处理程序中,我想为所有情况做好准备。这对我来说有点困难,因为我对JavaScript的经验并不丰富,而且这个错误处理程序可能被调用的不同情况也不容易测试。错误处理函数具有以下签名:

function(data, status, headers, config) {}

在函数体中,我像这样计算data:

if (data && data.hasOwnProperty("error")) {
    alert(data.error);
}

你觉得在任何情况下都是安全的吗?安全是指无论AngularJS实际上如何调用错误处理程序,这个测试都不会抛出异常。

No.

这是一个:

var bar = Object.create(null);

这是另一个hasOwnProperty,但没有更好:

var bar = {hasOwnProperty:function(){ throw "bouh" }};

但是你可以调用

Object.prototype.hasOwnProperty.call(bar, "foo")

注意,您可以通过执行

来避免求值为真
if (Object.prototype.hasOwnProperty.call(Object(bar), "foo")) {