왜 {}>[]?
5346 단어 javascript
TLDR 버전
관계 비교
JavaScript에서 관계식을 비교한 결과는 Abstract Relational Comparison algorithm에 의해 결정됩니다.이 알고리즘은 비교의 양측을 원시 값으로 변환한 다음에 이 두 원시 값 간의 비교 결과를 되돌려준다.
ToPrimitiveñ
추상적 관계 비교 알고리즘 호출
ToPrimitive
두 번, 각 조작수는 한 번 호출하고'number'를 두 번째 매개 변수로 전달한다.이것은 ToPrimitive
함수를 알려 줍니다. 만약 조작수가 여러 기원 형식으로 변환될 수 있고,number가 그 중의 하나라면, 값을 다른 형식이 아닌 한 수로 변환해야 합니다.기본요금²
ToPrimitive
에 전달된 값이 대상이라면, 같은 두 개의 매개 변수value와 typehint 호출 OrdinaryToPrimitive
을 사용합니다.OrdinaryToPrimitive
값을 원어로 변환하기 위해 호출할 방법 목록을 생성합니다."string"을 형식 알림으로 가져오면 방법 순서가
toString
, 뒷굽valueOf
으로 바뀝니다.이 예에서'number'를 전달했기 때문에 방법의 순서는 valueOf
뒷굽toString
이다.주의해야 할 것은 이 점에 도달한 모든 값이 대상이지만 모든 값이 대상의 원형에valueOf
와 toString
방법을 사용하는 것은 아니다.첫 번째 방법이 'Object' 형식의 값을 만들면 두 번째 방법의 결과를 되돌려줍니다.첫 번째 방법이 'Object' 형식의 값을 되돌려주지 않으면, 첫 번째 방법의 결과를 되돌려줍니다.
일반 주원 ({})
{}의 경우 유일하게 볼 원형은 Object입니다. 따라서 우선
valueOf
⑥ 호출 Object.prototype.value()
대상을 사용하려고 시도했지만 {} 로 되돌아갑니다.typeof{}=="object"때문에 다음 방법으로 이동합니다.그리고 호출Object.prototype.toString()
⁴; 대상 값
Object.prototype.toString()
을 호출하면 내장 표시가'object'로 설정됩니다.Object.prototype.toString()
의 반환값은 "[object", tag,"]의 직렬입니다.그러면 빈 대상을 전송하는 반환 값은 "[object]"입니다.OrdinaryToPrimitive([])의
[]의 경우 두 개의 원형인 수조와 대상을 고려해야 한다.만약 수조 원형에 방법이 존재한다면, 이 방법은 호출될 것이다.그러나 수조 원형에 이 방법이 존재하지 않으면 대상 원형에서 이 방법을 찾을 것이다.수조 원형은
valueOf
방법을 포함하지 않기 때문에 먼저 호출을 시도합니다 Object.prototype.valueOf()
.typeof[]="object"로 돌아가면 다음 방법으로 넘어갑니다.진열 원형은 확실히
toString()
방법이 있기 때문에 Array.prototype.toString()
⁵.Array.prototype.toString()
수조에 join
방법의 값을 되돌려줍니다.그룹에 요소가 없기 때문에, 빈 그룹의 반환값 Array.prototype.toString()
은 빈 문자열입니다.비교
이제 쌍방이 모두 각자의 원시치로 바뀌었으니 서로 비교할 때가 되었다.
"[object Object]" > ""
모든 길이의 문자열 값은 빈 문자열 값보다 큽니다.따라가다
한 조작수의 유형이 String/Number/Symbol/BigInt이고 다른 조작수의 유형이 object일 때 자바스크립트가 추상적인 등식을 계산하는 방법은 이 대상에 대해 같은
ToPrimitive
를 호출한 다음에 등식을 검사하는 것이다⁶. 따라서, 우리는 추상적인 상등성 검사를 실시하여 {}이 실제
"[object Object]"
로 변환되었는지, [] 가 빈 문자열로 변환되었는지 확인할 수 있다.console.log({} == "[object Object]") // true
console.log([] == "") // true
왜 브라우저에 {}>[] 오류가 발생했습니까?
Martijn Imhoff에 큰 소리로 이 문제를 외쳤다.
JavaScript 사양명세에 따라 블록 문은 표현식 앞에 값을 구하므로 해석기가 표현식 컨텍스트에서 대괄호를 보지 않을 때 객체 문자가 아닌 블록으로 해석됩니다.이것이 바로 브라우저에서 이 표현식을 실행할 때 오류가 발생하는 이유입니다.강제 해석기가 {}을 블록이 아닌 대상 문자로 보는 방법은 괄호에 묶는 것입니다.
브라우저 콘솔이 아닌 노드 콘솔을 열려면 다음이 표시됩니다.
Node가 입력을 문장으로 구하기 전에 표현식으로 구하기를 변경했기 때문이다.이런 변화는 반점here을 볼 수 있다.
TLDR 버전
{}
에서 "[object Object]"
로 변환[]
에서 ""
로 변환"[object Object]" > ""
참조 자료:¹ ToPrimitive specification
² OrdinaryToPrimitive specification
³ Object.prototype.valueOf() specification
⁴ Object.prototype.toString() specification
⁵ Array.prototype.toString() specification
⁶ Abstract Equality Comparison algorithm
Reference
이 문제에 관하여(왜 {}>[]?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/amyshackles/why-is-2hkk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)