如果(x=myfunc()),则javascript计算赋值

如果(x=myfunc()),则javascript计算赋值,javascript,boolean,variable-assignment,Javascript,Boolean,Variable Assignment,我打开了一个我不久前写的js文件,虽然它工作正常,但我想我发现了一个错误。(JS不是我的主要语言) 我有这个: if( myvar = fieldval.match(mypattern)) { //Do Stuff } 所以我想我明白了。这是正确的说法吗 javascript赋值操作的计算结果为被赋值的值 我在学校考试 <script type="text/javascript"> var str="The rain in SPAIN stays mainly i

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

我有这个:

if( myvar = fieldval.match(mypattern))
  {
     //Do Stuff
  }
所以我想我明白了。这是正确的说法吗 javascript赋值操作的计算结果为被赋值的值

我在学校考试

<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>

var str=“西班牙的降雨主要集中在平原”;
变量patt1=/ain/gi;
var检验
编写(test=str.match(patt1));

它写的是“ain,ain,ain,ain”,我可能希望它写的是“真”,或者根本不写,因为布尔真不是字符串。我的思路和最终结论是否正确。(我问一下我的想法,因为我没有很多正式的CS培训。)

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

if ( myvar = fieldval.match(mypattern) )
当方法找不到匹配项时,它返回
null
<代码>!!null===false,因此不会计算
if块。当找到任何非空匹配项时,该条件为真,并计算该块

在这种情况下,if语句很可能是正确的,并且以下内容是有意的:

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

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

我高度推荐道格拉斯克罗克福德的谈话:它会让任何人(JS DEV或不)更好地观看它,因为你会考虑你的编码风格和未来的维护者可能会承担的影响。

< P>函数字符串。MatHE()返回一个匹配的数组,或者如果没有找到匹配,NULL。代码之所以有效,是因为在if语句中null的计算结果为false,而数组的计算结果为true


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

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

+1,因为这正是发生的事情。我看到自己的代码,想“我在做什么?”哇,这是一个小时长的视频。我现在在工作,没时间看。也许我以后再谈。就风格而言,你(或其他JS开发人员,如果你能为他们说话的话)会不会觉得使用这种类型的条件测试是可以接受的,只要它附近有一条解释它的作用的注释?这确实值得花时间,也许有时间看5到10分钟,看看它是否值得你再看下去。我认为只要你在条件检查中添加一条注释,说明
=
(赋值)就是你的意思,就可以了。在这种情况下,模式是非空的,所以
!!str.match(模式)===!!test(str)
。匹配项是否为空并不重要,因为您会得到一个匹配项数组。仅包含一个空字符串的数组也计算为true。事实上,空数组的计算结果甚至为true。即使这样也行得通:
if([]){alert(“空数组为true”)}
在帖子中有这样一句话:“我本以为它会写‘true’”。我假设OP想要布尔值,以便以后可能使用
myvar
…谢谢,但作为一种风格,我想我会遵循@JP Richardson的建议,重新编写那段代码,或者至少在其中添加注释。
myvar!=''的额外检查是多余的。函数match返回一个数组,数组总是计算为true,即使它是空的或包含一个空字符串。简而言之,空匹配也会导致对块进行求值。