JavaScript中使用“and”运算符处理字符串参数

3
在jQuery Mobile中,我找到了以下代码:
$.jqmData = function( elem, prop, value ){
   return $.data( elem, prop && $.mobile.ns + prop, value );
};

我不理解的是这个结构:
prop && $.mobile.ns + prop

它使用了Javascript的逻辑与运算符,但是用于jQuery data的key参数,该参数是一个字符串参数。能否有人解释一下这个结构?


1
你从哪里得到这段代码的?在这里看起来不同(而且更容易理解):https://github.com/jquery/jquery-mobile/blob/master/js/jquery.mobile.data.js#L92 - m90
承认地说,在客户现场生产的jQuery Mobile版本是较旧的。 - BruceHill
对应的 jQuery 版本是 1.6.2,但这个问题更涉及到 JavaScript 结构。我知道你可以使用 JavaScript 的 || 运算符作为合并运算符,但从未见过 && 运算符以这种方式使用。 - BruceHill
2个回答

4

使用布尔运算符时,JavaScript 不会隐式返回布尔值:

&& 如果两个元素都等于 true,则返回第二个元素;如果其中一个为 false,则返回第一个元素。 || 如果第一个元素等于 true,则返回第一个元素;如果第一个元素为 false,则返回第二个元素。

以下是一些示例:

("foo" && "bar") === "bar"
(1 && "foo") === "foo"
(undefined && false) === undefined
(1 || "foo") === 1
(0 || "foo") === "foo"
(undefined || "foo") === "foo"
(undefined || 1) === 1
(undefined || false) === false

你来自jQuery mobile的案例: prop && $.mobile.ns + prop - 在这种情况下,如果prop$.mobile.ns都等于true,则将使用prop。如果其中一个为false,则将使用$.mobile.ns我认为在prop === null等于空字符串的情况下会使用它。 你可以将其扩展为:
$.jqmData = function( elem, prop, value ){
   if(prop == false) 
      prop = $.mobile.ns

   return $.data( elem, prop + prop, value );
};

1
为了更好地理解,还应注意到,“undefined”、“null”、“NaN”、“0”、“”和“false”都会被评估为“false”(假值),而每个其他值(如“{}”、“[]”、““hello””)都会被评估为“true”(真值)。 - prayerslayer
为什么这个被点赞了?"如果prop和$.mobile.ns都等于true,将使用prop。如果其中一个为false,则使用$.mobile.ns "以及展开的代码是错误的。 - Bergi
(undefined && false) === false 这也是错误的。 - Bergi
我认为它被点赞是因为它比之前的答案更接近准确,而之前的答案已被删除,它暗示了表达式将返回"true"或"false"。 - BruceHill
@BruceHill:是的,可能吧。第一句话对我来说看起来非常好,但从那以后质量就变得一团糟了 :-( - Bergi
抱歉回答质量不高,我得赶紧离开了。已经编辑过了。 - HenningCash

2
请有人解释一下这个结构是什么意思?
JavaScript的逻辑运算符不仅适用于布尔值,而且可以适用于任何类型。它们会在内部将值转换为布尔值以检查其真假性,但不会更改结果类型。
对于字符串,只有空字符串被认为是假的。AND运算符&&的工作原理类似于“如果左操作数为假,则返回它,否则返回右操作数”。因此,如果在字符串prop上调用它,它将检查prop是否为空字符串,然后返回它,否则将它与$.mobile.ns连接起来。这是一个快捷方式。
!prop ? prop : $.mobile.ns+prop
// or, if restricted to strings:
prop == "" ? "" : $.mobile.ns+prop

啊,好的。这很有道理。我以为布尔运算符总是返回truefalse - BruceHill
谢谢,Bergi。在这个解释之后,这个结构更有意义了。 - BruceHill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接