JavaScript는 비교 연산자 "도"추이 관계가 성립되지 않은 건
제목대로의 이야기입니다.
추이 관계 is 무엇?
추이 관계(transitive relation)라고 하는 것은, 「바람이 불면 먼지가 타츠」 「먼지가 가라바(약) 야마가 돈다」이기 때문에 「바람이 불으면 가게가 벌어진다」라고 하는 3단론법 같은 녀석 네요.
일반적으로 관계 R이 어떤 조합의 a, b, c에 대해 아래와 같이 말할 때 R은 전이적이라고합니다.
a R b で b R c なら a R c
수치의 대소 비교가 추이적이라고 하는 것은 직감적으로 알 수 있을 것이다.
a < b で b < c なら a < c
그렇습니다.
그리고, 위에서 사용한 <
연산자가, JavaScript에서는 추이적이지 않아, 라고 하는 것이 본제.
증명
전이적이지 않은 것을 나타내는 것은 간단하고, 하나라도 좋기 때문에 위의 법칙이 성립되지 않는 a, b, c 의 조합을 찾아내면 된다.
여기서 다음 조합을 고려하십시오.
a = 1;
b = "2";
c = "three";
이것을 브라우저 콘솔에서 실행하면 결과는 다음과 같습니다.
훌륭하게 반례를 나타낼 수있었습니다.
왜 이런데...?
왜 이런 결과가 되는가 하면 , JavaScript의 <
는 , 양변이 캐릭터 라인이었을 경우는 캐릭터 라인의 사전순으로 대소 비교를 하는군요.
둘 중 하나라도 문자열이 아닌 경우 숫자로 변환하여 비교합니다.
그 때문에, 값의 형태가 갖추어지지 않은 경우에는 이런 이상한 일이 일어난다고 하는 것이군요.
그러고 보면 타이틀에 「"도"」라고 썼습니다만, JavaScript에서는 똑같이 ==
연산자도 추이 관계를 채우고 있지 않습니다.
이것은 ECMAScript 3rd Edition 사양에 언급 된만큼 유명한 (?) 사실 :
참고 3 The equality operator is not always transitive. For example, there might be two distinct String objects, each representing the same String value; each String object would be considered equal to the String value by the == operator, but the two would not be equal to each other.
문장으로 읽으면 어쩐지 이해하기 어렵습니다만, 이런 의미군요↓
a = new String("hoge");
b = "hoge";
c = new String("hoge");
로 여러분도 실행해보십시오.
이봐!
그렇다면 <
에 대해서도 NOTE 해 주세요! 내가 생각한 것은 다른 이야기 (ぉ
Reference
이 문제에 관하여(JavaScript는 비교 연산자 "도"추이 관계가 성립되지 않은 건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Maki-Daisuke/items/a2cb1f4aecdc6d5eaca4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
a R b で b R c なら a R c
a < b で b < c なら a < c
전이적이지 않은 것을 나타내는 것은 간단하고, 하나라도 좋기 때문에 위의 법칙이 성립되지 않는 a, b, c 의 조합을 찾아내면 된다.
여기서 다음 조합을 고려하십시오.
a = 1;
b = "2";
c = "three";
이것을 브라우저 콘솔에서 실행하면 결과는 다음과 같습니다.
훌륭하게 반례를 나타낼 수있었습니다.
왜 이런데...?
왜 이런 결과가 되는가 하면 , JavaScript의 <
는 , 양변이 캐릭터 라인이었을 경우는 캐릭터 라인의 사전순으로 대소 비교를 하는군요.
둘 중 하나라도 문자열이 아닌 경우 숫자로 변환하여 비교합니다.
그 때문에, 값의 형태가 갖추어지지 않은 경우에는 이런 이상한 일이 일어난다고 하는 것이군요.
그러고 보면 타이틀에 「"도"」라고 썼습니다만, JavaScript에서는 똑같이 ==
연산자도 추이 관계를 채우고 있지 않습니다.
이것은 ECMAScript 3rd Edition 사양에 언급 된만큼 유명한 (?) 사실 :
참고 3 The equality operator is not always transitive. For example, there might be two distinct String objects, each representing the same String value; each String object would be considered equal to the String value by the == operator, but the two would not be equal to each other.
문장으로 읽으면 어쩐지 이해하기 어렵습니다만, 이런 의미군요↓
a = new String("hoge");
b = "hoge";
c = new String("hoge");
로 여러분도 실행해보십시오.
이봐!
그렇다면 <
에 대해서도 NOTE 해 주세요! 내가 생각한 것은 다른 이야기 (ぉ
Reference
이 문제에 관하여(JavaScript는 비교 연산자 "도"추이 관계가 성립되지 않은 건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Maki-Daisuke/items/a2cb1f4aecdc6d5eaca4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
a = new String("hoge");
b = "hoge";
c = new String("hoge");
Reference
이 문제에 관하여(JavaScript는 비교 연산자 "도"추이 관계가 성립되지 않은 건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Maki-Daisuke/items/a2cb1f4aecdc6d5eaca4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)