{. . . .0}이 {}로 평가됩니까?


80

방금 {....0}친구의 코드에서 찾았 습니다. 콘솔에서 평가하면 {}(빈 개체)가 반환 됩니다.

왜 그런 겁니까? JavaScript에서 4 개의 점의 의미는 무엇입니까?


11
6 시간 동안 거의 2500 번 조회 했습니까? 당신의 표시 친구가 사용 확산 연산자를 다른 맥락에서.
Jeremy Harris

이것은 "이 표현식이 구문 분석되는 방법"질문에 가깝습니다. JS 콘솔에 이것을 입력하면 네 번째 점이 0과 같은 색으로 다르게 표시된다는 것을 알 수 있습니다.
Salman A


HNQ의 마법 @JeremyHarris
Pac0

답변:


90

4 개의 점은 실제로 의미가 없습니다. ...는 IS 확산 연산자.0약자이다 0.0.

0 (또는 임의의 숫자)을 객체에 퍼 뜨리면 빈 객체가 생성되므로 {}.


9
Spreading 0 (or any number) yields an empty object객체에서 떨어진 다른 위치에 숫자를 퍼 뜨리면 반드시 오류가 발생합니다. 예를 들어 [... 0]은 오류를 발생시킵니다.
Hitesh Kumar

2
@HiteshKumar 배열 내부에 반복 불가능한 객체를 확산하면 실제로 오류가 발생하지만이 질문과는 관련이 없습니다. 나는 언급 된 객체-확산을 언급하고있다. :)
NikxDa

2
NikxDa @HiteshKumar가 중요한 점을 지적했다고 생각합니다. 귀하의 진술이 사실 인 경우에 대해 더 명확하게하는 것이 좋습니다. Spreading 0 (or any number) in object literal yields an empty object더 유용한 정보
Mist

1
@Mist 나는 대답을 업데이트했습니다. 나는 그것이 필요하다고 생각하지 않지만 설명에는 좋을 것입니다. 업데이트 해주셔서 감사합니다!
NikxDa

1
@NikxDa 감사합니다. 문맥에서 잘라내어 다른 곳에 붙여넣고 여전히 모든 정보를 보유하고 있으며 교육적이고 유익한 내용 일 때 그러한 진술이 더 '완전'하다고 생각하고 싶습니다.
Mist

56

객체 리터럴에있는 세 개의 점은 스프레드 속성입니다 . 예 :

  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길을 잃을 것입니다.
Jonas Wilms

'박스형'은 정확히 무엇을 의미합니까? 예를 들어 도트 연산자 (속성)를 사용할 때 숫자를 개체로 사용했습니다. 내가 맞다면 그것은 단지 하나의 경우입니다. '박싱'이 발생하는 다른 경우가 있습니까? 숫자에만 적용 되나요? 성능상의 이유가 있습니까? 나는 이것이 다른 질문에 대한 것이라고 생각하고 더 연구해야합니다. 책이나 뭐 좀 알려 줄래?
Mist

1
감사! 내 번호 키가 작동하지 않는 이유를 알았습니다. Yayy 권투!
Mist

3
숫자에는 고유 한 열거 가능한 속성 이 없습니다 . 그러나 그들은 속성이 있습니다.
Patrick Roberts

6

간단히 말해서 {...}자바 스크립트의 확산 연산자는 한 객체 / 배열을 다른 객체 / 배열로 확장합니다.

따라서 babelifier가 서로 확장하려고 할 때 배열 또는 객체를 확장하려고하는지 식별해야합니다.

의 경우 array요소를 반복합니다.

의 경우 object키를 반복합니다.

이 시나리오에서 babelyfier 는 누락 된 numberObject를 확인하여 키를 추출하려고 시도 하므로 빈 Object를 반환합니다.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"}

배열 측면에서 인덱스를 키로 사용하므로 두 요소 arr1모두 다른 배열에서 동일한 인덱스를 갖기 때문에 '1'의 요소 를 '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} // {}

결론적으로 스프레드 연산자와 함께 사용할 때 키-값 쌍의 형태로 처리 할 수있는 데이터 유형 {...}은 비어 있지 않은 객체를 반환합니다. 그렇지 않으면 빈 객체를 반환합니다.{}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.