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

问题描述:

jQuery Mobile的我发现下面的代码操作:的Javascript *和*用于字符串参数

$.jqmData = function(elem, prop, value){ 
    return $.data(elem, prop && $.mobile.ns + prop, value); 
}; 

我不明白的是这个结构:

prop && $.mobile.ns + prop 

它使用Javascript的逻辑和运营商,但为参数为jQuery数据这是一个字符串参数。有人可以解释这个结构吗?

+1

快捷你从哪儿弄来这段代码,它看起来不同的(更容易理解)位置:https://github.com/jquery/jquery-mobile/blob/master/js /jquery.mobile.data.js#L92 – m90

+0

毫无疑问,它是在客户端生产的* jQuery Mobile *的老版本。 – BruceHill

+0

* jQuery *的相应版本是* 1.6.2 *,但这个问题更多地涉及到JavaScript构造。我知道你可以使用javascript ||运算符作为联合运算符,但从未见过以这种方式使用的&&运算符。 – BruceHill

能有人请解释这个结构?

JavaScript的logical operators不仅适用于布尔值,而且适用于任何类型。他们将在内部convert the values to boolean检查他们的真实性,但他们不会改变结果类型。

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

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

啊,好吧。我认为布尔运算符总是返回* true *或* false *。 – BruceHill

+0

谢谢,Bergi。在解释之后,构造更有意义。 – BruceHill

的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'''''''''','''''''','''''''''','''''''' ''(falsy值)其他值(例如'''',''''',''“hello”'')评估为“true”(真实值)。 – prayerslayer

+0

为什么这是upvoted?如果prop和$ .mobile.ns等于true,将使用* prop,如果其中一个为false,则将使用$ .mobile.ns *和扩展的代码,显然是错误的。 – Bergi

+0

'(undefined && false)=== false'也是错误的。 – Bergi