【问题标题】:Does Javascript have a conditional assignment like Ruby's ||= (Double pipe) [duplicate]Javascript是否有像Ruby的||=(双管道)这样的条件赋值[重复]
【发布时间】:2016-02-01 10:50:53
【问题描述】:

在 Ruby 中,您有一个称为条件赋值 (||=) 的东西。如果变量尚未定义或设置,您可以使用它为变量分配值。这类似于在 Javascript 中这样说:

if (typeof x == undefined) { x = 'value' }

在 Ruby 中,要将 'value 分配给 x(如果尚未分配),您可以使用 x ||= 'value

工作原理示例:

x = 1
x ||= 2
return x    // Will return 1

或者:

x ||= 2
return x    // Will return 2

有没有什么方法可以在没有明显更长的if 语句的情况下在 Javascript 中做到这一点?


已解决:@tede24 提出以下建议

var x = x || newValue

它与 Ruby 的唯一不同之处在于,如果 x 已定义为 0,即 var x = 0,则会将 x 设置为 newValue


【问题讨论】:

  • 你不应该使用名为var的变量。
  • 对不起,我没有,就在我快速输入示例时,我不小心使用了var 而不是x
  • 请不要为问题添加解决方案。如果现有答案不满足您,请编写您自己的答案。如果您对其他人的答案有 cmets,请将其添加为对该答案的评论。
  • 这是一个关于这个主题的非常老的帖子:esdiscuss.org/topic/logical-assignment-operators。稍新:esdiscuss.org/topic/is-much-needed.
  • 顺便说一句,typeof x == undefined 不正确。应该是typeof x == "undefined",用引号括起来undefined

标签: javascript conditional-statements


【解决方案1】:
x = typeof x !== 'undefined' ? x : newValue;

更新:tede24 有更好的答案,我只是想学习 - 如果在没有 var 或尚未声明的情况下使用,如何消除引用错误

【讨论】:

  • 是的,这确实有效,尽管@tede24 的回答更有效。但是,在@tede24 的回答中,如果x 在使用var x = newValue 重新分配之前已分配,而您的将只使用x = newValue。因此,如果使用var 重新分配一个变量是不正确的,那么你在这里的答案是最好的。
  • 好吧,我能说什么:)
  • 不,这个答案更好。这实际上是 Babel 为默认参数生成的代码。
  • @torazaburo 我确实明确要求答案没有 if 声明虽然(仔细阅读我的问题),所以这是不是最佳答案
  • 接受的答案并不等同于你提到的Ruby,因为如果它有任何虚假值,它会重新分配x,包括0、空字符串等。
【解决方案2】:
var x = x || newValue;

这意味着只要 x 有某些东西被评估为假(未定义、空、0),它就会分配第二个值。

【讨论】:

  • x == x ||新值; // Uncaught ReferenceError: x is not defined
  • 不,x 之前并不总是被声明(我编辑了我的问题,我意识到我说的是“设置”而不是“声明”)
  • 抱歉更正了一个错字 = 而不是 ==
  • 确实如此,除非 x 被分配 false0。在 Ruby 中,即使x == falsex == 0 也不会设置newValue。检查这个JSFiddle
  • @torazaburo 问题指出变量可能未定义或未设置。我同意,如果您知道 x 已定义,则不应重新定义它,但如果您不知道(在这种情况下),这就是要走的路。
猜你喜欢
  • 2011-05-28
  • 2018-06-25
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多