기호 '='는 수학적인 기능(좌,우가 같음)과 달리 프로그래밍에서는 '='의 오른쪽의 값을 왼쪽으로 할당,배정한다는 의미의 기호이다.(assignment operator)
대신 '같음'을 의미하는 기호는 다른 기호로 사용한다.
a = [1, 2] b = a c = [1, 2]
위와 같이 변수들이 있다고 하면, 아래와 같은 결과를 얻을 수 있다.
a is b > True #a, b는 같은 객체이다. a is c > False #a, c는 다른 객체이다 a == b > True #a, b는 같은 값을 가진 리스트이다. a == c > True #a, c는 같은 값을 가진 리스트이다.
b는 a를 그대로 할당받는 변수이기 때문에, 같은 객체값(주소값)을 갖게 된다.
c는 a와 같은 값을 같지만 새로 할당된 변수이기 때문에 다른 객체이다.
'=='는 좌,우의 값이 같은지 여부를 확인하는 연산자로 값의 동일 여부를 리턴한다.
Python은 '=='연산자로 비교할 경우 좌,우의 data type도 같아야 'Ture'를 리턴한다.
반면, 'is'도 좌,우의 값이 같은지를 확인하는 연산자이나, 단순 값만을 보는 것이 아니라 완전히 같은 데이터이어야 한다.(주소값이 같아야한다.)
위에서와 같이 a, c가 동일한 리스트로 보여도 따로 할당된 데이터이기 때문에 'is'로 리턴되는 값은 False이 된다.
JavaScript에서 '=='는 '느슨한 비교'로 좌,우 값의 데이터가 같은지만 확인한다.
data type이 문자열과 숫자로 다를 경우 숫자로 변환해서 비교한다.
'==='는 '엄격한 비교'로 좌,우의 데이터 형태 변환 없이 그 자체로 비교한다.
Python에서의 'is'와 유사하다고 보면 된다.
'=='와 '==='의 연산 기능은 구체적으로 아래의 순서에 따른다.
x == y
1. 'null' vs 'undefined' = True
2. Number type vs String type = String을 ToNumber하여 비교
비교한 값을 return
3. Boolean type = ToNumber하여 비교한 값을 return
4. String, Number, Symbol type vs Object = Object 타입을 갖는 값을 ToPrimitive하여 비교.
비교한 값을 return
5. 여기까지도 아니면 False* ToNumber
* ToPrimitive
x === y
'=='와 동일한 순서를 갖으나 아래의 과정이 추가된다.
1. 두 값의 type을 비교한다. type이 다르면 False
2. x의 type이 Number라면?
3. 두 값 중 NaN이 존재하면 False를 return
4. 두 값이 같은 값이면 True, 아닐경우 False
5. +0, -0은 같다고 판단(True)