본문 바로가기
728x90

javascript38

[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][강제변환] 느슨한/엄격한 동등 비교 ( ==, ===) 느슨한/엄격한 동등 비교 느슨한 동등비교는 ==연산자를, 엄격한 동등비교는 ===연산자를 각각 사용한다. 두 연산자 모두 두 값의 '동등함'을 비교하지만 '느슨함'과 '엄격함'이라는 아주 중요한 차이점이 있고 특히 동등함의 판단 기준이 다르다. 많은 이들이 종종 "==는 값의 동등함을, ===은 값과타임 모두의 동등함을 비교한다"라고 오해한다. 그럴듯 하지만 정확하진 않다. 엄청나게 많은 자바스크립트 책들에 그렇게 씌어있지만 불행하게도 다 틀렸따. 정확한 정의를 내려보자. "동등함의 비교 시 ==는 강제변환을 허용하지만, ===는 강제변환을 허용하지 않는다" 비교 성능 전자의 정의와 후자의 정의를 잠시 음미해보자. 전자에 의하면 ===는 타입까지 체크하므로 ==에 비해 할일이 많다. 후자에 따르면 오히려.. 2022. 2. 12.
[JS][강제변환] 암시적 강제변환 : * -> 불리언, || 와 && 연산자 암시적 강제변환 : * -> 불리언 이번에 볼 것은 불리언 값으로의 암시적 강제변환이다. 가장 평범하면서도 가장 골칫거리다. 암시적 강제변환은 어떤 값이 강제로 바뀌어야 하는 방향으로 사용할 때 발생한다는 것을 기억하자. 숫자, 문자열 연산에서 일어나는 강제변환은 쉽게 알아챌 수 있다. 다음은 불리언으로의 강제변환이 일어나는 표현식을 열거한 것이다. if()문의 조건 표현식 for( ; ; )에서 두 번째 조건 표현식 while() 밑 do..while() 루프의 조건 표현식 ? : 삼항 연산 시 첫 번째 조건 표현식 || 및 &&의 좌측 피연산자. 이런 콘텍스트에서 불리언 아닌 값이 사용되면, ToBoolean 추상연산 규칙에 따라 일단 불리언 값으로 암시적 강제변환 된다. var a = 42; var.. 2022. 2. 11.
[JS][강제변환] 암시적 강제변환 : 불리언 -> 숫자 암시적 강제변환 : 불리언 -> 숫자 암시적 강제변환의 효용성은 복잡한 형태의 불리언 로직을 단순한 숫자 덧셈 형태로 단순화할 때 빛을 발한다. 범용적인 기법은 아니지만 특정 상황에선 기발안 해법이 될 수 있다. function onlyOne(a, v, c) { return !!((a && b && c) || (!a && b && c) || (!a && !b && c)); } var a = true; var b = false; onlyOne(a, b, b); // true onlyOne(b, a, b); // true onlyOne(a, b, a); // false onlyOne()는 세 인자 중 정확히 하나만 true/truthy인지 아닌지를 확인하는 함수로 truthy 체크 시 암시적 강제변환을 하고.. 2022. 2. 11.
[JS][강제변환] 암시적 강제변환 : 문자열 <-> 숫자 암시적 강제변환 : 문자열 숫자 앞서 살펴보았던 '문자열 숫자'의 명시적 강베변환을 이제부터 암시적 강제변환 방식으로 살펴보자. 그 전에 암시적 강제변환을 일으키는 연산의 의미를 알아보자. +연산자는 '숫자의 덧셈, 문자열 접합' 두 가지 목적으로 모버로드 된다. 자바스크립트 엔진은 연산자를 보고 어떤 연산을 해야 할지 어떻게 알까? var a = "42"; var b = "0"; var c = 42; var d = 0; a + b; // "420" c + d; // 42 결괏값이 "420"으로 나올 때와 42로 나올 때는 어떤 차이가 있을까? 피연산자가 한쪽 또는 양쪽 모두 문자열인지 아닌지에 따라 +연산자가 문자열 붙이기를 할지 결정한다고 보통 잘못 알고있는 경우가 많다. 부분적으론 맞지만 실상은 그.. 2022. 2. 11.
[JS][강제변환] 암시적 강제변환 : 개요 암시적 변환 암시적 강제변환은 부수효과가 명확하지 않게 숨겨진 형태로 일어나는 타입변환이다. 즉, 우리가 보기에 분명하지 않은 타입변환은 모두 이 범주에 속한다.' 명시적 강제변환의 목적(코드를 명확하게, 이해할 수 있게 작성하는 것)은 분명하고 암시적 강제변환의 목적이 그 반대(코드를 더 이해하기 어렵게 만듦)라는 사실 또한 너무나 분명하다. 액면 그대로 받아들이다 보니 모든 오해와 노여움이 시작된 것같다. '자바스크립트 강제변환'을 향한 대부분의 불평불만이 바로 이 암시적 강제변환을 겨냥하고 있는 건 사실이다. 그럼 암시적 강제변환은 정말 유해하고 위험한 것일까? 자바스크립트 언어 설계의 버그인가? 어던일이 있어도 피하는게 상책인가? 암시적 강제변환이 무엇인지, 어떻게 활용하는지, 무조건 선량한 명시.. 2022. 2. 11.
728x90