用于字符串参数的Javascript*和*运算符

用于字符串参数的Javascript*和*运算符,javascript,Javascript,在jQuery Mobile中,我发现以下代码: $.jqmData = function( elem, prop, value ){ return $.data( elem, prop && $.mobile.ns + prop, value ); }; 我不明白的是这个结构: prop && $.mobile.ns + prop 它使用Javascript的逻辑and运算符,但用于jQuery数据的关键参数,它是一个字符串参数。有人能解释一下这个构造

在jQuery Mobile中,我发现以下代码:

$.jqmData = function( elem, prop, value ){
   return $.data( elem, prop && $.mobile.ns + prop, value );
};
我不明白的是这个结构:

prop && $.mobile.ns + prop

它使用Javascript的逻辑and运算符,但用于jQuery数据的关键参数,它是一个字符串参数。有人能解释一下这个构造吗?

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 );
};
有人能解释一下这个结构吗

JavaScript不仅适用于布尔语言,而且适用于任何类型。他们将在内部检查其真实性,但不会更改结果类型

对于字符串,只有空字符串被认为是错误的。AND运算符
&&
的工作原理类似于“如果左操作数错误,则返回它,否则返回右操作数”。因此,如果在字符串
prop
上调用,它将检查
prop
是否为空字符串,然后返回它,或者将它与
$.mobile.ns
连接起来。这是一条捷径

!prop ? prop : $.mobile.ns+prop
// or, if restricted to strings:
prop == "" ? "" : $.mobile.ns+prop

你从哪里得到这段代码的,它在这里看起来不同(而且更容易理解):它是一个客户端站点上生产的jQuery Mobile的旧版本。jQuery的对应版本是1.6.2,但这个问题更多地涉及javascript构造。我知道您可以使用javascript | |运算符作为合并运算符,但以前从未见过以这种方式使用的&&运算符。为了更好地理解,还应该注意,
未定义的
null
NaN
0
false
计算为
false
(falsy值)当其他每一个值(如
{}
[]
“hello”
)计算为
true
(truthy值)时,为什么会进行上选?“如果prop和$.mobile.ns等于true,将使用prop。如果其中一个值为false,将使用$.mobile.ns”,并且扩展的代码完全错误。
(未定义和(&false)===false
也是错误的。我认为它被提高了投票率,因为它比上一个答案(现在被删除)更接近准确,这意味着表达式将返回“true”或“false”@BruceHill:是的,可能吧。第一句话对我来说也很好,但从那以后,质量下降到了一团混乱:-(啊。好吧。这是有道理的。我认为布尔运算符总是返回true或false。谢谢,Bergi。经过这一解释后,这个构造更有意义。