프로그래밍 과정에서 두 변수가 동일한지 판단하는 상황이 자주 발생합니다. ECMAscript는 판단을 위해 두 개의 동등 연산자 "==" 및 "==="를 제공합니다. 일반적으로 말하면 "==" 같음과 "===" 합동이라고 합니다.
비교된 두 변수의 데이터 유형이 일치하는 경우 상황은 비교적 간단합니다. 그러나 연산자 양쪽의 변수 유형이 일치하지 않거나 변수 중 하나라도 객체인 경우 상황은 더욱 복잡해집니다. 다음은 각각의 작업에 대해 설명합니다. 숫자 유형이 다른 경우 작업 결과는 어떻게 되나요?
합치 연산자 “===”
합치 연산자 “===”의 경우는 비교적 간단합니다. 일치 연산자 "==="를 사용하여 판단하는 경우 먼저 연산자 양쪽의 피연산자의 데이터 유형이 일치하는지 확인하십시오. 일치하지 않으면 false가 직접 반환됩니다. 만들어질 것입니다.
두 개의 부울을 비교하는 경우 "==="의 양쪽이 모두 true 또는 false여야 true를 반환할 수 있습니다. 그렇지 않으면 두 숫자를 비교하는 경우 이 두 개가 있을 때만 false를 반환합니다. 숫자 크기가 동일한 경우에만 True가 반환되고, 그렇지 않으면 False가 반환됩니다.
비교할 두 변수가 문자열인 경우 먼저 두 문자열의 길이를 비교하여 길이가 다른지 확인하고, 길이가 다르면 false가 반환되며 처음부터 비교가 시작됩니다. 두 변수의 문자입니다. 같으면 마지막 숫자까지 비교하고, 숫자 중 하나가 기다리기를 원하지 않으면 false를 반환하고, 그렇지 않으면 true를 반환합니다.
(참고: 문자열 비교는 공백을 무시하지 않으므로 두 문자열을 비교하여 동일한지 확인할 때 안전을 보장하기 위해 먼저 공백을 제거한 다음 두 문자열을 대문자 또는 소문자로 변환해야 합니다. 비교를 위해 ).
그리고 null은 null===null인 경우에만 true를 반환하고, 다른 경우에는 false를 반환합니다. 마찬가지로 undefound는 undefine===undefine인 경우에만 true를 반환하고, 그렇지 않으면 false를 반환합니다. 예를 들면
true === 1 //false "1" === 1 //false //boolean的比较 true === true //true true === false //false //string的比较 "hello" === "helloworrld" //false "hello" === "world" //false "hello" === " hello" //false "hello" === "hellO" //false "hello" === "hello" //true //number的比较 1 === 1 //true 1 === 1.0 //true 1 === 1.2 //false //null和undefined的比较 undefined === undefined //true null === null //true undefined === null //false,两者在"=="时才返回true
"===" 비교의 피연산자 2개가 기본 타입 값이 아니고 객체 2개인 경우, 이때의 판단 기준은 두 변수가 "같은" 객체인지 판단하는 것입니다
var a,b,c; a = b = { name : '柳轻侯', city : '南京' }; c = { name : '柳轻侯', city : '南京' }; a === b //true a === c //false
두 개체가 "동일하게 보이는" 것만으로는 충분하지 않습니다. a와 c는 모두 개체 인스턴스이며 동일한 속성과 값을 갖습니다. 그러나 실제로 a와 c는 "동일한" 개체가 아닙니다. 두 개의 서로 다른 인스턴스가 있으므로 두 개체가 합동이 아닙니다.
그러나 a와 b는 동일한 객체를 가리킵니다. 즉, a와 b는 실제로는 완전히 동일한 객체를 가리키는 것이므로 a === b입니다. "!==" 및 "==="에 대한 비교 규칙은 동일하므로 여기서는 반복하지 않습니다.
동등 연산자 "=="
합동 연산자는 판단 시 두 변수의 유형이 다른 경우 직접 false를 반환합니다. 이와 달리 "==" 평등 연산자는 판단 중에 다음과 같은 경우입니다. 두 변수의 유형이 다르면 비교하기 전에 비교할 두 값을 동일한 유형으로 변환하기 위해 암시적 유형 변환이 수행됩니다. 그러면 이 변환에 대한 규칙은 무엇입니까?
다른 데이터 유형을 변환할 때 항등 및 부등 연산자는 다음 기본 규칙을 따릅니다.
비교할 때 두 피연산자는 다음 규칙을 따릅니다.
여기서 NaN == NaN은 false를 반환한다는 점에 유의해야 합니다. NaN은 숫자가 아님을 의미합니다. 이는 피연산자가 숫자가 아니며 이 숫자가 아닌 값은 알 수 없음을 의미합니다. , JavaScript 구문을 사용하여 전혀 표현되지 않을 수도 있습니다. 이러한 알 수 없는 수량은 특정 비교에 사용할 수 없습니다. 두 가지 알 수 없는 항목에 대한 값을 확인할 수 없다면 당연히 NaN == NaN이라고 말할 수 없습니다.
그러면 "=="를 사용하여 비교할 수 없으므로 변수가 NaN인지 여부를 어떻게 판단할 수 있습니까? 동등성을 사용하여 결정할 수 없으므로 반대로 "!="를 사용하여 NaN인지 여부를 판단하는 것이 좋습니다. 변수가 NaN인지 여부입니다. 예:
//如果需要判定一个变量是不是NaN,可以如下 //a是你需要判定的变量 if((typeof a === "number") && a != NaN ){ //此处需要注意,NaN也是number类型 //TODO }
일반적인 비교 상황과 그 결과
null == undefined // true "NaN" == NaN // false 5 == NaN // false NaN == NaN // false NaN != NaN // true false == 0 // true true == 1 // true true == 2 // false undefined == 0 // false null == 0 // false "5" == 5 // true
전형적인 사례 분석
![] == [] //true
这是一道比较容易令人困惑的题,按照正常的思维模式,对一个操作数逻辑取反,跟这个操作数本身的值是相对的,如果这个操作数本身的值是true,那么取反之后就是false,反之,如果这个操作数的值是false,那么对其逻辑取反之后就是true,无论如何也不会是同一个值,可是事实上却是![] == []。
首先,![]的值是false,因为这里[]被当成了一个数组的实例,是一个对象,而对象都是真值,对其取反,得到一个假值,也就是false。
其次看等号右边,[]是一个对象,要将其转为基本类型值,会先调用数组的valueOf方法,而数组的valueOf方法返回数组本身,没有得到一个基本值。
这时候要继续调用数组的toString方法,得到一个””空字符串,所以这时候也就变成了false == “”是否为真的问题了,而根据前面的规则,如果有一个操作数为boolean值,会将其转为数值,false转化为0。
进而,问题转化为0 == “”是否为真值的问题,当number和string比较时,会将string转为number,而””会转为0。最后,问题变演化成了0 == 0是否为真值,毋庸置疑,结果是true。
这里要注意的就是![],它被当成了一个整体的逻辑值,是直接对对象进行取反,是一个假值,而不是先把[]转化为基本值再取反
小结
“==”在比较不同类型值得时候会进行隐式的类型转化,而”===”不会转化,全等一定相等,相等却不一定全等,这是一个充分不必要条件。
undefined和null相等而不全等,且在相等比较的时候不会转化为其他类型的值。NaN是不等于NaN 的,要判断某个变量是不是NaN,要用”!=”。对象和非对象在进行比较的时候会先转为基本类型值然后再根据上面的规则进行比较。
推荐教程:《JS教程》
위 내용은 JavaScript의 항등 연산자에 대한 간략한 설명: ==와 ===의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!