Tại sao {. . . .0} đánh giá thành {}?


80

Tôi vừa tìm thấy {....0}trong mã của bạn bè. Đánh giá nó trong bảng điều khiển trả về {}(đối tượng trống).

Tại sao vậy? Ý nghĩa của 4 dấu chấm trong JavaScript là gì?


11
Đã xem gần 2500 lần trong 6 giờ? Có vẻ như bạn của bạn đang sử dụng toán tử spread trong một ngữ cảnh khác.
Jeremy Harris

Đây là một câu hỏi "cách biểu thức này được phân tích cú pháp". Nhập điều này vào bảng điều khiển JS và bạn sẽ nhận thấy rằng chấm thứ 4 được tô màu khác ... cùng màu với số không.
Salman A


@JeremyHarris điều kỳ diệu của HNQ
Pac0

Câu trả lời:


90

Bốn dấu chấm thực ra không có ý nghĩa gì. ...toán tử spread , và .0là viết tắt của 0.0.

Do đó, rải 0 (hoặc bất kỳ số nào) vào một đối tượng sẽ tạo ra một đối tượng rỗng {}.


9
Spreading 0 (or any number) yields an empty objectkhông nhất thiết nếu bạn rải một số ở bất kỳ vị trí nào khác ngoài một đối tượng, nó sẽ tạo ra một lỗi, ví dụ [... 0] ném một lỗi.
Hitesh Kumar

2
@HiteshKumar Việc lan truyền các đối tượng không thể lặp lại bên trong một mảng sẽ thực sự gây ra lỗi, nhưng điều đó không liên quan gì đến câu hỏi này. Tôi đang đề cập đến đối tượng-lây lan được đề cập. :)
NikxDa

2
NikxDa Tôi nghĩ rằng @HiteshKumar đã tạo ra một điểm quan trọng. Tốt hơn hết là hãy trình bày rõ ràng hơn về các trường hợp mà tuyên bố của bạn đúng. Spreading 0 (or any number) in object literal yields an empty objectChứa nhiều thông tin hữu ích hơn ..
Mist

1
@Mist Tôi đã cập nhật câu trả lời. Tôi không nghĩ nó cần thiết, nhưng nó có thể tốt để làm rõ. Cảm ơn các cập nhật!
NikxDa

1
@NikxDa cảm ơn. Tôi thích nghĩ về những câu nói như vậy sẽ 'hoàn chỉnh' hơn khi bạn có khả năng cắt chúng khỏi ngữ cảnh, dán vào nơi khác và chúng vẫn chứa tất cả thông tin và mang tính giáo dục & thông tin.
Sương mù

56

Ba dấu chấm trong một đối tượng theo nghĩa đen là một thuộc tính spread , ví dụ:

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

Dấu chấm cuối cùng với số 0 là một chữ số .0giống như 0.0. Do đó điều này:

 { ...(0.0) }

trải tất cả các thuộc tính của đối tượng number vào đối tượng, tuy nhiên vì các số không có bất kỳ thuộc tính nào (riêng) nên bạn sẽ lấy lại một đối tượng trống.


Bạn dẫn tôi đến suy nghĩ - tôi có thể phát tán bất kỳ biến nào, và các khóa riêng sẽ được lan truyền vào đối tượng mới? Nó hoạt động cho Function (function x() {}), (x.k = 'v'), ({...x})// {k: 'v'}nhưng không làm việc choNumber (x = 10), (x.k = 'v'), ({...x}) // {}
Mist

3
@mist vì các số (và các số nguyên thủy khác) được "đóng hộp" thành các đối tượng khi bạn làm việc với chúng dưới dạng đối tượng và được "mở hộp" ngay sau đó. Do đó x.ksẽ bị lạc.
Jonas Wilms

Chính xác thì 'đóng hộp' có nghĩa là gì? Ví dụ: khi tôi sử dụng toán tử dấu chấm (thuộc tính), tôi đã làm việc với số dưới dạng đối tượng. Nếu tôi đúng, đó chỉ là một trường hợp. Có những trường hợp khác khi 'quyền anh' đang xảy ra không? Nó chỉ áp dụng cho các con số? Có một lý do hoàn hảo hay một cái gì đó? Tôi đoán đây là câu hỏi khác, và tôi nên nghiên cứu thêm. Bạn có thể chỉ cho tôi một số cuốn sách hoặc một cái gì đó?
Sương mù

1
Cảm ơn! Tôi hiểu tại sao phím số của tôi không thể hoạt động. Quyền anh Yayy!
Sương mù

3
Số không có bất kỳ thuộc tính liệt kê riêng nào . Nhưng chúng có thuộc tính.
Patrick Roberts

6

Nói một cách đơn giản, {...}toán tử spread trong javascript mở rộng một đối tượng / mảng với một đối tượng / mảng khác.

Vì vậy, khi babelifier cố gắng mở rộng cái này với cái khác, nó phải xác định xem nó đang cố gắng mở rộng một mảng hay một đối tượng.

Trong trường hợp của array, nó lặp qua các phần tử.

Trong trường hợp của object, nó lặp qua các phím.

Trong trường hợp này, trình tổng hợp đang cố gắng trích xuất các khóa numberbằng cách kiểm tra Đối tượng own property callbị thiếu để numbertrả về Đối tượng trống.


0

Toán tử Spread {...}cho phép mở rộng các vòng lặp. Nó có nghĩa là những kiểu dữ liệu có thể được định nghĩa dưới dạng key-valuecặp có thể được mở rộng. Về mặt Objectchúng ta gọi cặp khóa-giá trị là thuộc tính Đối tượng và nó là giá trị trong khi về mặt arrayschúng ta có thể nghĩ chỉ mục là khóa và phần tử trong mảng là giá trị của nó.

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"}

Về mảng, vì nó lấy chỉ mục làm khóa nên ở đây nó thay thế phần tử '1' của arr1bằng '3' vì cả hai đều có cùng chỉ mục trong mảng khác nhau.

Với quá nhiều chuỗi, toán tử spread trả về đối tượng không rỗng. Vì chuỗi là một mảng ký tự nên nó coi chuỗi như một mảng.

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

Nhưng với các kiểu dữ liệu nguyên thủy khác, nó trả về đối tượng rỗng

với số

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

với Boolean

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

Tóm lại, những kiểu dữ liệu có thể được xử lý dưới dạng các cặp khóa-giá trị khi được sử dụng với toán tử spread {...}sẽ trả về đối tượng không trống, nếu không nó trả về đối tượng trống{}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.