有人可以在Javascript中解释这个语法 - “type = type ||'fx'”

时间:2011-11-22 18:42:59

标签: javascript variables conditional

  

可能重复:
  What does this construct (x = x || y) mean?

我见过这段代码here。在其他地方我也记不起一些类似的代码。

  1. time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;

  2. type = type || "fx";

  3. 这是什么意思?

    我根本不理解 a)但我认为*我理解 b)是这样的:

    如果type为false,则type将等于"fx",否则type将等于之前的任何内容。

    我不确定,但也许我错了。

    这个语法叫什么?条件变量? :P我尝试使用谷歌搜索答案,但不知道在我的查询中使用什么。

7 个答案:

答案 0 :(得分:4)

<强> A)

time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;

的同义词
if (jQuery.fx) {
    if (jQuery.fx.speeds[time]) {
        time = jQuery.fx.speeds[time];
    }
}

几乎相同

<强> b)中

type = type || "fx";

的同义词
if (!type) {
   type = "fx";
}

只需检查type是否不是falsenullundefined。如果是,type正在填充fx

答案 1 :(得分:2)

对于A,我们正在做的是if-else语句的快捷方式。问号前的内容引用if语句,下一个元素是“then”语句,最后一部分是“else”语句。

var action = my_status == 'hungry' ? 'eat' : 'do not eat';

在这种情况下,它会转化为这样的东西:

if (my_status == 'hungry')
   action = 'eat';
else
   action = 'do not eat';

对于B,双管(||)表示“或”。我们在这里评估的是基于一个或另一个是否为真的布尔值。

var not_hungry = ate_lunch || full;

如果ate_lunch OR full为true,则not_hungry也为真。

您可以使用双&符号(&amp;&amp;)表示同样的事情,即AND。

var single = nerdy && cocky;

如果书呆子和自大是真的,那么单身也是如此。如果只有其中一个是真的,那么语句解析为false(因为对于single来说两者都必须为真)。

希望有所帮助。 :)

编辑(h / t Phrogz): 值得注意的是||和&amp;&amp;在JavaScript中,不仅要对布尔值进行操作和求值,而且要测试“真实性”并评估两个操作数之一的“防护”操作符。 (

答案 2 :(得分:1)

time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;

可以写成:

if (jQuery.fx) {
   if (jQuery.fx.speeds[time]){
       time =  jQuery.fx.speeds[time];
   } 
}

在这种情况下,三元操作(? :)是多余的。如果JQuery.fx.speeds [time]不存在,则语句返回time - 因此它返回自己。

更一般:somevar = a || b称为短路评估。基本上它是一种简短的写作方式

if (a) {
  somevar = a;
} else {
  somevar = b;
}

答案 3 :(得分:0)

a)当且仅当jQuery.fx.speeds[time]jQuery.fx存在时,将时间设置为jQuery.fx.speeds[time]

if(jQuery.fx && jQuery.fx.speeds[time])
    time = jQuery.fx.speeds[time];

b)您的描述是正确的

答案 4 :(得分:0)

是的,你对它的作用是正确的。它被称为short-circuit评估。它与C的ternary operator类似。

答案 5 :(得分:0)

答案 6 :(得分:0)

a。)使用三元运算符构建,简单来说就是

time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;

等同于:

time = if(jQuery.fx){ jQuery.fx.speeds[time]; } else { time : time; }

b。)你是正确的,如果已定义类型,将定义该类型,否则它将默认为“fx”。但是,我不确定它是否有技术名称,除非它是OR

的逻辑表达式