2012-03-05 1 views
2

私はしばらく前に書いたjsファイルを開いたと働いているが、私はエラーを発見したと思った。だから私は、私はそれを得ると思いますjavascriptが(x = myfunc())

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

(JSが私の第一言語ではありません)私はこれを持っていました。これは正しいステートメントですか? 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」を書き込み、文字列。私の考え方と最終的な結論は正しい。 (私は正式なCSトレーニングをたくさん持っていないので、これについて私の考えのラインを尋ねます。)

答えて

2

これは正しい記述です。 myvarの新しい値がテストされます。

if (myvar = fieldval.match(mypattern)) 

String.match方法が一致するものを見つけることができない場合は、nullを返します。 !!null === falseなので、if-blockは評価されません。空でない一致が見つかると、条件は真となり、ブロックが評価されます。この場合

、if文が正しいこと、そして次が意図されていることを可能性が非常に高いです:

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

ありがとうございますが、スタイルの問題として、私は@JP Richardsonのアドバイスに従い、そのコードを再編集したり、少なくともコメントをつけていきます。 – TecBrat

+1

'myvar!== '''の余分なチェックは冗長です。関数の一致は配列を返し、空でも空文字列でも配列は常にtrueと評価されます。つまり、空のマッチでもブロックが評価されます。 – Maarten

1

ロブWが正確である、しかしそれはANに代入を置くために非常に悪い習慣ですif文のように。将来、来る人(あなた自身を含む)は、その声明で彼らの頭を傷つけて、それがあなたが本当に意味するものかどうかを判断します。

Douglas Crockfordさんの講演を強くお勧めします:http://www.youtube.com/watch?v=taaEzHI9xyYあなたのコーディングスタイルの意味と将来のメンテナーが何を想定しているかを考慮するため、誰でも(Js devまたはnot)

+0

+1これはまさにそれが起こったからです。私は自分のコードを見て、 "私は何をしていたのですか?" – TecBrat

+0

うわー、それは1時間のビデオです。私は今仕事中だし、それを見るのに時間がかからない。多分私は後でそれに戻るだろう。スタイルの問題として、あなた(または他のJS開発者があなたのために話すことができれば)は、それが何をしているかを説明する近くにコメントがある限り、そのタイプのコンディショナルテストを使用することが容認されますか? – TecBrat

+0

それは本当に価値がある、それはあなたがそれ以上見て価値があるかどうかを確認するためにいつか5~10分を見るかもしれない。私は条件付きチェックの '= '(代入)があなたが意味したものであるというコメントを書いている限り、それは問題ないと思います。 –

0

string.match()関数は一致する配列を返します。一致するものが見つからない場合はnullを返します。このコードは、配列がtrueと評価されている間に、nullがifステートメントでfalseに評価されるため機能します。

実際、str.matchの結果はmyvarに格納され、myvarはbooleanとして評価されます。それは期待どおりに動作します。

0

matchは、ブール値ではなく、一致する値の配列を返します。代わりにtestを使用してください。

+0

この場合、パターンは空ではないので、 '!! str.match(pattern)=== !! pattern.test(str)'です。 –

+0

マッチの配列を取得するので、マッチが空であるかどうかは関係ありません。厳密に1つの空文字列を含む配列もtrueに評価されます。実際、空の配列は真であると評価さえします。 でも 'if([]){alert("空の配列が本当です。 ")}' – Maarten

+0

投稿では: "どこに私は '真'を書くと期待していたかもしれません。私はOPが後で 'myvar'の使用を可能にするためにブーリアンを持つことを望んでいました... – Teemu

関連する問題