왜 {}>[]?

5346 단어 javascript

TLDR 버전


관계 비교


JavaScript에서 관계식을 비교한 결과는 Abstract Relational Comparison algorithm에 의해 결정됩니다.이 알고리즘은 비교의 양측을 원시 값으로 변환한 다음에 이 두 원시 값 간의 비교 결과를 되돌려준다.

ToPrimitiveñ


추상적 관계 비교 알고리즘 호출ToPrimitive 두 번, 각 조작수는 한 번 호출하고'number'를 두 번째 매개 변수로 전달한다.이것은 ToPrimitive 함수를 알려 줍니다. 만약 조작수가 여러 기원 형식으로 변환될 수 있고,number가 그 중의 하나라면, 값을 다른 형식이 아닌 한 수로 변환해야 합니다.

기본요금²

ToPrimitive 에 전달된 값이 대상이라면, 같은 두 개의 매개 변수value와 typehint 호출 OrdinaryToPrimitive 을 사용합니다.OrdinaryToPrimitive 값을 원어로 변환하기 위해 호출할 방법 목록을 생성합니다.
"string"을 형식 알림으로 가져오면 방법 순서가 toString, 뒷굽valueOf으로 바뀝니다.이 예에서'number'를 전달했기 때문에 방법의 순서는 valueOf 뒷굽toString이다.주의해야 할 것은 이 점에 도달한 모든 값이 대상이지만 모든 값이 대상의 원형에valueOftoString 방법을 사용하는 것은 아니다.
첫 번째 방법이 '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

좋은 웹페이지 즐겨찾기