++ [[]] [+ []] + [+ []]が文字列「10」を返すのはなぜですか?

1714
SapuSeven 2011-08-26 22:46.

これは有効であり"10"、JavaScriptで文字列を返します(他の例はこちら):

console.log(++[[]][+[]]+[+[]])

どうして?ここで何が起きてるの?

9 answers

2115
pimvdb 2011-08-26 22:56.

それを分割すると、混乱は次のようになります。

++[[]][+[]]
+
[+[]]

JavaScriptでは、それは本当です+[] === 0+何かを数値に変換します。この場合、+""またはになります0(以下の仕様の詳細を参照してください)。

したがって、それを単純化することができます(++優先順位があります+):

++[[]][0]
+
[0]

[[]][0]意味:から最初の要素を取得するので[[]]、それは本当です:

[[]][0]内部配列([])を返します。参照のために言うのは間違っています[[]][0] === []A、間違った表記を避けるために内部配列を呼び出しましょう。

++そのオペランドの前は、「1ずつインクリメントし、インクリメントされた結果を返す」ことを意味します。したがって++[[]][0]Number(A) + 1(または+A + 1)と同等です。

繰り返しますが、混乱をより読みやすいものに単純化することができます。代わり[]に使用しましょうA

(+[] + 1)
+
[0]

+[]番号に配列を強制することができ0、それがある、最初の文字列に強制する必要が""再び。最後に1が追加され、結果はになり1ます。

  • (+[] + 1) === (+"" + 1)
  • (+"" + 1) === (0 + 1)
  • (0 + 1) === 1

それをさらに単純化しましょう:

1
+
[0]

また、これはJavaScriptにも当てはまります。これは[0] == "0"、配列を1つの要素で結合しているためです。結合すると、で区切られた要素が連結され,ます。1つの要素で、このロジックが最初の要素自体になると推測できます。

この場合、+は数値と配列の2つのオペランドを参照してください。現在、2つを同じタイプに強制しようとしています。最初に、配列が文字列"0"に強制変換され、次に、数値が文字列("1")に強制変換されます。数値+文字===列文字列

"1" + "0" === "10" // Yay!

仕様の詳細+[]

これはかなりの迷路ですが+[]、最初に、文字列に変換され+ます。

11.4.6単項+演算子

単項+演算子は、そのオペランドを数値型に変換します。

プロダクションUnaryExpression:+ UnaryExpressionは、次のように評価されます。

  1. ExprをUnaryExpressionの評価結果とします。

  2. ToNumber(GetValue(expr))を返します。

ToNumber() 言う:

オブジェクト

次の手順を適用します。

  1. primValueをToPrimitive(入力引数、ヒント文字列)とします。

  2. ToString(primValue)を返します。

ToPrimitive() 言う:

オブジェクト

オブジェクトのデフォルト値を返します。オブジェクトのデフォルト値は、オブジェクトの[[DefaultValue]]内部メソッドを呼び出し、オプションのヒントPreferredTypeを渡すことによって取得されます。[[DefaultValue]]内部メソッドの動作は、8.12.8のすべてのネイティブECMAScriptオブジェクトに対してこの仕様で定義されています。

[[DefaultValue]] 言う:

8.12.8 [[DefaultValue]](ヒント)

Oの[[DefaultValue]]内部メソッドがヒント文字列で呼び出されると、次の手順が実行されます。

  1. toStringを、引数「toString」を指定してオブジェクトOの[[Get]]内部メソッドを呼び出した結果とします。

  2. IsCallable(toString)がtrueの場合、

a。strをtoStringの[[Call]]内部メソッドを呼び出した結果とします。この値はOで、引数リストは空です。

b。strがプリミティブ値の場合、strを返します。

.toString配列のは言います:

15.4.4.2 Array.prototype.toString()

toStringメソッドが呼び出されると、次の手順が実行されます。

  1. この値でToObjectを呼び出した結果を配列とします。

  2. funcを、引数「join」を指定して配列の[[Get]]内部メソッドを呼び出した結果とします。

  3. IsCallable(func)がfalseの場合、funcを標準の組み込みメソッドObject.prototype.toString(15.2.4.2)とします。

  4. 配列を提供するfuncの[[Call]]内部メソッドをこの値として呼び出した結果と空の引数リストを返します。

そう+[]まで来る+""ので、[].join() === ""

繰り返しますが、+は次のように定義されます。

11.4.6単項+演算子

単項+演算子は、そのオペランドを数値型に変換します。

プロダクションUnaryExpression:+ UnaryExpressionは、次のように評価されます。

  1. ExprをUnaryExpressionの評価結果とします。

  2. ToNumber(GetValue(expr))を返します。

ToNumber次の""ように定義されます:

StringNumericLiteral ::: [empty]のMVは0です。

だから+"" === 0、そしてこうして+[] === 0

125
Shef 2011-08-26 22:58.
++[[]][+[]] => 1 // [+[]] = [0], ++0 = 1
[+[]] => [0]

