これは有効であり"10"
、JavaScriptで文字列を返します(他の例はこちら):
console.log(++[[]][+[]]+[+[]])
どうして?ここで何が起きてるの?
それを分割すると、混乱は次のようになります。
++[[]][+[]]
+
[+[]]
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は、次のように評価されます。
ExprをUnaryExpressionの評価結果とします。
ToNumber(GetValue(expr))を返します。
ToNumber()
言う:
オブジェクト
次の手順を適用します。
primValueをToPrimitive(入力引数、ヒント文字列)とします。
ToString(primValue)を返します。
ToPrimitive()
言う:
オブジェクト
オブジェクトのデフォルト値を返します。オブジェクトのデフォルト値は、オブジェクトの[[DefaultValue]]内部メソッドを呼び出し、オプションのヒントPreferredTypeを渡すことによって取得されます。[[DefaultValue]]内部メソッドの動作は、8.12.8のすべてのネイティブECMAScriptオブジェクトに対してこの仕様で定義されています。
[[DefaultValue]]
言う:
8.12.8 [[DefaultValue]](ヒント)
Oの[[DefaultValue]]内部メソッドがヒント文字列で呼び出されると、次の手順が実行されます。
toStringを、引数「toString」を指定してオブジェクトOの[[Get]]内部メソッドを呼び出した結果とします。
IsCallable(toString)がtrueの場合、
a。strをtoStringの[[Call]]内部メソッドを呼び出した結果とします。この値はOで、引数リストは空です。
b。strがプリミティブ値の場合、strを返します。
.toString
配列のは言います:
15.4.4.2 Array.prototype.toString()
toStringメソッドが呼び出されると、次の手順が実行されます。
この値でToObjectを呼び出した結果を配列とします。
funcを、引数「join」を指定して配列の[[Get]]内部メソッドを呼び出した結果とします。
IsCallable(func)がfalseの場合、funcを標準の組み込みメソッドObject.prototype.toString(15.2.4.2)とします。
配列を提供するfuncの[[Call]]内部メソッドをこの値として呼び出した結果と空の引数リストを返します。
そう+[]
まで来る+""
ので、[].join() === ""
。
繰り返しますが、+
は次のように定義されます。
11.4.6単項+演算子
単項+演算子は、そのオペランドを数値型に変換します。
プロダクションUnaryExpression:+ UnaryExpressionは、次のように評価されます。
ExprをUnaryExpressionの評価結果とします。
ToNumber(GetValue(expr))を返します。
ToNumber
次の""
ように定義されます:
StringNumericLiteral ::: [empty]のMVは0です。
だから+"" === 0
、そしてこうして+[] === 0
。
++[[]][+[]] => 1 // [+[]] = [0], ++0 = 1
[+[]] => [0]
次に、文字列の連結があります
1+[0].toString() = 10
以下は、この質問がまだ閉じられている間に私が投稿したこの質問に答えるブログ投稿からの抜粋です。リンクは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"
ます。なぜこれが起こるのかは、読者の練習問題として残されています...
簡単にしましょう:
++[[]][+[]]+[+[]] = "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"
これは同じと評価されますが、少し小さいです
+!![]+''+(+[])
に評価されます
+(true) + '' + (0)
1 + '' + 0
"10"
だから今あなたはそれを手に入れました、これを試してください:
_=$=+[],++_+''+$
+ []は0 [...]と評価され、それを何かと合計(+操作)すると、配列の内容がコンマで結合された要素で構成される文字列表現に変換されます。
配列のインデックスを取得するようなもの(+操作よりも優先度が高い)は序数であり、興味深いものではありません。
おそらく、式を数字なしで「10」に評価するための最短の方法は次のとおりです。
+!+[] + [+[]]
//「10」
-~[] + [+[]]
//「10」
// ==========説明========== \\
+!+[]
:+[]
0に!0
変換しtrue
ます。に変換します。+true
1に変換します。-~[]
= -(-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]"
そのステップバイステップで、+
値を数値に変換し、空の配列に追加すると+[]
...空で等しいため0
、次のようになります。
だから、そこから、今あなたのコードを調べてください、それは++[[]][+[]]+[+[]]
...
そしてそれらの間にプラスがあります++[[]][+[]]
+[+[]]
したがって、他の配列の内部に変換される空の配列があるため、これら[+[]]
は返さ[0]
れ0
ます...
ように想像する、最初の値である2次元そう...つのアレイの内部の配列[[]][+[]]
に等しくなる[[]][0]
返されました[]
...
そして最後++
にそれを変換して1
...に増やします
想像できるように、1
+"0"
は"10"
...
+ ''または+ []は0を評価します。
++[[]][+[]]+[+[]] = 10
++[''][0] + [0] : First part is gives zeroth element of the array which is empty string
1+0
10
特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。
ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。
ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。
ジョー・バロウロー対ウェイド事件の転覆に対応するNFLは、言葉を言わないことで、腹立たしいが予測可能なPRの結果でした。
(lから)パット・ペレス、ブルックス・ケプカ、パトリック・リードサウジアラビアのLIVゴルフリーグのさらに別の信じられないほどの記者会見で、スポーツのファンはブルックス・ケプカからでたらめな吐き気と質問回避の驚異的なマスタークラスを受けました。パトリックリード、ブライソンデシャンボー、パットペレス、最近のPGAツアーの脱北者。
暗号業界最大の沈没船の1つであるスリーアローズキャピタルは、ついにその悲惨さから解放されています。火曜日に、不良債権ヘッジファンドは、債権者からの返済を要求する訴訟の高まりに応えて、バージンアイランド裁判所によって清算を命じられました彼らが3ACに行ったローン。
Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday
シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。
オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。
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.
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.
1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。