尝试更好地理解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语句(当前在代码中注释掉)时,代码不起作用。
我可能出了点问题,但我无法弄清楚是什么?有人可以帮忙吗?
感谢。
答案 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));