( 'b' + 'a' + + 'a' + 'a')。toLowerCase() 'banana'の結果はなぜですか?

Why is the result of ('b'+'a'+ + 'a' + 'a').toLowerCase() 'banana'?


質問 written by BSMP @2019-08-24 23:24:31Z

: 559 : 8 : 69

私の友人の一人がこのJavaScriptコードに出くわしたとき、私はJavaScriptを練習していました。

document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());

上記のコードは"banana"答えます! 誰でもその理由を説明できますか?

コメント 1

2番目のプラスは単項演算子です。 +"a"NaNです。

written by ヘラルド・フルタド @2019-08-12 05:54:37Z

コメント 2

コンソールで、 +'a'を単独で記述し、何が起こるかを確認します。

written by 一部のプログラマーは @2019-08-12 05:54:49Z

コメント 3

そして、もっと熱心な人のために。楽しいリストすべて見る

written by Giddy Naya @2019-08-12 06:13:26Z

コメント 4

強く関連: stackoverflow.com/q/9032856

written by Kyll @2019-08-13 14:21:01Z

回答 1 written by SOFe @2019-09-20 10:44:34Z
558

+'a'NaN ( "Not a Number")に変換されます。これは、文字aを数値として解析できないため、文字列を数値に強制するためです。

document.write(+'a');
小文字にするとbananaになります。

NaN"ba"追加すると、型変換により"NaN"が文字列"NaN"になり、 baNaNが得baNaNます。 そしてa背後にaがあり、 baNaNaを与えbaNaNa

+ +間のスペースは、最初の1つのストリング連結と2番目のストリング連結を単項プラス(つまり「正」)演算子にするためです。 'ba'+(+'a')+'a'を使用しても同じ結果が得られ、 'ba'+NaN+'a'として解決されます。これは、 'ba'+'NaN'+'a'と同等です。ジャグリングを入力します。

document.write('ba'+(+'a')+'a');

回答 2 written by タイラー・ローパー @2019-10-28 17:25:44Z
83
'b' + 'a' + + 'a' + 'a'

...として評価されます...

...is evaluated as....

(参照: 演算子の優先順位

(+'a')は、 単項プラス演算子を使用して'a'を数値に変換しようとします。 'a'は数値ではないため、結果はNaN"Not-A-Number" )です。

(see: operator precedence)

NaNは「Not a Number」の略ですが、それでも数値です。 文字列に追加されると、他の数値と同様に連結されます。

(+'a') attempts to convert 'a' to a number using the unary plus operator. Because 'a' is not a number, the result is NaN ("Not-A-Number"):

最後に、小文字です:

'b'  +  'a'  +  NaN  + 'a'
回答 3 written by マーク・フィッシャー @2019-08-22 11:31:06Z
35
('b' + 'a' + + 'a' + 'a').toLowerCase()

わかりやすくするために、これを2つのステップに分けましょう。 最初に、括弧で囲まれた式の値を取得してから、結果にtoLowerCase()関数を適用します。

第一歩

Step one

LRに進みます:

  • 'b' + 'a'baを返します。これは通常の連結です。
  • ba + + 'a'ba+ 'a'を連結しようとします。 ただし、単項演算子+はそのオペランドを数値に変換しようとするため、値NaNが返され、元のbaと連結されたときに文字列に変換され、その結果baNaNになります。
  • baNaN + 'a'はbaNaNaを返します。 繰り返しますが、これは通常の連結です。

この段階では、ステップ1の結果はbaNaNaです。

ステップ2

ステップ1から返された値に.toLowerCase()を適用すると、 .toLowerCase()になります。

バナナ

JavaScriptには、チェックできる似たような機能が数多くあります。

回答 4 written by 張海風 @2019-08-18 01:38:07Z
24

それは、単に+演算子が原因です。

チャンクからさらに知識を得ることができます。

=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Here + + convert it to +operator 
Which later on try to convert next character to the number.

例えば

For example

次の2つの方法で文字列を数値に変換できます。

  1. 数値(文字列);
  2. + string;

元のクエリに戻ります。 ここでは、次の文字( 'a')を数値に変換しようとしますが、突然エラーNaNが発生しました。

  1. Number(string);
  2. +string;

ただし、前の文字が文字列に含まれていたため、文字列として処理されます。 だからそれは

So back to the original query; Here it tries to convert the next char ('a') to the number but suddenly we got error NaN,

そして最後にそれをtoLowerCase()に変換するので、バナナになります

横に数字を入力すると、結果が変わります。

But it treats as a string because the previous character was in the string. So it will be

「ba1a」になります

And last it converts it to toLowerCase(), So it would be banana

回答 5 written by トラビスJ @2019-08-15 20:18:00Z
9

このコード行は式を評価し、戻り値に基づいてメソッドを呼び出します。

('b' + 'a' + + 'a' + 'a')は、文字列リテラルと加算演算子のみで構成されています。

  • 文字列リテラル 「文字列リテラルは、一重引用符または二重引用符で囲まれたゼロ個以上の文字です。」
  • 加算演算子(+) 「加算演算子は、文字列の連結または数値の加算を実行します。」

実行される暗黙的なアクションは、文字列に対するToNumberの呼び出しです

  • 文字列型に適用されるToNumber「 文字列に適用されるToNumberは、入力文字列に文法を適用します。文法がStringをStringNumericLiteralの展開として解釈できない場合、ToNumberの結果はNaNです。」

インタプリタには、式を左右の式のコンポーネントに分解することにより、式を解析する方法のルールがあります。


ステップ1: 'b' + 'a'

左式: 'b'
左の値: 'b'

演算子:+(式の側面の1つは文字列なので、文字列の連結)

正しい表現: 'a'正しい値: 'a'

結果: 'ba'


ステップ2: 'ba' + + 'a'

左式: 'ba'
左の値: 'ba'

演算子:+(式の側面の1つは文字列なので、文字列の連結)

右式: + 'a' (これは、+記号から正の数であると仮定して文字 'a'の数学値を評価します-負の数を示すマイナス記号もここで機能します-結果としてNaNになります)
正しい値:NaN(演算子は文字列連結であるため、連結中にこの値でtoStringが呼び出されます)

結果: 'baNaN'


ステップ3: 'baNaN' + 'a'

左の式: 'baNaN'
左の値: 'baNaN'

演算子:+(式の側面の1つは文字列なので、文字列の連結)

正しい表現: 'a'
正しい値: 'a'

結果: 'baNaNa'


この後、グループ化式が評価され、toLowerCaseが呼び出され、バナナが残ります。

回答 6 written by @2019-09-11 08:30:10Z
7

+を使用すると、JavaScriptで値が数値に変換されます!

そう...

ここで最初に知って学ぶべき主なことは、JavaScriptの値の前に+を使用することです。その値を数値に変換しますが、その値を変換できない場合、JavaScriptエンジンはNaNを返します。数字に変換しないでください、仲間!)と残りのストーリーは以下のとおりです:

( 'b' + 'a' + + 'a' + 'a')。toLowerCase() 'banana'の結果はなぜですか?

回答 7 written by rprakash @2019-09-06 20:10:43Z
2

ここに画像の説明を入力してください

NaNの詳細については、 W3SchoolsまたはMozilla Developer Networkご覧ください

回答 8 written by ラキブルイスラム @2019-09-01 07:10:59Z
0

こちらの魔法をご覧ください。 2番目のプラスは、「NaN」を与える単項演算子です

console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
console.log(('b' + 'a' + + 'a' + 'a'));
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());