Javascript给`ternary`运算符赋多个值

7
如何给三元运算符分配多个值?这不可能吗?我尝试过像这样,但是会出现错误:
size === 3 ? (  var val1=999,  var val2=100; )  : 0;

并且。
size === 3 ? (  var val1=999; var val2=100; )  : 0;

以上两种方法都会报错。如何同时设置var val1var val2

我可以直接声明它们,但我想知道这里的三元运算符方法。


1
为什么不使用 if?另外,var val1=999, var val2=100; 是非法语法。 - Rajesh
可能是[在条件表达式(三元运算符)中声明变量]的重复问题(https://dev59.com/SHfZa4cB1Zd3GeqPQ2Jw)。 - Andreas
7个回答

8

var size=3;
var val1=null;
var val2=null;
size === 3 ? (  val1=999,val2=100 )  : 0;
console.log(val1,val2)


请解释一下您所做的更改,以及您的答案对于这个页面的读者有何补充。您的回答是为了读者而写的。 - Rajesh

1

这是一个语法错误。您可以像这样使用单独的调用。

var size=3;
var  val1 = size === 3 ? 999  : 0;
var  val2 = size === 3 ? 100  : 0;
console.log(val1,val2)


0
你可以这样做

var val1 = 0,
  val2 = 0,
  size = 3;
3 === size ? function() {
  val1 = 999;
  val2 = 100
}() : 0;
console.log(val1, val2);


1
这里不需要使用IIFE - Rajesh
虽然它确实可以正常工作(我没想到它会),但这比使用eval更好的习惯,比(val1 = 999, val2 = 100)更冗长,比仅使用if语句更疯狂。 - AJP

0

三元运算符的语法是:

condition ? expr1 : expr2 

var val1=999; var val2=100; 是一个有效的声明var val1=999, var val2=100; 不是),但不是一个表达式。因此,您不能像在代码中所做的那样使用它们。但是,您可以通过使用eval函数将其转换为表达式,如下所示:

size === 3 ? eval('var val1=999; var val2=100;')  : 0;

当然,正如其他人指出的那样。使用eval是错误的方法。我正在展示为了回答你的问题而可以这样做。

请不要使用或推荐使用 eval,除非绝对必要。在这种情况下,它绝对不是必要的。 - AJP
我认为你是在指称在三目运算符表达式中进行赋值,因为在发表评论时没有人指出 eval 是错误的方法。 - AJP

0
使用一个 if 语句。
var val1;
var val2;
if (size === 3) {
     val1 = 999;
     val2 = 100;
}

尽管 D-reaper 的回答回答了您的问题,但实际上您的问题并不是正确的提问方式。(另外,eval 在极少数情况下非常有用,但是在其他情况下被认为是“邪恶的”,因为它会阻止各种 JavaScript 引擎的优化,并打开安全漏洞,例如在存储的用户输入数据上使用时可能会发生 XSS)。

当你使用三元操作符来分配到另一个变量时,它们非常有用,例如:

var val1 = size === 3 ? 999 : 0;

在你的例子中,由于没有赋值操作,第一个表达式并不打算返回一个值,而第二个值为0被忽略,因此是多余的,这是一种非常明显的代码异味,应该提醒你有更好、更简单的方法来实现你想要的功能。

-1

这是我的尝试:对我来说它运行得很好:

createDigit : function( size ) {
                var val1, val2;
                size === 3 ? (  val1=999,  val2=100  )  :  size === 2 ? (  val1=99,  val2=10 )  : 0;
                //generates only 3 digit values
                return Math.floor( Math.random()*(val1-val2+1 )) + val2;
            },

亲爱的朋友,当你研究并发现有助于他人的东西时,你应该仅仅回答自己的问题。此外,在我的理解中,这不是三元运算符的用途。 - Rajesh
@Rajesh 通常情况下是这样的,但在这种情况下,这非常有帮助,因为他回答了一个不同于他所问的问题。 - AJP
@AJP 三元运算符适用于单个值。在其中添加表达式可以让您做更多的事情,但并不理想。在这种情况下,“if..else if..else”梯形结构更合适。此外,Andreas分享的帖子解释了为什么它会失败。因此,我仍将坚持我的评论。 - Rajesh
我完全同意你的技术评价。我希望你也同意他的回答对于确定他实际提出的问题非常有用。我已投票关闭他的问题,因为不清楚这是否是他真正要问的问题。 - AJP
@user2024080 注意,Sikorski的答案stackoverflow.com/a/43931678/539490适用于任何正值的size,而不仅仅是3和2。 - AJP

-1

我明白你想做什么,你可以使用Math.pow()来生成数字,而不是手动检查size。我下面列出了两种方法:createDigit是我的方法,可以使用Math.pow()生成任何给定大小的数字,而createDigitBuggy是你的方法,只能生成大小为2和3的数字,其余将为NaN。

// Improved version
const createDigit = (size) => {
  if (size > 0) {
    const val1 = Math.pow(10, size) - 1
    const val2 = Math.pow(10, size - 1)
    return Math.floor(Math.random() * (val1 - val2 + 1)) + val2
  }
  return 0
}

// Old buggy version
const createDigitBuggy = (size) => {
  var val1, val2
  size === 3 ? (val1 = 999, val2 = 100) : size === 2 ? (val1 = 99, val2 = 10) : 0
  return Math.floor(Math.random() * (val1 - val2 + 1)) + val2
}


console.log(createDigitBuggy(1)) // prints NaN
console.log(createDigitBuggy(2)) // prints number
console.log(createDigitBuggy(3)) // prints number
console.log(createDigitBuggy(4)) // prints NaN


console.log(createDigit(1)) // prints number
console.log(createDigit(2)) // prints number
console.log(createDigit(3)) // prints number
console.log(createDigit(4)) // prints number

抱歉,我只是在打一个评论。这并没有按照问题要求来回答。现在我看到了OP自己的“回答”,我已经投票将其关闭,因为不清楚那是否是他真正想问的。话虽如此,你的回答还可以,但至少我会删除有缺陷的实现。 - AJP
@AJP,这个有漏洞的实现是为了让OP进行比较,我并不建议使用那段代码。 - Sikorski
啊,我错过了“createDigitBuggy is yours”的部分。尽管他们的回答在技术上并不是有缺陷的,因为a)它不是实际问题所问的,因此不能有缺陷;b)如果他们只想要2位和3位的随机数,那么它也不是有缺陷的。(实际上很抱歉,SO现在不让我改变我的投票)。 - AJP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接