기본 콘텐츠로 건너뛰기

라벨이 weird인 게시물 표시

나는 내가 아니다.

  나는 특이한 문제를 좋아하는 편이다. 오늘은 최근에 본 특이한 문제를 소개 한번 해보도록 하겠다.  x !== x const x = ? if ( x !== x ) { console . log ( 'Hello, world!' ) }  x를 정의해서 'Hello, world!'를 출력 할 수 있을까? !==는 불일치 연산자이다. 값과 타입을 다른지 판별을 한다. 그런데 x가 x가 아니게 만들라니 참 특이한 문제이다.   == 왜 쓰지 말라는 걸까?  물론 위의 문제를 해당 포스트에서 제기하였다. ===(일치연산자)는 만능이 아니다.  x = NaN 이게 된다면, x !== x의 값이 참이되게 된다.  x === x + 1 const x = ? if ( x === x + 1 ) { console . log ( 'Hello, world!' ) }  이 문제는 무엇일까? === 일치연산자인데 x와 x + 1이 현실에서 똑같을리 없다. 뭐 물론 x < x + 1 이 값이 참이 되는 경우는 C언어를 공부하다보면 알게 되었을 것이다. 뭐 그렇다 오버플로우이다.  자바스크립트에서 허용 되는 가장 큰값 Number.MAX_SAFE_INTEGER(9007199254740991)에 1을 더하면 어떻게 될까? 자바스크립트에서는 그냥 더해질 뿐이다. (9007199254740992)  그렇다면  Number.MAX_SAFE_INTEGER(900719925474099 1 )에 2 를 더하면 어떻게 될까? 결과는 900719925474099 2  우리가 계산으로 컴퓨터를 이겼다.    당연히 우리는 900719925474099 3 인 것을 알고있다.  뭐 내용을 따져보면 IEEE-754(부동소수점 어쩌고저쩌고)  Number.MAX_SAFE_INTEGER의 이상의 값에서는 반올림을 하기 때문이라고 한다.  즉, x ...

메서드 vs 함수

 함수는 무엇일까? 하나 이상의 문장, 식이 특정 하나의 기능을 위해 작성 된 것이라고 표현 할 수 있겠다. 뭐 물론 문장이라고 하였지만, 하나의 식(expression)으로도 표현 가능 할 것이다.  그러면 메서드란 무엇일까? 객체지향 언어를 배우다보면 메서드라는 표현을 처음 듣게 된다. 간단하게 클래스혹은 구조체 내에 정의된 함수라고 표현 하면 될 것 같다.  당연하게도 자바스크립트도 (프로토타입기반) 객체지향 언어이기 때문에 메서드라는 개념이 있다.   (참고 ES6 표준으로 제시된 class는 새로운 객체지향 모델을 지원하는 것이 아니라 기존의 프로토타입 기반의 객체지향을 위한 Syntacitc Sugar일 뿐 오해하지 말자.)  자바스크립트에서의 메서드 const person = { name : 'sejiowrk' , hi () { console. log ( `안녕하세요. ${ this . name } 입니다.` ) } }  자바스크립트에서의 메서드정의는 Java, C++등과 비교하여 간편하다 class를 따로 정의할 필요도 없으며, new 키워드를 사용 하여 인스턴스화 할 필요없이 리터럴 객체를 만들어서 정의할 수 있다. 뭐 물론 필요하다면, class 혹은 function을 이용하여 좀 더 다른 언어들과 유사하게 만들어주는 것도 가능 하므로 선택은 자유이다.  hi 함수는 메서드이기 때문에 자신이 속해있는 객체의 name을 사용할 수 있게 된다. 당연하게도 hi는 메서드이전에 함수이다.   잃어버린 this (person. hi || function () { })() 엄격 모드 사용시에는 name을 찾을수가 없고, 엄격 모드를 사용 하지 않는 경우에는 window가 this를 대체 하였다.  두 경우 모두 hi가 속해 있는 객체 person의 name을 가져올 수 없게 되었다. 해당 내용이 의아 할 수 있는데, 간단하...

이 문장은 거짓이다.

이번에 소개드릴 내용은 이상한 자바스크립트이다. 1.  배열은 배열이 아닌것과 같다. 이게 무슨 소리일까? console . log ([] == ![]) console . log (+[] == +![]) 위의 항등 연산자는 결과가 어떻게 될까? 특이하게도 위의 결과 둘다 true가 찍힌다. 항등연산자에서 빈 배열은 0으로 값이 있는 배열은 1로 형변환이 가능해진다. [] == ![] 위의 []는 0으로 형변환이 되었고, ![]는 배열을 부정을 하여 false가 되었을 거다. 진위값 또한 false는 0으로 true는 1로 형변환이 가능해진다. 그렇기에 위처럼 둘다 true가 나오는 참사(?)가 발생했다. 2.  배열도 배열이 아닌것도 진실이 아니다. console . log ( true == []) console . log ( true == ![]) 이번 문제는 1번의 해석을 잘 풀어보면 풀수 있을 것이다. 맞다. 위의 결과는 둘다 false가 나온다. 분명 둘중 하나의 경우에는 true를 뜻하고 있어야 함에도 불구하고, 서로 다른이유로 [], ![]을 항등 연상자에서 거짓으로 판별 당했다. 3. 0보다 작거나 같지않지만, 0이하인것 console . log ( null == 0 || null < 0 ) console . log ( null <= 0 )  대부분의 분들이 위의 결과를 둘다 false라고 알고 있을 것이다.  여태 배워온 몇몇 언어들이 null, N/A에 대해서 비교를 제한하고 있는 경우가 많다. 비교를 하면 무조건 거짓이 나온다는 등 말이다. 아래 링크를 보면 자세하게 알 수 있겠지만, 관계연산자 인 경우 숫자형으로 변환시키는 것이 더욱 강제적으로 수행된다고 보면 된다. https://262.ecma-international.org/5.1/#sec-11.9.3 https://262.ecma-international.org/5.1/#sec-11.8.5 즉 아래의 주석과 같이 해석 되었...