次に、文字列の連結があります

1+[0].toString() = 10
65
Tim Down 2011-09-15 03:54.

以下は、この質問がまだ閉じられている間に私が投稿したこの質問に答えるブログ投稿からの抜粋です。リンクはECMAScript3仕様(のHTMLコピー)へのリンクであり、今日でも一般的に使用されているWebブラウザーでのJavaScriptのベースラインです。

まず、コメント:この種の表現は、(正気の)実稼働環境では決して表示されず、読者がJavaScriptのダーティエッジをどれだけよく知っているかを練習するためにのみ役立ちます。JavaScript演算子が型間で暗黙的に変換するという一般的な原則は、いくつかの一般的な変換と同様に役立ちますが、この場合の詳細の多くはそうではありません。

++[[]][+[]]+[+[]]は最初はかなり印象的で曖昧に見えるかもしれませんが、実際には比較的簡単に別々の式に分解できます。以下に、わかりやすくするために括弧を追加しました。何も変更されていないことは保証できますが、それを確認したい場合は、グループ化演算子についてお気軽に読んでください。したがって、式は次のように明確に記述できます。

( ++[[]][+[]] ) + ( [+[]] )

これを分解すると、に+[]評価されることを観察することで単純化でき0ます。これが当てはまる理由を理解するには、単項+演算子を確認し、少し曲がりくねった軌跡をたどって、ToPrimitiveが空の配列を空の文字列に変換します。この文字列は最終的にToNumber0によって変換されます。0これで、+[]次の各インスタンスを置き換えることができます。

( ++[[]][0] ) + [0]

すでに簡単です。について++[[]][0]は、プレフィックスインクリメント演算子(++)、それ自体が空の配列である単一の要素を持つ配列を定義する配列リテラル([[]])、および配列リテラルによって定義された配列で呼び出されるプロパティアクセサー([0])の組み合わせです。

だから、私たちは単純化[[]][0]することができ[]ます++[]、そして私たちは持っていますよね?実際、評価++[]はエラーをスローするため、これは当てはまりません。エラーは最初は混乱しているように見える場合があります。ただし、の性質について少し考えると、++これが明確になります。これは、変数(eg ++i)またはオブジェクトプロパティ(eg ++obj.count)をインクリメントするために使用されます。値に評価されるだけでなく、その値をどこかに格納します。の場合、++[]更新するオブジェクトプロパティまたは変数への参照がないため、新しい値(それが何であれ)を配置する場所がありません。仕様的には、これはプレフィックスインクリメント演算子によって呼び出される内部PutValue操作によってカバーされます。

それでは、何をし++[[]][0]ますか?と同様のロジックにより+[]、内部配列はに変換され0、この値はによってインクリメントさ1れて、最終値がになり1ます。0外側の配列のプロパティの値がに更新され1、式全体がに評価され1ます。

これは私たちに

1 + [0]

...これは加算演算子の簡単な使用法です。両方のオペランドが最初にプリミティブに変換され、いずれかのプリミティブ値が文字列の場合は文字列の連結が実行され、それ以外の場合は数値の加算が実行されます。[0]に変換される"0"ため、文字列連結が使用され、が生成され"10"ます。

最後に、オブジェクトをプリミティブ値に変換するときに両方がチェックされて使用されるため、toString()またはのvalueOf()メソッドのいずれかをオーバーライドするArray.prototypeと、式の結果が変更されるため、すぐにはわかりません。たとえば、次の

Array.prototype.toString = function() {
  return "foo";
};
++[[]][+[]]+[+[]]

...を生成し"NaNfoo"ます。なぜこれが起こるのかは、読者の練習問題として残されています...

26
renatoluna 2011-12-31 05:41.

簡単にしましょう:

++[[]][+[]]+[+[]] = "10"

var a = [[]][+[]];
var b = [+[]];

// so a == [] and b == [0]

++a;

// then a == 1 and b is still that array [0]
// when you sum the var a and an array, it will sum b as a string just like that:

1 + "0" = "10"
14
Vlad Shlosberg 2011-12-29 13:13.

これは同じと評価されますが、少し小さいです

+!![]+''+(+[])
  • []-変換される配列であり、加算または減算すると0に変換されるため、+ [] = 0
  • ![]-falseと評価されるため、!! []はtrueと評価されます
  • + !! [] -trueをtrueと評価される数値に変換するため、この場合は1
  • + ''-式に空の文字列を追加して、数値を文字列に変換します
  • + []-0と評価されます

に評価されます

+(true) + '' + (0)
1 + '' + 0
"10"

だから今あなたはそれを手に入れました、これを試してください:

_=$=+[],++_+''+$
7
Eskat0n 2011-08-26 22:58.

+ []は0 [...]と評価され、それを何かと合計(+操作)すると、配列の内容がコンマで結合された要素で構成される文字列表現に変換されます。

