Weakness (자바스크립트의 단점)
‣ 자바스크립트의 == 연산자
"" == false // true
[] == false // true
null == false // true
undefined == false // true
빈 문자열은 '거짓이라고 볼 수 있는 값' 이기 때문에 false, 하지만 빈 배열은 '거짓이라고 볼 수 있는 값' 이 아닌데 false 입니다.
null 과 undefined 또한 '거짓이라고 볼 수 있는 값' 이지만 false 는 아닙니다.
[] == [] // false
[] == ![] // true
두 개의 빈 배열은 같은 객체가 아니므로 동등하지 않습니다.
하지만 두번째 비교문은, 먼저 빈 배열은 '참이라고 볼 수 있는 값' 이라 ![] 는 false 입니다. == 연산자는 [] 와 false 둘 다 숫자가 아니지만 숫자처럼 비교하려 합니다. 빈 배열은 빈 문자열로 강제 (0 으로 강제) 되고 false 도 영(0) 으로 강제됩니다. 그래서 true 가 나오게 됩니다.
‣ + 자바스크립트의 + 연산자
== 연산자는 === 를 사용하면 되지만, + 연산자는 안쓸 순 없습니다.
[] + [] // ""
[] + {} // "[object Object]"
{} + {} // "[object Object][object Object]"
자바스크립트는 위 예제의 모든 경우에 대해 NaN 을 만듭니다. 피연산자가 숫자가 아니기 때문에 + 연산자는 이 둘을 연결합니다.
피연산자들이 모두 문자열로 강제되고, 그 과정에서 Array.prototype.toString() 메서드가 빈 배열을 빈 문자열로 변환합니다.
그리고 Object.prototype.toString() 메서드가 객체를 "[object Object]" 라고 표시합니다. 그래서 결과물이 저렇습니다.
‣ Number.MAX_SAFE_INTEGER
9999999999999999 // 10000000000000000
1e23 + 2e23 === 3e23 // false
Number.MAX_SAFE_INTEGER 보다 큰 정수는 제대로 표현되지 못합니다.
‣ 타입 강제
"2" < 5 // true
5 < "11" // true
"11" < "2" // true
서로 다른 타입을 비교하면 예외가 발생해야 하나, 자바스크립트는 그 대신 변환을 위해 값의 타입을 강제합니다.
‣ 문법적 에러
1 < 2 < 3 // true
3 > 2 > 1 // false
언어에서는 이런 표현을 제대로 처리할 수 없습니다.
첫 번째 경우 1 과 2를 비교한 것은 true 결과를 내고, true 와 3을 비교합니다. true 는 1로 강제되어 3보다 작아 true 가 나왔습니다.
두 번째 경우 3 과 2를 비교해 true 가 나오지만, true 는 1로 강제되어 1보다 작지 않기에 false 가 나옵니다.
‣ Math.min, Math.max
Math.min() > Math.max() // true
함수 자체가 엉성해서 Math.min() 은 Infinity, Math.max() 는 -Infinity 를 반환합니다.
‣ isNaN, isFinite
isNaN("this string is not NaN") // true
전역 isNaN 함수와 isFinite 함수는 잘못되었습니다. Number.isNaN 과 Number.isFinite 를 사용해야 합니다.
‣ 자동 세미콜론
자바스크립트의 자동 세미콜론 삽입 기능 때문에 행 구분에 따라 블록이 쓸모없는 표현식만 갖게 되는 경우가 생깁니다.
위의 이러한 경우들을 마주하지 않도록 항상 신경써서 자바스크립트 코드를 짜야 할 것입니다.
출처 : 자바스크립트는 왜 그 모양일까?
'Backend > Javascript' 카테고리의 다른 글
JavaScript - this 에 대해 (0) | 2021.07.03 |
---|---|
JavaScript - 프로토타입 (Prototype) 에 대해 (2) | 2021.06.26 |
[Javascript] - Transpiling (0) | 2021.02.14 |
[Javascript] - Optimization (0) | 2021.02.06 |
[Javascript] - Testing (0) | 2021.01.30 |