友人の1人がこのJavaScriptコードに出会ったとき、私はいくつかのJavaScriptを練習していました。
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
上記のコードは答えます"banana"
!なぜ誰かが説明できますか?
+'a'
自分で書いて何が起こるか見てみましょう。
友人の1人がこのJavaScriptコードに出会ったとき、私はいくつかのJavaScriptを練習していました。
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
上記のコードは答えます"banana"
!なぜ誰かが説明できますか?
+'a'
自分で書いて何が起こるか見てみましょう。
回答:
+'a'
NaN
( "Not a Number")に解決されます。これは、文字列を数値に強制変換する一方で、文字a
を数値として解析できないためです。
document.write(+'a');
banana
ます。
型変換による文字列への追加NaN
を追加する"ba"
と、が得られます。そして、後ろにあります。NaN
"NaN"
baNaN
a
baNaNa
間のスペース+ +
は、最初の1つの文字列連結と2番目の文字列を単項プラス(つまり、「正」)演算子にするためのものです。を使用しても同じ結果が得'ba'+(+'a')+'a'
られ'ba'+NaN+'a'
、として解決されます。これは'ba'+'NaN'+'a'
、型のジャグリングによるものと同等です。
document.write('ba'+(+'a')+'a');
'b' + 'a' + + 'a' + 'a'
...として評価されます...
('b') + ('a') + (+'a') + ('a')
(参照:演算子の優先順位)
(+'a')
単項プラス演算子'a'
を使用して数値に変換しようとします。は数値ではないため、結果は ("Not-A-Number")になります。'a'
NaN
'b' + 'a' + NaN + 'a'
がNaN
「非数」の略で、それはまだ数値だタイプ。文字列に追加すると、他の数値と同じように連結されます。
'b' + 'a' + NaN + 'a' => 'baNaNa'
最後に、小文字です:
'baNaNa'.toLowerCase() => 'banana'
('b' + 'a' + + 'a' + 'a').toLowerCase()
明確にするために、これを2つのステップに分けてみましょう。まず、括弧で囲まれた式の値を取得toLowerCase()
し、その結果に関数を適用します。
'b' + 'a' + + 'a' + 'a'
LRに行くと、次のようになります。
'b' + 'a'
baを返します。これは通常の連結です。ba + + 'a'
baとを連結しようとし+ 'a'
ます。ただし、単項演算子+
はオペランドを数値に変換しようとするため、値NaNが返され、元のbaと連結すると文字列に変換され、結果としてbaNaNになります。baNaN
+ 'a'はbaNaNaを返します。繰り返しますが、これは通常の連結です。
この段階では、ステップ1の結果はbaNaNaです。
.toLowerCase()
ステップ1から返された値に適用すると、次のようになります。
バナナ
JavaScriptには、チェックアウトできる同様の駄洒落がたくさんあります。
それだけのためのです +演算子。
チャンクからさらに知識を得ることができます。
=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Here + + convert it to +operator
Which later on try to convert next character to the number.
例えば
const string = '10';
次の2つの方法で文字列を数値に変換できます。
元のクエリに戻ります。ここでは次の文字( 'a')を数値に変換しようとしていますが、突然エラーNaNが発生しました。
( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))
ただし、前の文字が文字列内にあったため、文字列として扱われます。だからそれは
( ('b') + ('a') + 'NaN' + ('a'))
そして最後にそれをtoLowerCase()に変換するので、バナナになります
隣に数字を入れると結果が変わります。
( 'b' + 'a' + + '1' + 'a' )
「ba1a」になります
const example1 = ('b' + 'a' + + 'a' + 'a').toLowerCase(); // 'banana'
const example2 = ('b' + 'a' + + '1' + 'a').toLowerCase(); // 'ba1a'
console.log(example1);
console.log(example2);
このコード行は、式を評価してから、戻り値に基づいてメソッドを呼び出します。
式('b' + 'a' + + 'a' + 'a')
は、文字列リテラルと加算演算子のみで構成されています。
実行される暗黙のアクションは、文字列に対するToNumberの呼び出しです。
インタープリターには、式を左手式と右手式のコンポーネントに分解することにより、式を解析する方法のルールがあります。
ステップ1: 'b' + 'a'
左の式:'b'
左の値: 'b'
演算子:+(式の片側が文字列なので、文字列を連結します)
正しい表現:'a'
正しい値: 'a'
結果: 'ba'
ステップ2: 'ba' + + 'a'
左の式:'ba'
左の値: 'ba'
演算子:+(式の片側が文字列なので、文字列を連結します)
右の式:(+ 'a'
これは+記号からの正の数であると仮定して、文字 'a'の数学値を評価します-負の記号もここで機能し、負の数を示します-これはNaNになります)
右の値: NaN(演算子は文字列連結であるため、連結中にこの値に対してtoStringが呼び出されます)
結果: 'baNaN'
ステップ3: 'baNaN' + 'a'
左の式:'baNaN'
左の値: 'baNaN'
演算子:+(式の片側が文字列なので、文字列を連結します)
正しい表現:'a'
正しい値: 'a'
結果: 'baNaNa'
この後、グループ化式が評価され、toLowerCaseが呼び出されてバナナが残ります。
W3SchoolsまたはMozilla Developer Networkで NaNの詳細を読んでください
+"a"
isNaN
。