본문 바로가기
728x90

전체 글89

[JS][문법] 콘텍스트 규칙 콘텍스트 규칙 자바스크립트 문법 규칙 중에는 같은 문구지만 어디에서 어떤 식으로 사용하느냐에 따라 서로 다른 의미를 가지는 경우가 있다. 하나씩 떨어뜨려 놓고 보면 상당히 헷갈릴 수 있다. 중괄호 자바스크립트에서 중괄호가 나올 법한 곳은 크게 두 군데이다. 객체 리터럴 첫째 객체 리터럴이다. var a = { foo: bar(), }; {}는 a에 할당될 값이므로 객체 리터럴이 맞다. 레이블 방금 전 코드에서 var a = 부분을 삭제하면 어떻게 될까? { foo: bar(); } {}는 어디에도 할당되지 않은, 그저 고립된 객체 리터럴 처럼 보인다. 하지만 전혀 그렇지 않다. 여기서의 {}은 평범하 코드 블록이다. 혼자 떨어져 있는 모양세가자바스크립트에서는 그리 자연스럽지 않지만, 문법적으로는 100%.. 2022. 2. 14.
[JS][문법] 표현식의 부수 효과 표현식의 부수 효과 대부분의 표현식에는 부수 효과가 없다. 예컨데, var a = 2; var b = a + 3; 표현식 a + 3 자체는 가령 a값을 바꾸는 등의 부수효과가 전혀 없다. 단지 b = a + 3문제서 결괏값 5가 b에 할당될 뿐이다. 다음의 함수 호출 표현식은 부수효과를 가진 표현식의 전형적인 예다. function foo() { a = a + 1; } var a = 1; foo(); // 결괏값 : undefined, 부수 효과 : a가 변경됨 다른 부수 효과를 지닌 표현식을 보자. var a = 42; var b = a++; 표현식 a++이 하는 일은 두 가지다. a의 현재 값 42를 반환하고 a값을 1만큼 증가시킨다. var a = 42; var b = a++; a; // 43 b;.. 2022. 2. 13.
[JS][문법] 문과 표현식 문법 자바스크립트 언어에서 구문이 어떻게 작동하는지 알아보자. 자바스크립트 코딩 실력을 자신하는 사람도 자바스클비트 언어의 문법은 어려워한다. 온갖 혼란과 오해의 늪에 빠지게 할, 별별 미묘한 것들로 가득차 있어서다. 자, 이런 것들을 확실히 끄집어내어 그간 우리가 잘못 알아온 것들을 말끔히 정리하자. 문과 표현식 문과 표현식을 대충 같은 의미라고 넘겨버리는 개발자가 허다하다. 그러나 자바스크립트에서 두 용어는 아주 중요한 차이가 있으므로 명확하게 분별하자. 문장은 생각을 표현하는 단어들의 완전한 조형물이다. 문장은 하나 이상의 어구로 구성되며 각 어구는 구두점이나 접속사로 연결할 수 있고 어구는 더 작은 어구로 나눌 수있다. 어던 어구는 불완전하여 그 자체로 완성된 문장을 형성할 수 없지만 스스로의 힘.. 2022. 2. 13.
[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.
728x90