JavaScript 개발자 인 Douglas Crockford는 한 번 JavaScript 및
를 탐구하고, 그들이 어떻게 작동하는지 설명하고 더 잘 이해하는 데 도움이됩니다. ==
키 포인트 !=
==
!=
JavaScript의 연산자는 본질적으로 악한 것이 아닙니다. 시제없이 직접 유형 및 값 비교에
및==
실제 예를 탐구하십시오. 예제를 살펴보면 문자열을 숫자 나 객체를 숫자 또는 객체를 원래 값과 비교하여 이해를 통합하는 등 다양한 시나리오에서 및 가 실행되는지 확인하십시오. !=
===
!==
==
문제가 발생하고 !=
연산자 ==
returns !=
및 ==
!=
로 계산됩니다. 패스 관계 (A가 B와 같고 B와 같으면 C와 같다)가 적용되어야한다고 가정 할 때 추가적인 혼란이 발생합니다.<code class="language-javascript">"this_is_true" == false // false "this_is_true" == true // false</code>
가 트랜스 혜택이 부족하다는 것을 보여줍니다. 빈 문자열이 숫자 0과 같고 숫자 0이 문자 0으로 구성된 문자열과 같으면 빈 문자열은 0으로 구성된 문자열과 같아야합니다. 그러나 그것은 사실이 아닙니다. 피연산자를 또는 를 통해 비교할 때 호환되지 않는 유형이 발생하면 JavaScript는 한 유형을 다른 유형으로 시전하여 비교할 수 있습니다. 반대로, ==
를 사용할 때는 유형 캐스트를 수행하지 않습니다 (이는 성능이 약간 향상됩니다). 다른 유형으로 인해 ==
를 반환합니다. JavaScript를 제어하는 규칙을 이해하는 규칙을 이해하는 규칙을 이해하는 규칙을 이해하는 규칙을 이해하는 규칙은 JavaScript가 다른 유형으로 오페라를 캐스트하는 방법을 제어하여 두 개의 피연산자 유형을 적용하기 전에 두 개의 피연산자 유형이 호환되도록합니다. 및 를 사용하는 것이 더 나은시기를 결정하고 자신감을 갖습니다. 이 연산자 사용. 다음 섹션에서는 !=
및 연산자와 함께 사용 된 캐스트 규칙을 살펴 보겠습니다. ===
!==
===
및 false
는 어떻게 작동합니까? ==
및 !=
가 어떻게 작동하는지 배우는 가장 좋은 방법은 ecmascript 언어 사양을 연구하는 것입니다. 이 섹션은 ECMAScript 262에 중점을 둡니다. 사양의 11.9 절은 평등 연산자를 소개합니다. 연산자는 구문 생산 == 및 에 나타납니다. (1 세대와 달리, 2 세대는 !=
연산자를 피합니다.) 아래에 표시된 세대를 확인해 봅시다. ==
!=
이 세대에 따르면, 동등한 표현은 관계 적 표현, 또는 관계 적 표현과 동일한 동일한 표현 또는 관계 적 표현과 동일하지 않은 동일한 표현입니다. (이 기사와 관련이없는
==
!=
를 계산 한 결과로 둡니다.
==
를 로하자. !=
==
!=
를 계산 한 결과로 둡니다. EqualityExpression
EqualityExpressionNoIn
in
를 로하자. EqualityExpression
<code class="language-javascript">'' == 0 // true 0 == '0' // true '' == '0' // false</code>
섹션 11.9.2는 인 경우 입력 매개 변수에 해당하는 기본값이 반환됩니다. 오브젝트의
다음 단계는 JavaScript가 추상 평등 비교 알고리즘을 사용하여
는 1 단계를 실행합니다. 연산자는 대신 를 사용하는 것이 좋습니다. 엄격한 비교를 제공하기 때문에 유형 캐스트를 수행하지 않고 값 및 유형에 대한 검사를 수행하지 않습니다. 이것은 다른 유형의 값을 비교할 때 예상치 못한 결과를 피하는 데 도움이 될 수 있습니다. 예를 들어, 와
JavaScript에서
==
의 작동 방식에 대한 유사한 정보를 제공합니다.
!=
===
는 다음과 같이 계산됩니다
는 값이므로 또는 를 초래합니다. 이 비교는 다음과 같이 수행됩니다lref
를 계산 한 결과로 둡니다. EqualityExpression
lval
GetValue(lref)
rref
RelationalExpression
를 로하자. GetValue(rref)
r
rval != lval
r
는 및 연산자의 왼쪽과 오른쪽에있는 참조입니다. 각 참조는 true
내부 함수로 전달되어 해당 값을 반환합니다. 및 false
작업의 핵심은 11.9.3 절에 주어진 추상 평등 비교 알고리즘에 의해 지정됩니다.
true
Type(y)
if 가 인 경우 를 반환하십시오.
Type(x)
Undefined
if 가 이면 입니다
true
if 가 인 경우 를 반환하십시오. Type(x)
Null
및 true
가 동일한 숫자 값이면 를 반환하십시오. Type(x)
가 -0 인 경우 Number.
가 인 경우 를 반환하십시오. x
가 0이면 NaN
가 반환됩니다. false
y
NaN
false
가 인 경우, 및 x
y
가 라면 와 가 둘 다 true이면 라면 라면 반환하십시오. 그렇지 않으면 x
if 및 y
if 동일한 개체를 참조하십시오. 그렇지 않으면 true
를 반환하십시오. x
y
가 이고 true
가 인 경우 를 반환하십시오. false
Type(x)
String
가 이고 x
가 y
인 경우 비교 결과가 반환됩니다. true
false
가 이고 Type(x)
Boolean
가 인 경우 비교 결과 가 반환됩니다. x
y
가 인 경우 비교 결과 가 반환됩니다. true
false
가 true이고 false
가 인 경우, 비교 결과가 반환됩니다. x
이고 이고 y가 true이면 비교 결과가 반환됩니다. false
x
가 null
와 같고 y
가 와 같음을 보여줍니다.또한 아무것도 NaN
(비자), 두 개의 동일한 값이 같고, 0은 -0에 같고, 길이가 같은 길이를 가진 두 개의 문자열이 동일하고, true
equals true
, 는 false
와 같고 동일한 객체에 대한 두 참조는 동일합니다. 2 단계와 3 단계는 false
가 를 반환하는 이유를 보여줍니다. JavaScript는 이러한 값이 동일하다고 간주합니다. 4 단계부터 시작하여 알고리즘이 흥미로워집니다. 이 단계는 null != undefined
와 false이고 두 번째 피연산자가 Number
인 경우, 두 번째 피연산자는 의 내부 함수를 통해 String
로 변환됩니다. 표현 ToNumber()
유형으로 변환하고 재귀 적으로 변환합니다. 다른 피연산자가 부울 인 경우 다음 에이 알고리즘이 실행될 때 Number
로 변환됩니다. 성능의 관점에서 볼 때 두 가지 오페라가 부울 유형인지 두 가지 재귀 단계를 피할 수 있습니다. 9 단계는 피연산자의 유형이 x == ToNumber(y)
인 경우 피연산자가 String
내부 함수를 통해 원래 값으로 변환되고 알고리즘이 재귀 적으로 변환됨을 보여줍니다. 마지막으로, 알고리즘은 두 피연산자가 동일하지 않다고 생각하고 10 단계에서 Number
를 반환합니다. 상세하지만 추상 평등 비교 알고리즘은 이해하기 쉽습니다. 그러나 알고리즘을 완전히 이해하기 위해 내부 작업을 노출 해야하는 내부 함수 Number
및 Number
쌍을 참조합니다. 함수는 매개 변수를 Object
로 변환하고 섹션 9.3에 설명되어 있습니다. 다음 목록은 가능한 비 언어 매개 변수와 동등한 반환 값을 요약합니다.
NaN
Null
인 경우 0을 반환하십시오. true
인 경우 섹션 9.3.1“문자열 유형의 톤”이 적용됩니다. 구문으로 표시된 문자열 매개 변수에 해당하는 값을 반환합니다. 매개 변수가 표시된 구문과 일치하지 않으면 false를 반환하십시오. 예를 들어, "xyz"매개 변수는 를 유발합니다. 또한 매개 변수 "29"는 29의 수익을 초래합니다. Number
String
return . NaN
NaN
Object
함수는 입력 매개 변수와 옵션 매개 변수를 허용합니다. 입력 매개 변수는 비 객체 유형으로 변환됩니다. 객체를 여러 원시 유형으로 변환 할 수있는 경우
primValue
프롬프트를 사용하여 선호하는 유형을 바이어스하십시오. 변환은 다음과 같이 수행됩니다
ToPrimitive(输入参数, 提示Number)
ToNumber(primValue)
인 경우 입력 매개 변수 ()가 반환됩니다 - 변환 없음. ToPrimitive()
내부 메소드를 호출하고 옵션 PreferredType
프롬프트를 전달하여 객체의 기본값을 검색하십시오. ToPrimitive()
의 동작은 모든 기본 ECMAScript 객체에 대해 8.12.8 절에 정의됩니다. PreferredType
및
Undefined
Undefined
사악한 쌍둥이를 이해하십시오 Null
와 Null
가 어떻게 작동하는지 이해 했으므로 이러한 운영자와 관련된 다양한 표현을 탐색 하여이 지식을 활용하겠습니다. 우리는 이러한 표현을 평가하는 방법을 살펴보고 왜 그들이 Boolean
typeof "this_is_true"
는 "부울"을 반환합니다. typeof false
typeof true
가 있으므로 7 단계는 적용됩니다. 표현식은 Boolean
는 1을 반환하며, 이는 각각 "this_is_true" == ToNumber(false)
및 로 표현식을 단순화합니다. 현재 알고리즘은 재귀 적으로. "this_is_true" == ToNumber(true)
ToNumber(false)
및 로 변환됩니다. ToNumber(true)
returns 는 각각 "this_is_true" == 0
및 "this_is_true" == 1
로 표현식을 단순화합니다. 현재 알고리즘은 재귀 적으로. String
이기 때문에 1 단계로 이동하십시오. 적용 할 수없는 단계 1.A 및 1.B를 건너 뜁니다. 그러나 1.c. i는 왼쪽 피연산자가 Number
이기 때문에 적용됩니다. 알고리즘은 각각의 원래 표현식의 값으로 ToNumber("this_is_true") == 0
(ToNumber("this_is_true") == 1
자체를 포함하여 다른 것과 같지 않습니다)를 반환하고 재귀를 완전히 종료하기 위해 스택을 역 추적합니다. ToNumber("this_is_true")
: NaN
를 반환합니다.
NaN == 0
다음 단계는 JavaScript가 추상 평등 비교 알고리즘을 사용하여 표현의 값으로 NaN == 1
를 얻는 방법을 보여줍니다.
Object
이기 때문에 9 단계는 적용됩니다. 표현식은 Number
로 변환됩니다. ToPrimitive(lifeAnswer) == 42
ToPrimitive()
는 메소드를 호출하여 "42"를 반환합니다. 표현식은 lifeAnswer
로 변환되고 알고리즘은 재귀입니다. [[DefaultValue]]
[[DefaultValue]]
이고 오른쪽 피연산자의 유형은 toString()
이기 때문에 5 단계는 적용됩니다. 표현식은 "42" == 42
로 변환됩니다. String
는 반복적으로 반환되고 확장됩니다. Number
ToNumber("42") == 42
ToNumber("42")
42 == 42
는 5 단계를 실행하여 를 생성하고 로 변환되고 알고리즘은 재귀 적으로 변환됩니다. (사양의 섹션 9.3.1은 true
Stringnumericliteral ::: [empty]의 mv [수학적 값] [수학적 값]이 0입니다. 다시 말하면, 빈 문자열의 값은 0입니다.) true
의 값으로 false
: 를 얻는 방법을 보여줍니다.
<code class="language-javascript">"this_is_true" == false // false
"this_is_true" == true // false</code>
로 변환되고 알고리즘은 재귀 적으로 변환됩니다. true
'' == 0
를 반환합니다.
ToNumber('') == 0
0 == 0
<code class="language-javascript">"this_is_true" == false // false
"this_is_true" == true // false</code>
typeof
값을 반환합니다. String
를 만난 적이없는 JavaScript 초보자는 그러한 코드가 더 명확해질 것입니다. 마찬가지로 다음 코드 스 니펫에는 유형 주조가 필요하지 않습니다 (두 피연산자의 유형은 )이므로 는 String
: 만큼 효율적입니다.
String
==
와 ===
가 주조가 필요하지 않은 비교에 적합하다는 것을 보여줍니다. 피연산자 유형이 다르면 ===
및 Number
가 예상치 못한 값보다는 !=
를 반환하기 때문에 가장 좋은 선택입니다 (예 : !==
returns <code class="language-javascript">'' == 0 // true
0 == '0' // true
'' == '0' // false</code>
및 를 사용하지 않을 이유가 없습니다. 어쩌면 악한 쌍둥이를 두려워하는 것을 멈출 때가되었을 것입니다. 일단 당신이 그들을 이해하면, 그들은 덜 악합니다. ==
JavaScript 평등 및 비교 연산자 (FAQS)를위한 FAQ
JavaScript에서 !=
와 ===
의 차이점은 무엇입니까? !==
JavaScript에서 false
및 false == ""
는 비교 연산자입니다. 그러나 값을 비교하는 방식이 다릅니다. 연산자 (느슨한 평등 연산자라고도 함)는 비교 전에 유형 주조를 수행합니다. 즉, 두 가지 다른 유형의 값을 비교하면 JavaScript가 비교를 수행하기 전에 한 유형으로 다른 유형을 변환하려고합니다. 반면, 연산자 (엄격한 평등 연산자라고 함)는 유형 주조를 수행하지 않습니다. 값과 유형을 동시에 비교하므로 두 값 유형이 다르면 JavaScript는 동등하지 않은 것으로 간주됩니다. true
==
JavaScript에서
운영자는 두 피연산자의 값이 동일인지 확인하고 필요한 경우 유형 캐스트를 수행합니다. 반면, 운영자는 두 피연산자의 값이 동일하지 않은지 확인하고 필요한 경우 유형 캐스트를 수행합니다. ==
및 !=
는 JavaScript의 비교 연산자입니다. ==
와 !=
의 차이점은 무엇입니까? ==
!=
및 운영자는 값과 유형을 모두 고려하여 두 피연산자의 값이 동일인지 확인합니다. 반면,
JavaScript에서 ===
운영자는 값과 유형을 모두 고려하여 두 피연산자의 값이 동일하지 않은지 확인합니다. !==
===
와 !==의 비교를 어떻게 처리합니까? ===
JavaScript에서 !==
및
JavaScript에서 비교 연산자는 우선 순위가 동일합니다. 왼쪽에서 오른쪽으로 계산됩니다. 그러나 산술 및 비트 연산자보다 우선 순위가 낮지 만 논리 연산자보다 높다는 점에 유의해야합니다.
위 내용은 사악한 쌍둥이를 두려워하지 마십시오 - Sitepoint의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!