配列のインデックスを取得するようなもの(+操作よりも優先度が高い)は序数であり、興味深いものではありません。

4
AsyncMind 2013-06-19 22:19.

おそらく、式を数字なしで「10」に評価するための最短の方法は次のとおりです。

+!+[] + [+[]] //「10」

-~[] + [+[]] //「10」

// ==========説明========== \\

+!+[]+[]0に!0変換しtrueます。に変換します。+true1に変換します。-~[]= -(-1)1です

[+[]]+[]0に変換し[0]ます。は単一の要素0を持つ配列です。

次に、JSは1 + [0]、つまりNumber + Array式を評価します。次に、ECMA仕様が機能します。+演算子toString()/valueOf()は、基本Objectプロトタイプから関数を呼び出すことにより、両方のオペランドを文字列に変換します。式の両方のオペランドが数値のみの場合、加法的関数として機能します。秘訣は、配列が要素を連結された文字列表現に簡単に変換することです。

いくつかの例:

1 + {} //    "1[object Object]"
1 + [] //    "1"
1 + new Date() //    "1Wed Jun 19 2013 12:13:25 GMT+0400 (Caucasus Standard Time)"

2つのObjects追加が次の結果になるという素晴らしい例外がありますNaN

[] + []   //    ""
[1] + [2] //    "12"
{} + {}   //    NaN
{a:1} + {b:2}     //    NaN
[1, {}] + [2, {}] //    "1,[object Object]2,[object Object]"
3
Alireza 2019-01-19 14:32.

そのステップバイステップで、+値を数値に変換し、空の配列に追加すると+[]...空で等しいため0、次のようになります。

だから、そこから、今あなたのコードを調べてください、それは++[[]][+[]]+[+[]]...

そしてそれらの間にプラスがあります++[[]][+[]]+[+[]]

したがって、他の配列の内部に変換される空の配列があるため、これら[+[]]は返さ[0]0ます...

ように想像する、最初の値である2次元そう...つのアレイの内部の配列[[]][+[]]に等しくなる[[]][0]返されました[]...

そして最後++にそれを変換して1...に増やします

想像できるように、1+"0""10"...

1
Praveen Vedanth 2011-12-30 22:10.
  1. 単項プラス指定された文字列は数値に変換されます
  2. 文字列を指定したインクリメント演算子は、1ずつ変換およびインクリメントします
  3. [] == ''。空の文字列
  4. + ''または+ []は0を評価します。

    ++[[]][+[]]+[+[]] = 10 
    ++[''][0] + [0] : First part is gives zeroth element of the array which is empty string 
    1+0 
    10
    

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

ねえNFL、ジョーバロウとカイラーマレーは女性の権利をサポートするために少しの助けを使うことができます

ねえNFL、ジョーバロウとカイラーマレーは女性の権利をサポートするために少しの助けを使うことができます

ジョー・バロウロー対ウェイド事件の転覆に対応するNFLは、言葉を言わないことで、腹立たしいが予測可能なPRの結果でした。

別の日、別のヒンジのないLIV記者会見

別の日、別のヒンジのないLIV記者会見

(lから)パット・ペレス、ブルックス・ケプカ、パトリック・リードサウジアラビアのLIVゴルフリーグのさらに別の信じられないほどの記者会見で、スポーツのファンはブルックス・ケプカからでたらめな吐き気と質問回避の驚異的なマスタークラスを受けました。パトリックリード、ブライソンデシャンボー、パットペレス、最近のPGAツアーの脱北者。

ミズ・マーベルの家族の帰郷は悪役よりも激しく打撃を与える

ミズ・マーベルの家族の帰郷は悪役よりも激しく打撃を与える

レッドダガーとマーベルさんがチームを組んでいます。

6億7500万ドルのビットコインローンのデフォルト後にすべての資産を清算するように命じられたスリーアローズキャピタル

6億7500万ドルのビットコインローンのデフォルト後にすべての資産を清算するように命じられたスリーアローズキャピタル

暗号業界最大の沈没船の1つであるスリーアローズキャピタルは、ついにその悲惨さから解放されています。火曜日に、不良債権ヘッジファンドは、債権者からの返済を要求する訴訟の高まりに応えて、バージンアイランド裁判所によって清算を命じられました彼らが3ACに行ったローン。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Suffragettes Indicam #3: Junho

Suffragettes Indicam #3: Junho

Mais um mês se findando — e metade do ano de 2022 já passou. Sabe o que isso significa? Não, não é hora de verificar se você está cumprindo com suas resoluções de Ano Novo.

Calin (Estudo de Caso UX/UI Design)

Calin (Estudo de Caso UX/UI Design)

Este projeto foi desenvolvido a partir de briefing fictício disponibilizado pelo site Tifólio, uma plataforma para designers. Briefing Matriz CSD Como ponto inicial utilizei como base algumas notícias atuais sobre meios de pagamento digital e com essas informações desenvolvi a Matriz CSD.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language