なぜ {。。。.0}は{}に評価しますか?


80

{....0}友達のコードで見つけました。コンソールでそれを評価すると、{}(空のオブジェクト)が返されます。

何故ですか?JavaScriptでの4ドットの意味は何ですか?


11
6時間で約2500回視聴しましたか?あなたの見える友人が使用しているスプレッド演算子を異なる文脈で。
ジェレミーハリス

これは、「この式がどのように解析されるか」という質問です。これをJSコンソールに入力すると、4番目のドットの色が異なっていることに気付くでしょう...ゼロと同じ色です。
サルマンA


@JeremyHarris HNQの魔法
Pac0 2018

回答:


90

4つのドットは実際には意味がありません。...スプレッド演算子であり、の.0略です0.0

0(または任意の数)をオブジェクトに拡散すると、空のオブジェクトが生成されます{}。したがって、。


9
Spreading 0 (or any number) yields an empty objectオブジェクト以外の場所に数値を広げると、必ずしもエラーがスローされます。たとえば、[... 0]はエラーをスローします。
Hitesh Kumar 2018

2
@HiteshKumar配列内に反復不可能なオブジェクトを拡散すると、実際にエラーがスローされますが、それはこの質問とは関係ありません。私は言及されたオブジェクトスプレッドについて言及しています。:)
NikxDa 2018

2
NikxDa @ HiteshKumarが重要なポイントになったと思います。あなたのステートメントが当てはまる場合について、より明確にすることをお勧めします。Spreading 0 (or any number) in object literal yields an empty objectより多くの有用な情報が含まれています。..

1
@ミスト答えを更新しました。必要ないと思いますが、説明には良いかもしれません。更新していただきありがとうございます!
NikxDa 2018

1
@NikxDaありがとう。私は、文脈からそれらを切り取り、他の場所に貼り付けることができ、それでもすべての情報を保持し、教育的で有益である場合、そのようなステートメントをより「完全」であると考えるのが好きです。
ミスト

56

オブジェクトリテラル内の3つのドットは、スプレッドプロパティです。例:

  const a = { b: 1, c: 1 };
  const d = { ...a, e: 1 }; // { b: 1, c: 1, e: 1 }

0の最後のドットは数値リテラルで.0あり、と同じ0.0です。したがって、これは:

 { ...(0.0) }

数値オブジェクトのすべてのプロパティをオブジェクトに拡散しますが、数値には(独自の)プロパティがないため、空のオブジェクトが返されます。


あなたは私を考えさせます-私はどんな変数でも広げることができます、そして自分の鍵は新しいオブジェクトに広げられますか?動作しますFunction (function x() {}), (x.k = 'v'), ({...x})// {k: 'v'}が動作しませんNumber (x = 10), (x.k = 'v'), ({...x}) // {}
ミスト

3
@mistは、数値(およびその他のプリミティブ)をオブジェクトとして操作するとオブジェクトに「ボックス化」され、その直後に「ボックス化解除」されるためです。したがって、x.k、迷子になります。
JonasWilms18年

「箱入り」とは正確にはどういう意味ですか?たとえば、ドット演算子(プロパティ)を使用したときは、数値をオブジェクトとして使用しました。私が正しければ、それはたった1つのケースです。「ボクシング」が起こっている他のケースはありますか?数字にのみ適用されますか?パフォーマンスの理由か何かがありますか?これは他の質問のためだと思います、そして私はそれをさらに研究する必要があります。本か何かを教えてくれませんか。
ミスト

1
ありがとう!番号のキーが機能しなかった理由がわかります。Yayyボクシング!
ミスト

3
数値には、独自の列挙可能なプロパティはありません。しかし、それらには特性があります。
パトリック・ロバーツ

6

簡単に言うと{...}、javascriptのspread演算子は、あるオブジェクト/配列を別のオブジェクト/配列で拡張します。

したがって、バベリファイアが相互に拡張しようとする場合、配列またはオブジェクトのどちらを拡張しようとしているかを識別する必要があります。

の場合、array要素を反復処理します。

の場合、objectキーを繰り返し処理します。

このシナリオでは、babelyfierは、欠落してnumberいるオブジェクトをチェックすることにより、のキーを抽出しようとしています。own property callnumberている、空のオブジェクトが返されます。


0

Spread演算子を{...}使用すると、iterableを展開できます。これは、key-valueペアの形式で定義できるデータ型を拡張できることを意味します。面ではObject、我々はの面で、一方、値オブジェクトのプロパティとしてキーと値のペアを呼び出してのarrays我々はそれの値として配列のキーと要素としてインデックスを考えることができます。

let obj = { a: 4, b: 1};
let obj2 = { ...obj, c: 2, d: 4}; // {a: 4, b: 1, c: 2, d: 4}

let arr1 = ['1', '2'];
let obj3 = { ...arr1, ...['3']}; // {0: "3", 1: "2"}

配列に関しては、インデックスをキーとして使用するため、ここでは、の要素「1」arr1を「3」に置き換えます。これは、両方が異なる配列で同じインデックスを持っているためです。

文字列が広すぎると、演算子は空でないオブジェクトを返します。文字列は文字の配列であるため、文字列を配列として扱います。

let obj4 = {...'hi',...'hello'}   // {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
let obj5 = {...'y',...'x'}   // {0: "x" }

ただし、他のプリミティブデータ型では、空のオブジェクトが返されます

数字で

let obj6 = { ...0.0, ...55} // {}

ブール値付き

let obj7 = { ...true, ...false} // {}

結論として、spread演算子で使用するとキーと値のペアの形式で処理できるデータ型{...}は、空でないオブジェクトを返します。それ以外の場合は、空のオブジェクトを返します。{}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.