차이점은 무엇이며 ==
그리고 ===
?
- 느슨한
==
비교 가 정확히 어떻게 작동합니까? - 엄격한
===
비교 는 정확히 어떻게 작동합니까?
유용한 예는 무엇입니까?
답변
차이 사이 ==
와===
느슨하게 ==
동등한 연산자와 엄격한 ===
동일한 연산자 의 차이점 은 매뉴얼에 정확하게 설명되어 있습니다 .
비교 연산자
┌───────────┬───────────┬─────────────────────────── ──────────────────────────────────┐ │ 예 │ 이름 │ 결과 │ ├───────────┼───────────┼─────────────────────────── ──────────────────────────────────┤ │ $ a == $ b │ 같음 │ 저글링 유형 후 $ a가 $ b와 같으면 참입니다. │ │ $ a === $ b │ 동일 │ $ a가 $ b와 같고 유형이 같으면 참. │ └───────────┴───────────┴─────────────────────────── ──────────────────────────────────┘
느슨하게 ==
동일한 비교
당신이 사용하는 경우 ==
운영자, 또는 느슨하게 비교를 사용하는 다른 비교 연산자를 같은 !=
, <>
또는 ==
, 당신은 항상보고있는 상황 뭔가가 무슨 일이 일어나고 있는지 이해로 변환됩니다 왜, 무엇을 볼 수 있습니다.
규칙 변환
타입 비교표
참조 및 예제로 매뉴얼 에서 비교 테이블을 볼 수 있습니다 .
와의 느슨한 비교
==
┌─────────┬┬──────┬┬──────┬───────┬───────┬──────── ┬───────┬───────┬───────┬───────┬─────────┬──────── ┬───────┐ │ │ TRUE │ FALSE │ 1 │ 0 │ -1 │ "1"│ "0"│ "-1"│ NULL │ array () │ "php"│ ""│ ├─────────┼┼──────┼┼──────┼───────┼───────┼──────── ┼───────┼───────┼───────┼───────┼─────────┼──────── ┼───────┤ │ 참 │ 참 │ 거짓 │ 참 │ 거짓 │ 참 │ 참 │ 거짓 │ 참 │ 거짓 │ 거짓 │ 참 │ 거짓 │ │ FALSE │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ TRUE │ TRUE │ FALSE │ TRUE │ │ 1 │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ 0 │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ TRUE │ TRUE │ │ -1 │ True │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "1"│ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "0"│ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "-1"│ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ │ NULL │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ TRUE │ │ array () │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ FALSE │ │ "php"│ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ │ ""│ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ └─────────┴┴──────┴┴──────┴───────┴───────┴──────── ┴───────┴───────┴───────┴───────┴─────────┴──────── ┴───────┘
엄격한 ===
동일한 비교
당신이 사용하는 경우 ===
와 같은 엄격한 비교를 사용하는 운영자, 또는 다른 비교 연산자 !==
또는 ===
, 당신은 항상 확인 유형하지 않을 수 있습니다 마술 변경을, 어떤 변환에 가고 없을 것 때문이다. 따라서 엄격한 비교를 통해 유형과 값은 값뿐만 아니라 동일해야합니다.
타입 비교표
참조 및 예제로 매뉴얼 에서 비교 테이블을 볼 수 있습니다 .
다음과의 엄격한 비교
===
┌─────────┬┬──────┬┬──────┬───────┬───────┬──────── ┬───────┬───────┬───────┬───────┬─────────┬──────── ┬───────┐ │ │ TRUE │ FALSE │ 1 │ 0 │ -1 │ "1"│ "0"│ "-1"│ NULL │ array () │ "php"│ ""│ ├─────────┼┼──────┼┼──────┼───────┼───────┼──────── ┼───────┼───────┼───────┼───────┼─────────┼──────── ┼───────┤ │ TRUE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ 거짓 │ 1 │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ 0 │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ -1 │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "1"│ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "0"│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "-1"│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ │ NULL │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ │ array () │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ │ "php"│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ │ ""│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ └─────────┴┴──────┴┴──────┴───────┴───────┴──────── ┴───────┴───────┴───────┴───────┴─────────┴──────── ┴───────┘
답변
== 연산자는 서로 다른 두 유형이 다른 경우 캐스트하지만 === 연산자는 ‘유형 안전 비교’를 수행합니다. 즉, 두 피연산자가 동일한 유형과 동일한 값을 갖는 경우에만 true를 리턴합니다.
예 :
1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value
경고 : 동등한 멤버를 가진 같은 클래스의 두 인스턴스가 ===
연산자 와 일치하지 않습니다 . 예:
$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
답변
그림은 천 단어의 가치가 있습니다.
PHP Double Equals ==
평등 차트 :
PHP Triple Equals ===
Equal 차트 :
이러한 이미지를 생성하는 소스 코드 :
https://github.com/sentientmachine/php_equality_charts
전문가 명상
정신 건강을 유지하고자하는 사람들은 PHP의 광기가 아닌 부분이 설계된 방식이라고 말하는 것 외에는 아무런 의미가 없기 때문에 더 이상 읽을 필요가 없습니다.
NAN != NAN
하지만NAN == true
.==
left가 숫자 인 경우 왼쪽 및 오른쪽 피연산자를 숫자로 변환합니다. 그래서123 == "123foo"
하지만,"123" != "123foo"
-
따옴표로 묶은 16 진 문자열은 때로는 부동 소수점이며, 의지에 따라 부동으로 던져져 런타임 오류가 발생합니다.
-
==
하지 이적 때문에"0"== 0
, 그리고0 == ""
있지만,"0" != ""
- 아직 선언되지 않은 PHP 변수는 PHP에 정의되지 않은 변수를 나타내는 방법이 있지만이 기능은로 비활성화되어
==
있습니다. -
"6" == " 6"
,"4.2" == "4.20"
그리고"133" == "0133"
그러나133 != 0133
. 그러나"0x10" == "16"
및"1e3" == "1000"
진수에 깜짝 문자열 변환을 노출시키는 런타임 오류가 발생, 사용자의 명령 또는 동의없이 모두 발생합니다. -
False == 0
,""
,[]
와"0"
. -
숫자가 충분히 크면 == 무한대입니다.
-
새로운 클래스는 ==에서 1입니다.
- False는 대부분의 다른 변수에 대해 ==이기 때문에 False가 가장 위험한 값이며 대부분 목적을 무시합니다.
기대:
PHP를 사용하는 경우 double equals 연산자를 사용하지 않아야합니다. triple equals를 사용하는 경우 걱정해야 할 유일한 경우는 NAN과 숫자가 무한대에 가깝기 때문에 무한대로 캐스트되기 때문입니다. 더블 이퀄라이저를 사용하면 무엇이든 놀라게 ==
할 수 있고 또는 의지와!=
분명히 동등한 무언가에 .
==
PHP에서 사용하는 곳 은 브라운 모션으로 프로그래밍하는 수백만 명의 프로그래머가 설계 한 암시 적 캐스팅 규칙에 의해 노출 된 85 개의 버그로 인해 코드 냄새가 심합니다.
답변
JavaScript와 관련하여 :
=== 연산자는 == 연산자와 동일하게 작동하지만 피연산자가 동일한 값뿐만 아니라 동일한 데이터 유형을 가져야합니다.
예를 들어 아래 샘플은 ‘x와 y는 동일합니다’를 표시하지만 ‘x와 y는 동일하지 않습니다’를 표시합니다.
var x = 4;
var y = '4';
if (x == y) {
alert('x and y are equal');
}
if (x === y) {
alert('x and y are identical');
}
답변
객체 비교에 관한 다른 답변에 추가 :
==는 객체의 이름과 값을 사용하여 객체를 비교합니다. 두 객체의 유형이 동일하고 구성원 값이 동일한 경우$a == $b
true를 생성합니다.
=== 객체의 내부 객체 ID를 비교합니다. 멤버가 같더라도 $a !== $b
정확히 동일한 객체가 아닌 경우
class TestClassA {
public $a;
}
class TestClassB {
public $a;
}
$a1 = new TestClassA();
$a2 = new TestClassA();
$b = new TestClassB();
$a1->a = 10;
$a2->a = 10;
$b->a = 10;
$a1 == $a1;
$a1 == $a2; // Same members
$a1 != $b; // Different classes
$a1 === $a1;
$a1 !== $a2; // Not the same object
답변
가장 간단한 용어로 :
== 동등한 지 확인 (값만)
=== 동일한 지 확인 (값 && 유형)
항목과 같은 항목을 확인합니다.
1 + 1 = 2 + 0 (상당)
1 + 1 = 1 + 1 (동일)
PHP에서 :
참 == 1 ( 값이 동일 함)
true === 1 (false-&& 유형에서 동일하지 않음)
- 사실은 부울
- 1은 정수입니다
답변
데이터 유형에 관한 것입니다. 테이크 BOOL
예를 들어 (true 또는 false)를 :
true
또한 동일 1
과
false
도 같다0
는 ==
비교하는 데이터 유형에 대해 상관하지 않는다 : 당신은 (또한이 될 수있는 1 인 변수를 가지고 그래서 경우 true
) :
$var=1;
그리고 다음과 비교하십시오 ==
.
if ($var == true)
{
echo"var is true";
}
그러나 $var
실제로 같지 true
않습니까? 1
대신 int 값이 있으며 이는 true입니다.
와 ===
데이터 유형을 검사하여 두 변수 / 객체 / 무엇이 같은 유형을 사용하는지 확인합니다.
내가 한 경우
if ($var === true)
{
echo "var is true";
}
그 조건은 사실이 아니기 때문에 사실 $var !== true
이 아닙니다.== true
(당신이 무슨 뜻인지 알고있는 경우).
왜 이것이 필요할까요?
간단 함-PHP의 기능 중 하나를 보자 : array_search()
:
이 array_search()
함수는 단순히 배열에서 값을 검색하고 값을 찾은 요소의 키를 반환합니다. 배열에서 값을 찾을 수 없으면 false를 반환합니다 . 그러나 배열array_search()
의 첫 번째 요소 (배열 키가있는 0
) 에 저장된 값을 켜면 어떻게 될까요?array_search()
함수는 0을 반환합니다 … 이것은 false와 같습니다.
그래서 당신이 한 경우 :
$arr = array("name");
if (array_search("name", $arr) == false)
{
// This would return 0 (the key of the element the val was found
// in), but because we're using ==, we'll think the function
// actually returned false...when it didn't.
}
그렇다면 지금 이것이 어떻게 문제가 될 수 있습니까?
대부분의 사람들은 == false
함수가 false를 반환하는지 확인할 때 사용하지 않습니다 . 대신에을 사용합니다 !
. 그러나 실제로 이것은을 사용하는 것과 정확히 동일 ==false
합니다.
$arr = array("name");
if (!array_search("name", $arr)) // This is the same as doing (array_search("name", $arr) == false)
따라서 이와 같은 경우 ===
대신 데이터 유형을 확인하도록 대신 사용하십시오 .