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();
}