본문 바로가기

Backend/Javascript

[Javascript] - Weakness

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