Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的truthy值是否始终具有hasOwnProperty方法?_Javascript - Fatal编程技术网

JavaScript中的truthy值是否始终具有hasOwnProperty方法?

JavaScript中的truthy值是否始终具有hasOwnProperty方法?,javascript,Javascript,我们可以看到JavaScript/ECMAScript中哪些类型的对象的计算结果为false 我的问题是:如果变量的计算结果为true,是否保证有hasOwnProperty方法? 换句话说,以下测试是否安全 if (bar && bar.hasOwnProperty("foo")) { ... } 我的目标是防止出现异常,如无法读取null的属性“hasOwnProperty” 我的应用场景:在AngularJS$http服务错误处理程序中,我希望为所有情况做好准备。这对我来

我们可以看到JavaScript/ECMAScript中哪些类型的对象的计算结果为
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:Still
var 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严肃地说:这并不重要。重点是确定风险和需要做什么。这些确保它不会失败的方法基本上是等效的。我的是一个更强大一点,因为它也工作,如果有自己的财产已被跟踪。