36

今日、 を使っていくつかの実験を行っていたときに==、偶然 を発見しました"\n\t\r" == 0。一体どのように、または"\n\t\r"に等しいのですか?0false

私がしたことは次のとおりです。

var txt = "\n";  //new line
txt == 0;        //it gives me true

そして、それは本当に私を悩ませます。だから私はもっとやった:

var txt = "\r";  //"return"
txt == 0;        //true

var txt = "\t";  //"tab"
txt == 0;        //true

まったく意味がありません。それはどうしてですか?そしてもっとクレイジーなのはこれです:

//Checking for variable declared or not

var txt ="\n\t\r";
if(txt!=false){
    console.log("Variable is declared.");
}else{
    console.log("Variable is not declared.");
}

それが私に与えるものはVariable is not declared.

0、またはfalse???とどのように等しいのですか?

4

5 に答える 5

41

この動作は驚くべきものかもしれませんが、仕様を見れば説明できます。

equals演算子との比較が実行されたときに何が起こるかを確認する必要があります。正確なアルゴリズムは、セクション 11.9.3で定義されています。

どのアルゴリズムステップが実行されるかを示す簡単なツールを作成しました: https://felix-kling.de/js-loose-comparison/


string == integer

注目すべきステップは #5 です。

5.Type(x)が String でType(y)が Numberの場合
、比較の結果を返しToNumber(x) == yます。

つまり、文字列"\n"( "\r", "\t") は最初に数値に変換され、次に と比較され0ます。

文字列はどのように数値に変換されますか? これについては、セクション 9.3.1で説明しています。要するに、次のとおりです。

の MV (数学値) はStringNumericLiteral ::: StrWhiteSpaceです0

は次のようにStrWhiteSpace定義されます

StrWhiteSpace :::
    StrWhiteSpaceChar StrWhiteSpace_opt

StrWhiteSpaceChar :::
    WhiteSpace
    LineTerminator

これは、空白文字や行末記号を含む文字列の数値が であることを意味します0
どの文字が空白文字と見なされるかは、セクション 7.3で定義されています。


string == boolean

注目すべきステップは #7 です。

7. Type(y) が Boolean の場合、比較の結果を返しx == ToNumber(y)ます。

ブール値を数値に変換する方法は非常にtrue単純1です。false0

その後、上で説明したように、文字列と数値を比較します。


他の人が述べたように、厳密な比較 ( ===) を使用して、この「問題」を回避できます。実際には、自分が何をしているのかを知っていて、この動作が必要な場合にのみ、通常の比較を使用する必要があります。

于 2012-04-29T23:50:46.997 に答える
12

JavaScript は緩く型付けされた言語であるため、比較の最初の側を他方に型キャストして、それらが互いに一致するようにしようとします。

数値を含まない文字列は、整数と比較すると 0 になり、ブール値と比較すると (特定の状況を除いて) true になります。

軽い読み物。

于 2012-04-29T21:38:29.177 に答える
4

txtは ではないBooleanので、 になることはありませんfalse。でもありえますundefined

var txt ="\n\t\r";
if(txt !== undefined) { //or just: if (txt)
    console.log("Variable is declared.");
} else {
    console.log("Variable is not declared.");
}
//=> will log: 'Variable is declared.'

ところで、宣言された変数はundefined(eg var txt;) の場合があります。

より厳密な比較を行うと (型強制なしで を使用===)、次のことがわかります。

var txt = '\n'; txt === 0; //=> false
var txt = '\r'; txt === 0; //=> false
var txt = '\t'; txt === 0; //=> false

こちらもご覧ください

于 2012-04-29T21:40:15.220 に答える
1

を使用し== operatorて文字列を数値と比較しようとすると、最初に文字列が数値に変換されます。したがって: alert("\n\r"==0) becomes: alert(Number("\n\r")==0) Number 構造は興味深いものです。最初に空白を取り除き、次に数値が数値ではないかどうかを判断します。の場合NaN、結果は " NaN" です。文字列が空の場合、結果は 0 です。

alert(Number()) alerts 0
alert(Number("")) alerts 0
alert(Number(" \n \r \n \t")) alerts 0
alert(Number("blah")) alerts NaN
alert(Number("0xFF")) alerts 255
alert(Number("1E6")) alerts 1000000

結果が NaN かどうかを確認するには、isNaN() を使用します。

Thus: alert(isNaN("blah")) alerts true
Thus: alert(isNaN("")) alerts false
Thus: alert(isNaN("\n")) alerts false
Thus: alert(isNaN(" ")) alerts false

ただし、NaN が NaN と等しくなることはないことに注意してください。

var nan=Number("geh");alert(nan==nan);  alerts false 

アップデート:

両側が NaN かどうかを確認する場合は、最初に次のように両方をブール値に変換します。

var nan=Number("geh");alert(!!nan==!!nan); alerts true

またはさらに良い

var nan=Number("geh");
alert(isNaN(nan)&& isNaN(nan));
于 2012-04-30T00:51:36.587 に答える
1

その理由は、"\n\t\r"as" "が空の文字列として扱われるためです。使えば==返ってくるtrueが、使えば===返ってくるfalse

存在をテストしたい場合は、次のようなものを使用する必要があります

if(typeof strName !== 'undefined') {
    /*do something with strName*/
} else {
    /*do something without it*/
}
于 2012-04-29T21:41:52.823 に答える