[解決済み] (![]+[])[+[]]... なぜそうなるのか、説明してください。
質問
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
このコードの出力は
fail
. なぜ?
どのように解決するのですか?
Mauricio さんのコメントにもあるように
(![]+[])[+[]]
は "f" ("false" の1文字目) です。
(![]+[])[+!+[]])
は "a"である、など。
どのように動作するのですか?
1文字目の'f'を調べてみましょう。
(![]+[])[+[]]; // 'f'
式の最初の部分(括弧で囲まれた部分)は、以下のように構成されています。
![]+[]
であり、Addition 演算子の最初のオペランドは
![]
であり、これは
false
配列オブジェクトは他の Object インスタンスと同じように
真実である
であり、論理演算子(!)NOT を適用すると
false
を生成します。
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
この後、加算の2番目のオペランドである空のArrayがあります。
[]
を変換するために作られたものです。
false
の値を String に変換しています。空の配列の文字列表現はただの空の文字列なので、これと同じです。
false+[]; // "false"
false+''; // "false"
最後の部分、括弧の後の角括弧のペアはプロパティアクセサであり、空の配列に再び単項演算子を適用した式を受け取ります。
単項演算子が行うのは型変換であり、次のようになります。
Number
などに変換します。
typeof +"20"; // "number"
もう一回、これは空のArrayに適用されます。先ほど言ったように、ArrayのString表現は空の文字列であり、空の文字列をNumberに変換すると0に変換されます。
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
したがって、いくつかのステップで、式を "decode"することができます。
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
String 値にブラケット記法を用いて文字にアクセスすることは、ECMAScript 3rd. Edition 仕様には含まれていないことに注意してください (そのため
charAt
メソッドが存在したのはそのためです)。
しかし、このような文字列の文字を表す "index properties" は ECMAScript 5 で標準化され、標準化以前からかなりの数のブラウザで(IE8(標準モード)でも)この機能が利用可能でした。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】jQueryでチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
-
[解決済み] ジェスト あるクラスの特定のメソッドをモックする方法
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)