source

자바스크립트에서 2 == [2]가 나타나는 이유는 무엇입니까?

factcode 2023. 10. 1. 22:00
반응형

자바스크립트에서 2 == [2]가 나타나는 이유는 무엇입니까?

는 최근에 했습니다.2 == [2]자바스크립트로.밝혀진 바에 의하면, 이 괴상함은 다음과 같은 몇 가지 흥미로운 결과를 가져옵니다.

var a = [0, 1, 2, 3];
a[[2]] === a[2]; // this is true

마찬가지로 다음과 같은 기능이 있습니다.

var a = { "abc" : 1 };
a[["abc"]] === a["abc"]; // this is also true

더 이상하게도, 이것은 또한 효과가 있습니다:

[[[[[[[2]]]]]]] == 2; // this is true too! WTF?

이러한 동작은 모든 브라우저에서 일관된 것으로 보입니다.

이게 왜 언어 기능인지 아세요?

이 "기능"이 초래하는 더 이상한 결과는 다음과 같습니다.

[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!

var a = [0];
a == a // true
a == !a // also true, WTF?

비교 알고리즘은 ECMA-spec(문제에 대한 ECMA-262, 제3판의 관련 섹션: 11.9.3, 9.1, 8.6.2.6)에서 확인할 수 있습니다.

하면 을 JS 로를 평가할 때 일이 2 == [2]는 기본적으로 다음과 같습니다.

2 === Number([2].valueOf().toString())

valueOf()배열의 경우 배열 자체를 반환하며 단일 element 배열의 문자열 표현은 단일 요소의 문자열 표현입니다.

세 예를 로 도 합니다.[[[[[[[2]]]]]]].toString()입니다일 입니다.2.

있기 인 만 합니다. 그래서 저는 일반적으로 엄격한 평등 연산자만 사용합니다.===.

속성 이름은 항상 문자열이므로 첫 번째 예와 두 번째 예를 쉽게 따라할 수 있습니다.

a[[2]]

와 동치입니다.

a[[2].toString()]

어느 쪽이 딱 맞습니까?

a["2"]

배열 마법이 발생하기 전에는 숫자 키도 속성 이름(즉, 문자열)으로 취급됩니다.

은 입니다의 입니다.==교환입니다.

[2] Number와 비교할 때 Number는 2로 변환됩니다.단항을 사용해보세요.+[2]의 연산자.

> +[2]
2
var a = [0, 1, 2, 3];
a[[2]] === a[2]; // this is true

식의 오른쪽에는 값이 2인 숫자 유형을 반환하는 a[2]가 있습니다.왼쪽에서는 먼저 개체가 2인 새 배열을 생성합니다.그러면 우리는 a[어레이가 여기에 있습니다]라고 부릅니다.이것이 문자열인지 숫자인지 2인지 "2"인지 잘 모르겠습니다.우선 스트링 케이스부터 받겠습니다.["2"]을(를) 사용하면 새 변수가 생성되고 null이 반환됩니다.null !== 2. 따라서 실제로 암묵적으로 숫자로 변환된다고 가정합니다.a[2]는 2.2 및 2 일치를 유형(따라서 === 작동) 및 값으로 반환합니다.a [value]에서 문자열이나 숫자를 예상하기 때문에 배열을 숫자로 암시적으로 변환하는 것이라고 생각합니다.숫자가 더 높은 우선순위를 차지하는 것 같습니다.

참고로, 누가 그 우선순위를 결정하는지 궁금합니다.[2]는 첫 번째 항목으로 숫자가 있어서 숫자로 변환이 되는 것입니까?또는 배열을 [array]에 전달할 때 먼저 배열을 숫자로 변환한 다음 문자열로 변환하는 것입니다.누가 알겠는가?

var a = { "abc" : 1 };
a[["abc"]] === a["abc"];

이 예제에서는 abc라는 멤버를 사용하여 a라는 개체를 만들고 있습니다.방정식의 오른쪽은 매우 간단합니다. a.abc와 같습니다.이것은 1을 반환합니다.왼쪽은 먼저 ["abc"]의 리터럴 배열을 만듭니다.그런 다음 새로 만든 배열을 전달하여 개체에서 변수를 검색합니다.이것은 문자열을 예상하므로 배열을 문자열로 변환합니다.이제 a[" abc"]로 평가되며, 이 값은 1과 같습니다. 1과 1은 동일한 유형(그래서 ===가 작동함)이고 동일한 값입니다.

[[[[[[[2]]]]]]] == 2; 

이것은 그저 암묵적인 전환일 뿐입니다.=== 유형이 일치하지 않기 때문에 이 상황에서는 작동하지 않습니다.

은.==케이스, 이것이 더그 크록포드가 항상 사용할 것을 추천하는 이유입니다.=== 암묵적 유형 변환은 하지 않습니다.

과 같습니다.===equality 를 equality 됩니다라고

[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!

흥미롭군요, 사실 [0]이 참이면서 거짓인 것은 아닙니다.

[0] == true // false

if() operator의 재미있는 처리 방법입니다.

한 항목의 배열은 항목 자체로 취급할 수 있습니다.

이것은 오리 타이핑 때문입니다."2" == 2 == [2] 이후.

다른 답변들에 약간의 세부사항을 덧붙이자면...할 때Array에 이르기까지Number가 , 입니다 를 합니다.Array와 함께parseFloat(array): 또는 해 볼 수 . (: Firebug Web Inspector)에서 직접 사용해 볼 수 있습니다.Array값이 로 변환됩니다.

parseFloat([2]); // 2
parseFloat([2, 3]); // 2
parseFloat(['', 2]); // NaN

위해서Arrays,parseFloat합니다에 합니다.Array첫 번째 멤버는 버리고 나머지는 버립니다.

더 긴 수 : Christoph 의와 합니다.parseFloat, 언제든지 사용할 수 있습니다.parseFloat(array)그것이 어떻게 변환될 것인지 확실히 알기 위해 속기로.

당신은 모든 경우에 두 개체를 비교하고 있습니다.==를 사용하지 마십시오. 비교를 생각하고 있다면 ==를 염두에 두고 있는 것이지 ===를 염두에 두고 있는 것은 아닙니다.== 종종 미친 효과를 줄 수 있습니다.언어에서 좋은 부분을 찾아보세요 :)

질문의 EDIT 섹션에 대한 설명:

첫번째 예시

[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!

첫 번째 유형 [0]은 위의 크리스토프의 대답에 따라 원시 값으로 "0"을 갖습니다 ([0].valueOf().toString())

"0" == false

이제 부울(거짓)을 숫자로 캐스팅한 다음 문자열("0")을 숫자로 입력합니다.

Number("0") == Number(false)
or  0 == 0 
so, [0] == false  // true

에 관해서는if문장, if 조건 자체에 명시적인 비교가 없는 경우, 조건은 참값을 평가합니다.

거짓 값은 false, null, undefined, 0, NaN 및 빈 문자열 "6개뿐입니다.그리고 거짓이 아닌 것은 진실한 값입니다.

[0]은 위와 같은 값이 아니므로 참값이므로,ifstatement가 true로 평가되고 statement를 실행합니다.


두번째 예시

var a = [0];
a == a // true
a == !a // also true, WTF?

값을 원시 값으로 다시 입력합니다.

    a = a
or  [0].valueOf().toString() == [0].valueOf().toString()
or  "0" == "0" // true; same type, same value


a == !a
or  [0].valueOf().toString() == [0].valueOf().toString()
or  "0" == !"0"
or  "0" == false
or  Number("0") == Number(false)
or  0 = 0   // true

언급URL : https://stackoverflow.com/questions/1724255/why-does-2-2-in-javascript

반응형