Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的三元语句:不赋值的陷阱?_Javascript_Syntax_Ternary Operator - Fatal编程技术网

Javascript中的三元语句:不赋值的陷阱?

Javascript中的三元语句:不赋值的陷阱?,javascript,syntax,ternary-operator,Javascript,Syntax,Ternary Operator,有时我使用三元语句来简化和缩短代码的长度 传统上,三元语句用于为变量赋值,但在JS中,我也可以编写不赋值的三元语句,根据对问题的布尔响应执行不同的结果-例如: anyVariable > someValue ? funcOne(anyVariable): funcTwo(anyVariable); 这段代码不会抛出任何错误,但jsLint抱怨说,它看到了一个表达式,它期望在其中进行赋值或函数调用 以这种方式使用三元语句(Javascript)时,我是否有任何陷阱或潜在

有时我使用三元语句来简化和缩短代码的长度

传统上,三元语句用于为变量赋值,但在JS中,我也可以编写不赋值的三元语句,根据对问题的布尔响应执行不同的结果-例如:

anyVariable > someValue ? 
    funcOne(anyVariable): 
    funcTwo(anyVariable);
这段代码不会抛出任何错误,但jsLint抱怨说,它看到了一个表达式,它期望在其中进行赋值或函数调用


以这种方式使用三元语句(Javascript)时,我是否有任何陷阱或潜在问题需要注意?

我会避免它,如果使用不正确,那么它将导致错误(我看到了
无效的左手赋值
等等)。如果您使用的是一个好的迷你程序(比如Uglify),那么它将在运行构建过程时为您完成所有这一切——这将使您的开发代码可读性和易用性

我坚持只在赋值时使用它。

JS(L | H)int会抱怨这一点,因为它只是一个表达式,而不是一个语句。在这种情况下,最好使用if:

if(anyVariable > someValue){
    funcOne(anyVariable);
} else {
    funcTwo(anyVariable);
}
编辑 如果简洁是一个目标,您可以忽略大括号:

if(anyVariable > someValue) funcOne(anyVariable)
else funcTwo(anyVariable);
/edit

这里的好处是,您的代码更具可读性(因为它是所有赋值或函数调用),并且如果您需要在每个子句中扩展或执行多个操作,那么您已经为它做好了准备

然而,三元运算符在赋值中使用得很好:

var thisVariable = someValue > thatValue ? someValue : thatValue;
这将通过筛选,该语句虽然简洁,但仍具有相当的可读性,然而,在测试“虚假”值时,我更喜欢:

var thisVariable = someValue || thatValue;

如果
someValue
为“false”,它将
this变量设置为
thatValue

这种方式不应该有任何陷阱。考虑下面的陈述-

b = a = 10;
我们可以省略语句中的“b=”部分,而不存在任何问题。三元语句也是这样

通常,您应该避免这种类型的使用,因为前几行中的错误可能会导致后面的代码出现问题。但是如果你使用if-else,那么你可以避免这样的问题

// user made a typo on the first line. but this code has correct syntax 
b = 10 +
a > 10 ? fun(20) : fun(0);

// same scenario using if-else will generate a compilation error which is preferred.
b = 10 +
if (a>10) {
    fun(20);
}
else {
    fun(0);
}

我之所以不使用它,是因为它与标准的if/else构造相比,读起来很差。使用三元语句代替if/else在技术上可能是可行的,而且“更短”,但它肯定不会改进代码。潜在的问题是,任何查看您的代码的人(这可能包括6个月后的您)都不会像您使用了适当的构造一样容易理解它。此外,缩小JS后,它也不会短很多。这不是一个完整的答案,但我昨天碰巧测试了一个标准的
if/then
结构和它的三元等效结构之间的性能,还有一个问题,性能值非常相似,在某些浏览器上使用
if/then
时有一个非常微小的优势。mccainz&@veddermatic我真的不同意这样读起来不好。也许人们对它不太熟悉——但除了熟悉之外,这本书很容易阅读。这不是什么疯狂的嵌套复杂语句。你真的因为语法的原因而对这句话中发生的事情感到困惑吗?我不想打断你,但你错了。如果代码的意思是“If X,do Y,else do Z”,那么您应该使用If语句,因为它既符合代码的意图,又对任何阅读它的人来说都是显而易见的。如果某个值不是假的呢?例如,让我们假设someValue=10。我也不同意可读性。我认为我提供的三元示例非常可读,并且比单语句情况下的if/else更加考虑。我确实同意可扩展性的好处,但我只在不需要做更多工作的单语句情况下使用它。考虑到该语句正在调用函数,您需要在if语句中激发的任何多余语句都可以委托给该函数。@mikeyUX if
someValue
不是错误的,在最后一个示例中,
thisviable
将设置为
someValue
。JS中的布尔运算符是短路的——一旦满足一个条件,表达式的其余部分将不会被计算。因为
someValue
不是false,它只是返回并设置
thisVariable
。@mikeyUX至于可读性,这就是为什么我使用了术语argumentative。对于我的团队和我的代码,我们不允许这样使用三元。记住:简洁可能会使创建代码“更容易”,但不会使维护代码更容易。你的代码越明确,就越容易确定你以后的意图。同意争论的观点-所以请原谅我,因为我将要争论一点:)。。。在我列出的示例中,我不认为有任何问题可以决定意图。此外,我认为您在编辑中提供的简洁示例可能比我最初提供的三元语句(请参见此处的顶部答案:)更成问题。@mikeyUX我不想争辩。你的问题是关于陷阱。技术上没有。您的程序正在运行。这些陷阱都是风格上的。如果您更喜欢这一点,请禁用JSHint:
expr:false
中的警告,感谢您提供了一个潜在代码错误的示例,而不是关于可读性/正确性的意见。