JS三元运算符vs if / else

时间:2014-08-13 00:13:30

标签: javascript if-statement ternary-operator

尝试更好地理解JavaScript。我已经在这个论坛上检查了一些类似的问题,但我仍然对这一点感到困惑。

我在网上有一些代码可以切换模态窗口(div)和叠加层(div)的可见性 - (我知道这可能最好用jQuery完成,但我想先了解JS) :

function overlay() {
    el = document.getElementById("overlay");

    /* TERNARY */
    el.style.visibility = (el.style.visibility == "visible") ? "hidden" : "visible";

    /*
    if(el.style.visibility == "visible"){
        el.style.visibility = "hidden";
    }else if(el.style.visibility == "hidden"){
        el.style.visibility = "visible";
    }

   */   
}

我认为三元运算符只是编写if / else语句的一种更紧凑的方式。但是当我用上面代码中的三元运算符替换if / else语句(当前在代码中注释掉)时,代码不起作用。

我可能出了点问题,但我无法弄清楚是什么?有人可以帮忙吗?

感谢。

3 个答案:

答案 0 :(得分:4)

三元运算符(更准确地称为conditional operator)可以替换单个if / else(仅一个比较子句),而不是if / else-if(具有两个比较)。所以

var d = (a ? b : c);

相当于:

var d;

if (a) {
    d = b;
} else {
    d = c;
}

所以在你的情况下,你的条件运算符的if / else等价物是:

if (el.style.visibility == "visible") {
    el.style.visibility = "hidden";
} else {
    el.style.visibility = "visible";
}

同样,嵌套两个条件运算符可以产生与if / else-if:

等效的表达式
el.style.visibility = (el.style.visibility == "visible") ? 
    "hidden" : (el.style.visibility == "hidden") ? 
    "visible" : el.style.visibility;

显然,在这种情况下,如果你进行两次比较,if / else-if更具可读性,应该是首选。

答案 1 :(得分:1)

这两个代码块实际上并不相同。

检查“可见”或其他任何值

的值
/* TERNARY */
el.style.visibility = (el.style.visibility == "visible") ? "hidden" : "visible";

检查“可见”或“隐藏”

的值
if(el.style.visibility == "visible"){
    el.style.visibility = "hidden";
}else if(el.style.visibility == "hidden"){
    el.style.visibility = "visible";
}

您没有检查第三个值

style.visibility也可能是"",表示默认值。

当天的免费提示:如果看起来条件不起作用,请检查使用调试器或console.log来验证值是否符合您的预期。 99.99%的时间,您会发现这些值不是您认为的值。

答案 2 :(得分:0)

我想我会在函数返回另一个函数时添加另一个三元组的例子。而不是if / else if:

function greetCurried (greeting) {
  return function (name) {
    if (typeof(greeting) !== 'string') {
      return ('Greetings!');
    } else if (typeof(name) !== 'string') {
      return (greeting)
    }
    return (`${greeting}, ${name}`);
  }
}
你可以做三元:

const greetCurried = (greeting) => {
  typeof(greeting) != 'string' ? 'Greetings' : greeting
    return (name) => {
      return typeof(name) != 'string' ? greeting : `${greeting}, ${name}`
    }
  return
}

const greetHello = greetCurried('Hello');

console.log(greetHello('Hedi'));

console.log(greetHello(5));