今日、コンソールにNaN
入力{}+{}
してもChrome 49が出力されないことに気づきました。代わりに、文字列を出力します[object Object][object Object]
。
どうしてこれなの?言語は変わりましたか?
今日、コンソールにNaN
入力{}+{}
してもChrome 49が出力されないことに気づきました。代わりに、文字列を出力します[object Object][object Object]
。
どうしてこれなの?言語は変わりましたか?
回答:
Chrome devtools は、暗黙の括弧のペア(コードを参照)で開始{
および終了するすべてを自動的にラップして、その評価を式として強制します。そのようにして、空のオブジェクトを作成します。これを見るには、履歴()をさかのぼると、前の行がに含まれます。}
{}
↑(…)
どうして?わかりませんが、block-vs-object-literalを知らない初心者の混乱を減らすことができると思います。また、式を評価したいだけの場合にも役立ちます。
バグ499864で説明されているように、実際にはそれが理由です。純粋な便利さ。また、ノードREPLにもそれがあったため(コードを参照)。
{a:1}),({b:2}
、オブジェクトを生成するのではなく、エラーをスローするべきです。
)
場合は、コメント内にある場合に備えて、挿入される前に改行を追加することを検討して{a:3} // :-}
ください。
あなたがこれを確認した後、アップ矢印を打つ場合は、代わりのことに気づくでしょう{} + {}
、それを表示し({} + {})
、中に結果を"[object Object][object Object]"
。
比較すると、Firefoxでは、が{} + {}
まだ表示されますNaN
が、実行する({} + {})
と、も表示されます"[object Object][object Object]"
。
したがって、この操作を検出すると、Chromeは自動的に括弧を追加しているようです。
{} + {}
に「サニタイズ」されていない場合は、が空のブロックとして解析されるため({} + {})
、として扱われます。+ {}
{}
{}
は空のコードブロックであり無視さ+{}
れるため、単項+
で空のオブジェクトであるが残ります初期化子。+
オブジェクトをプリミティブに変換することを含む(toString
この場合、最終的にはになり、結果としてが発生します"[object Object]"
)ために、その引数を数値に強制します。そのため、有効な数値に変換できないため、+"[object Object]"
これが得られます。NaN
"[object Object]"
残念ながら、自分でClippyの引用を追加しました。コンソールはあなたのために何をしたかについての情報を提供しません。
新しいルールは信じられないほどシンプルで、これらの2つの難しい文字を手間で入力する手間を省いo=
たり0,
、オブジェクトリテラルをコンソールに貼り付ける前に保存したりできます。
{
;{wat:1}),({wat:2}
ようやく再びエラーです。
{let i=0;var increment=_=>i++}
最後に、正しく許可されています。これは、クロージャーを行う非常に良い方法です。
ただし、以下は誤ってオブジェクトです。これは、@ Bergiによって言及されたのと同じくらい便利です。JSが間違っていると解釈して、あなたを助けます!仕様によると、これは、何にも割り当てられていないリテラル1を含むラベル付きステートメント「foo」を含むブロックです。
{foo:1}
上記は同じである必要があります
if(1) {
foo: 1
}
以下はブロックのように正しく扱われます...その前にコメントがあるからです!
//magic comment
{foo:1}
だからこれは:
{foo:1}
//also magic
これはオブジェクトです:
{foo:
//not so magic comment
1}
これはエラーです
//not so magic comment
{foo:1}.foo
だからこれは:
{foo:1}.foo
これは問題ありません:
1..wat
undefined
これもそうです:
['foo'][0]
次のものは、式の位置に打ち込まれたオブジェクトとして正しく解釈されます。0,
これは、通常、ステートメントの代わりに式があることを明確に保証する方法です。
0,{foo:1}.foo
なぜ値が括弧で囲まれているのかわかりません。JSにはばかげた設計上の決定がありますが、この1つの状況でより適切に動作させることは実際にはオプションではなく、コンソールはJSを正しく実行する必要があります。本当に何か他のことをすることを意味しました。
コンマ演算子が気に入らない場合は、代入を使用できます
x = {foo:1}.foo
現状のまま
{} + {} + {}
"[object Object][object Object][object Object]"
;{} + {} + {}
"NaN[object Object]"
クレイジーで一貫性のある私は対処できます...クレイジーで一貫性がありませんありがとうございます!
{foo:1}
で{foo:1}//
同じものを作ります。Chrome JS REPLにはありません。REPLはJSを評価するだけではありません。それは文字列を処理し、別のものに決定しています。
var x = eval('{a:1}')
有効なJavaScriptでは、xが1になり、より直感的なオブジェクト{a:1}ではなくなりました。はい、それは奇妙ですが、奇妙なことをするので、言語を変更することはできません。JSON文字列以外はすべてJavaScriptとして解釈され、評価されます。0,
JSONを貼り付ける前に入力することは難しくありませんが、代わりに、文字列がJavaScriptの代わりにオブジェクトとして解釈されたという警告が表示されれば嬉しく思います。
var e = {}; e.toString()
です:)試してみると、私の意味がわかります