【问题标题】:javascript evaluate an assignment if(x=myfunc())javascript 评估赋值 if(x=myfunc())
【发布时间】:2012-03-05 15:26:49
【问题描述】:

我打开了一个我不久前写的 js 文件,虽然它可以工作,但我认为我发现了一个错误。 (JS 不是我的主要语言)

我有这个:

if( myvar = fieldval.match(mypattern))
  {
     //Do Stuff
  }

所以我想我明白了。这是一个正确的说法吗?: 一个 javascript 赋值操作计算出被赋值的值。

我在 w3schools 上测试过

<script type="text/javascript">
var str="The rain in SPAIN stays mainly in the plain"; 
var patt1=/ain/gi;
var test
document.write(test=str.match(patt1));
</script>

它会写“ain,AIN,ain,ain”,我可能希望它写“true”或根本不写,因为 boolean true 不是字符串。我的思路和最终结论是否正确。 (我问一下我对此的想法,因为我没有接受过很多正式的 CS 培训。)

【问题讨论】:

    标签: javascript boolean variable-assignment


    【解决方案1】:

    这是一个正确的说法。测试myvar 的新值:

    if ( myvar = fieldval.match(mypattern) )
    

    String.match 方法找不到匹配项时,它返回null!!null === false,因此不会评估 if-block。当找到任何非空匹配时,条件为真,并且块被评估。

    在这种情况下,if 语句很可能是正确的,并且意图如下:

    if ( (myvar = fieldval.match(mypattern)) !== null )
    

    【讨论】:

    • 谢谢,但就风格而言,我想我会遵循@JP Richardson 的建议并重新编写那段代码,或者至少发表评论。
    • myvar !== '' 的额外检查是多余的。函数 match 返回一个数组,一个数组总是计算为真,即使它是空的或包含一个空字符串。简而言之,空匹配也会导致块被评估。
    【解决方案2】:

    Rob W 是正确的,但是将赋值放在这样的 if 语句中是非常糟糕的做法。将来,任何出现的人(包括你自己)都会对那句话摸不着头脑,以确定这是否是你真正的意思。

    我强烈推荐 Douglas Crockford 的演讲:http://www.youtube.com/watch?v=taaEzHI9xyY 它会让任何人(无论是否是 Js 开发者)都能成为更好的开发者来观看它,因为你会考虑你的编码风格的影响以及未来维护者可能会做出的假设。

    【讨论】:

    • +1 因为这正是发生的事情。我看到自己的代码并想“我在做什么?”
    • 哇,这是一个小时长的视频。我现在在上班,没时间看。也许我稍后会回到它。就风格而言,您(或其他 JS 开发人员,如果您能代表他们的话)是否认为使用这种类型的条件测试是可以接受的,只要它附近有注释解释它的作用吗?
    • 真的很值得花时间,也许有时间看5到10分钟,看看是否值得你再看。我认为只要您发表评论说明条件检查中的=(赋值)就是您的意思,就可以了。
    【解决方案3】:

    match 返回匹配值的数组,而不是布尔值。请改用test

    【讨论】:

    • 在这种情况下,模式是非空的,所以!!str.match(pattern) === !!pattern.test(str)
    • 匹配是否为空并不重要,因为你会得到一个匹配数组。仅包含一个空字符串的数组的计算结果也为真。事实上,一个空数组甚至计算为真。即使这样也有效:if ([]) { alert("Empty array is true.") }
    • 在帖子中有:“我可能期望它写成'true'”。我假设 OP 希望有布尔值,以便以后可能使用 myvar...
    【解决方案4】:

    函数 string.match() 返回一个匹配数组,如果没有找到匹配则返回 null。该代码有效,因为在 if 语句中 null 的计算结果为 false,而数组的计算结果为 true。

    确实,str.match 的结果存储在 myvar 中,然后 myvar 被评估为布尔值。它按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2018-08-17
      • 2019-01-23
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      相关资源
      最近更新 更多