Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.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 在if语句之外使用compare参数_Javascript_Jquery - Fatal编程技术网

Javascript 在if语句之外使用compare参数

Javascript 在if语句之外使用compare参数,javascript,jquery,Javascript,Jquery,我已经看到了以下代码 var xhr = $.ajax({...}); xhr && xhr.abort && xhr.abort(); ok(xhr, "XHR object is not null or undefined"); 努力理解第二行xhr&&xhr.abort&&xhr.abort() 我想知道这是什么意思 ok(bool,string)的定义 可以重写为 if (xhr) { if (xhr.abort) { xhr.abo

我已经看到了以下代码

var xhr = $.ajax({...});
xhr && xhr.abort && xhr.abort();
ok(xhr, "XHR object is not null or undefined");
努力理解第二行
xhr&&xhr.abort&&xhr.abort()

我想知道这是什么意思

ok(bool,string)的定义

可以重写为

if (xhr) {
   if (xhr.abort) {
       xhr.abort();
   }
}
也就是说,如果定义了
xhr
(而不是'falsy'),并且如果
xhr
定义了
abort
键,则调用
xhr.abort()

如果该行为:

xhr.abort();

然后,如果
xhr
undefined
,则将抛出
ReferenceError
。如果
xhr.abort
不是一个函数(或
undefined
),则将抛出
TypeError

第二行相当于:

if (xhr && xhr.abort && typeof xhr.abort === 'function') {
    xhr.abort();
}

如果上一条语句的第一部分失败(意味着xhr从未定义或它是
null
),则
QUnit
检查将失败。

不等效,&&隐式转换为
布尔值
,因此您正在检查'falsy'值,不一定是函数。是的,但如果我们只是检查是否定义了xhr.abort,并尝试在不作为函数的情况下调用它,则会出现错误。@KonstantinD Infrastics OP中的代码不会检查
xhr.abort
是否是函数。它只检查它是否存在。因此,第二行和你所写的并不相等。@JeffShaver我可以看出。问题是第二行不会出错,因为它会将错误转换为布尔值(false)。如果我们想要创建没有错误的等价代码,那么我们还需要为函数添加一个检查,这也是我要说的,因为如果我们不这样做,那么代码将永远不会到达QUnit断言-它将在较早的时候失败。:)如果没有任何代码,很难说ok函数做了什么……这是短路评估的一个例子。它从左到右求值,如果
&&&
前面的部分返回true,则只执行
&&&
右侧的操作。我认为这很聪明,因此右if语句的简写?@Val是的,您会在脚本语言中看到很多
bar&&foo()
也很常见,在
bar
为“非错误”的条件下执行
foo()
。i、 e.非
未定义
if (xhr && xhr.abort && typeof xhr.abort === 'function') {
    xhr.abort();
}