728x90 JAVASCRIPT50 [JS][강제변환][마무리] 추상 관계 비교 추상 관계 비교 이 암시적 강제변환은 비교적 덜 관심받는 분야지만 그래도 a b는 b < a로 처리된다. 이 알고리즘은 먼저 두 피연산자에 대해 ToPrimitive 강제변환을 실시하는 것으로 시작한다. 그 결과 어느 한쪽이라도 문자열이 아닐 경우 양쪽 모두 ToNumber로 강제변환 하여 숫자 값으로 만들어 비교한다. 예를 들면, var a = [42]; var b = ["43"]; a < b; // true b < a; // false -0과 NaN 등을 조심해야.. 2022. 2. 13. [JS][강제변환] 동등비교 : 희귀 사례 (2) 근본부터 따져보자 암시적 강제변환을 깊숙이 파보니 정말 말도 안되는 것들이 몇가지 발견되었다. 이러니 개발자들 사이에서 강제변환은 악의 축이니 뭐니 하면서, 피하는 게 상책이라는 말이 나돌게 된 것이다. 자, 잠시 숨을 가다듬고 근본부터 다시 따져보자. 예상을 벗어난 정도를 기준을 ㅗ하면 강제변환이 심각한 문제가 될 경우는 7가지다. 하지만 나머지 항목들의 강제변환은 이치에 맞고 설명이 가능하다. "목욕물과 함꼐 아기를 내던져 버리는" 전형적인 예시로 이것보다 적합한 예가 있을까? 겨우 7개에 불과한 함정 때문에 강제변환이란 시스템을 전부 폐기 해야 할까? 족므 신중한 사람이라면 이렇게 반문할 것이다. "그 많은 강제변환의 좋은 부분을 활용하는 동시에 몇몇 나쁜 부분을 어떻게 요리조리 잘 피해갈 수 있을.. 2022. 2. 13. [JS][강제변환] 동등비교 : 희귀 사례 (1) 희귀 사례 지금까지 느슨한 동등 비교 == 이면의 암시적 강제변환에 대해 아주 자세히 살펴보았다. 이제는 우리가 강제변환 버그를 피해가도록 하기 위해서, 그중에서도 가장 골치 아프고 쓰지 알아야할 희귀 사례를 보자 먼저 내장 네이티브 프로토타입을 변경하면 어떤 참사가 빚어지는지 살펴보자. 알박힌 숫자 값 Number.prototype.valueOf = function () { return 3; }; new Number(2) == 3; // true 2 === 3 비교는 이 예와 무관하다. 2, 3이 둘 다 이미 원시 숫자 값이고 곧바로 비교가 가능하므로 Number.prototype.valueOf() 내장 메서드는 호출되지 않는다. 그러나 new Number(2)는 무조건 ToPrimitive 강제변환 .. 2022. 2. 12. [JS][강제변환] 동등비교 : null -> undefined, 객체 -> 비객체 동등비교 : null -> undefined null과 undefined 간의 변환은 느슨한 동등 비교 == 이 암시적 강제변환을 하는 또 다른 예이다. ES5 11.9.3.2-3을 살펴보면 x가 null이고 y가 undefined면 true를 반환한다. x가 undefined이고 y가 null면 true를 반환한다. null과 undefined를 느슨한 동등 비교하면 서로에게 타입을 맞춘다(강제변환 한다.). 언어 전체를 눈 씻고 찾아봐도 다른 값은 끼어들 여지가 없다. 즉, null과 undefined는 느슨한 동등 비교 시 상호 간의 암시적인 강제변환이 일어나므로 비교 관점에서 구분이 되지 않는 값으로 취급되는 것이다. var a = null; var b; a == b; // true a == nu.. 2022. 2. 12. [JS][강제변환] 동등비교 : 문자열 -> 숫자, * -> 불리언 동등비고 : 문자열 -> 숫자 == 강제변환 예제를 살펴보자. var a = 42; var b = "42"; a === b; // false a == b; // true 예상대로 a === b는 false다. 강제변환이 허용되지 않는 데다 42와 "42"는 그냥 봐도 다른 값이기 때문이다. 하지만 느슨한 동등 비교 a == b에서는 피연산자의 타입이 다르면, 비교 알고리즘에 의해 한쪽 또는 양쪽 피연산자 값이 알아서 암시적으로 강제변환 된다. 그런데 정확히 어떻게 강제변환이 일어나는 걸까? 42가 문자열로 바뀌어 a가 되는 걸까 아니면 "42"가 숫자로 바뀌어 b가 되는 걸까? ES5 11.9.3.4-5 원문을 보면 Type(x)가 Number고 Type(y)가 String이면, x == ToNumber.. 2022. 2. 12. [JS][강제변환] 느슨한/엄격한 동등 비교 ( ==, ===) 느슨한/엄격한 동등 비교 느슨한 동등비교는 ==연산자를, 엄격한 동등비교는 ===연산자를 각각 사용한다. 두 연산자 모두 두 값의 '동등함'을 비교하지만 '느슨함'과 '엄격함'이라는 아주 중요한 차이점이 있고 특히 동등함의 판단 기준이 다르다. 많은 이들이 종종 "==는 값의 동등함을, ===은 값과타임 모두의 동등함을 비교한다"라고 오해한다. 그럴듯 하지만 정확하진 않다. 엄청나게 많은 자바스크립트 책들에 그렇게 씌어있지만 불행하게도 다 틀렸따. 정확한 정의를 내려보자. "동등함의 비교 시 ==는 강제변환을 허용하지만, ===는 강제변환을 허용하지 않는다" 비교 성능 전자의 정의와 후자의 정의를 잠시 음미해보자. 전자에 의하면 ===는 타입까지 체크하므로 ==에 비해 할일이 많다. 후자에 따르면 오히려.. 2022. 2. 12. 이전 1 2 3 4 5 6 7 ··· 9 다음 728x90