12

このビデオに触発されて、私はさらにテストしました{}+[]

テスト1:

typeof {}+[]  //"object"

さて、そう{}+[]ですobject

テスト2:

var crazy = {}+[];
typeof crazy  //"string"

何?でし{}+[]objectか?なんでstring今なの?

テスト3:

console.log({}+[])

私が得たもの:

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

だからそれはnumber!...いいえ?

では、実際にはどのような種類{}+[]ですか?

更新しました

{}+[]空の文字列であると言う人へ:

{}+[] === ""     //false
({}+[]) === ""   //false
({};+[]) === ""  //SyntaxError
({}+[]).length   //15

JavaScriptはとても理解しにくいです...

4

2 に答える 2

13

のタイプは{}+[]、コンテキストによって異なる場合があります。

  1. typeof {}+[] //"object"
    演算子によると、この場合の優先順位はtypeof {}「オブジェクト」と評価され+[]、空の文字列を追加します(配列は文字列に強制変換されます)。したがって、結果は「オブジェクト」になります。
    チェックすることを考えることができますtypeof ({}+[])(2番目のケース)。

  2. var crazy = {}+[]; typeof crazy //"string"
    この場合、オブジェクトと配列を追加しています。どちらも文字列に強制されるため、typeof「文字列」を返します。

  3. {}+[]
    これは、空のコードブロック、単項プラス、および空の配列として解釈されます。最初の部分は何もしません。配列はその要素のコンマ区切り文字列(空の配列の場合は空の文字列)に変換され、次に数値(空の文字列は0に変換されます)に変換されます0

更新しました

  • {}+[] === "" //false
    #3を参照してください。{}ブロックとして解釈さ0れ、左側に移動します。
    比較してください{}+[] === 0 // true

  • ({}+[]) === "" //false
    #1を参照してください{}。オブジェクトリテラルとして解釈されます。配列とオブジェクトを追加しようとすると、両方ともオブジェクトの場合は文字列に変換され、配列の場合は"[object Object]"空の文字列に変換されます。したがって、あなたは"[object Object]"左側にいます。
    比較してください({}+[]) === "[object Object]" // true

  • ({};+[]) === "" //SyntaxError
    私は、これは自明だと思います:)

  • ({}+[]).length //15
    15は正確にの長さです"[object Object]"。上記を参照してください。

于 2012-04-29T22:22:45.520 に答える
0
var f = {}+[];
console.log(f==="[object Object]")

varにtrue割り当てると、そのメソッドを使用して文字列に変換するため、これはログに記録されます...この場合は「[objectObject]」(15文字の長さ-長さ=15の場合はから){}+[]toString()

于 2012-04-29T22:40:15.527 に答える