JavaScript中的truthy值是否始终具有hasOwnProperty方法?
我们可以看到JavaScript/ECMAScript中哪些类型的对象的计算结果为JavaScript中的truthy值是否始终具有hasOwnProperty方法?,javascript,Javascript,我们可以看到JavaScript/ECMAScript中哪些类型的对象的计算结果为false 我的问题是:如果变量的计算结果为true,是否保证有hasOwnProperty方法? 换句话说,以下测试是否安全 if (bar && bar.hasOwnProperty("foo")) { ... } 我的目标是防止出现异常,如无法读取null的属性“hasOwnProperty” 我的应用场景:在AngularJS$http服务错误处理程序中,我希望为所有情况做好准备。这对我来
false
我的问题是:如果变量的计算结果为true
,是否保证有hasOwnProperty
方法?
换句话说,以下测试是否安全
if (bar && bar.hasOwnProperty("foo")) { ... }
我的目标是防止出现异常,如
无法读取null的属性“hasOwnProperty”
我的应用场景:在AngularJS$http
服务错误处理程序中,我希望为所有情况做好准备。这对我来说有点困难,因为我对JavaScript没有太多的经验,而且调用这个错误处理程序的不同情况也不容易测试。错误处理程序函数具有以下签名:
function(data, status, headers, config) {}
在函数体中,我评估数据
,如下所示:
if (data && data.hasOwnProperty("error")) {
alert(data.error);
}
这在任何情况下对你来说都安全吗?从某种意义上说,安全性在于,无论AngularJS实际如何调用错误处理程序,该测试都不会引发异常。否
这里有一个:
var bar = Object.create(null);
下面是另一个带有hasOwnProperty
,但没有更好的功能:
var bar = {hasOwnProperty:function(){ throw "bouh" }};
但是你可以打电话
Object.prototype.hasOwnProperty.call(bar, "foo")
注意,您可以通过执行以下操作来避免对truthy的评估
if (Object.prototype.hasOwnProperty.call(Object(bar), "foo")) {
无法读取null的属性“hasOwnProperty”
,因为null
是错误的,所以这应该不是问题@DenysSéguret:如果你处理的是一个变量,这应该没问题。例如var a=1
a.hasOwnProperty是一个函数。@DenysSéguret:Stillvar n=1;(n&&n.hasOwnProperty(“bar”)
不会引发异常。您必须首先检查变量是否为对象:if(typeof bar='object'&&……
如果您想真正确定,您可能可以执行以下操作:if(data&&data.hasOwnProperty&&data.hasOwnProperty(“错误”))
@最后面的:错误,非对象也继承了该方法:alert(1.hasOwnProperty)
谢谢。这可能是唯一的情况吗?您如何更改我的测试以覆盖该场景?@Jan PhilipGehrcke:测试.hasOwnProperty
是真实的第一个。因此如果(data&&data.hasOwnProperty&&data.hasOwnProprety(“错误”))
if(Object.prototype.hasOwnProperty.call(Object(data),“error”)
现在有三个安全测试的建议,对吗。ii)if(data&&data.hasOwnProperty&&data.hasOwnProperty(“错误”))
和iii)if(数据类型=='object'&&data.hasOwnProperty(“错误”)
。你更喜欢哪一种?@DenysSéguret:从语义上说,我最喜欢Matt的方法。你们有技术优势吗?谢谢你已经提供的所有信息。@Jan PhilipGehrcke严肃地说:这并不重要。重点是确定风险和需要做什么。这些确保它不会失败的方法基本上是等效的。我的是一个更强大一点,因为它也工作,如果有自己的财产已被跟踪。