Skip to content

Commit

Permalink
[posts update]: 2024-09-21 21:34:29 | changed: 1
Browse files Browse the repository at this point in the history
  • Loading branch information
logone72 committed Sep 21, 2024
1 parent 15e6261 commit 08c84bd
Showing 1 changed file with 7 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*javascript의 유명한 특이 동작들. 이 글에서는 위 사진에는 없는 경우들을 다룬다.*



javascript는 우리에게 익숙한 언어지만, 그 속에는 알아두면 유용하지만 쉽게 간과할 수 있는 동작들이 숨어 있다. 어떤 것들은 너무 당연하게 느껴져서 별다른 고민 없이 지나치기도 하고, 또 다른 것들은 특정 상황에서만 드러나기 때문에 한 번도 문제를 겪지 않았다면 알기 어려울 수도 있다. 이번 글에서는 **알면 뻔하지만 몰랐다면 계속 모를 수도 있는 자바스크립트의 동작**들을 살펴보려고 한다.


Expand All @@ -17,14 +18,16 @@ javascript는 우리에게 익숙한 언어지만, 그 속에는 알아두면

결론부터 말하자면, **배열에 비교 연산자가 적용되면 배열이 문자열로 변환되어 비교가 이루어지기 때문**이다.


### 상세

javascript 의 비교 연산자(`>`, `<`, `>=`, `<=`)는 숫자뿐만 아니라 문자열을 비교하는 데도 사용할 수 있다. 만약 비교 연산자의 피연산자 중 하나가 객체라면, javascript 는 이를 원시 값으로 변환하려고 시도하는데, 이때 비교연산자의 경우 **숫자 우선 변환 알고리즘**(prefer-number algorithm)이 적용된다.
javascript 의 비교 연산자(`>`, `<`, `>=`, `<=`)는 숫자뿐만 아니라 다른 값들을 비교하는 데도 사용할 수 있다. 만약 비교 연산자의 피연산자 중 하나가 객체라면, javascript 는 이를 원시 값으로 변환하려고 시도하는데, 이때 비교연산자의 경우 **숫자 우선 변환 알고리즘(prefer-number algorithm)**이 적용된다.

숫자 우선 변환 알고리즘은 먼저 객체의 `.valueOf()` 메서드를 호출한다. 만약 반환된 값이 원시 값(숫자, 문자열 등)이면 그 값이 사용된다. 그러나 대부분의 경우 배열의 `.valueOf()` 메서드는 배열 객체 자체를 반환한다. 이 경우, 자바스크립트는 자동으로 `.toString()` 메서드를 호출하여 배열을 문자열로 변환한다.

결과적으로, **배열이 비교 연산자의 피연산자로 사용될 경우 `.valueOf()` 메서드가 먼저 호출되고, `.toString()` 메서드가 호출되어 배열이 문자열로 변환**된다.


### 예시

예를 들어 `[1] > [2]`를 비교할 때는 `'1' > '2'`를 비교하는 것과 같고, `[1,2] > [1,1]`을 비교할 때는 `'1,2' > '1,1'`를 비교하는 것이 된다.
Expand Down Expand Up @@ -119,13 +122,14 @@ NaN !== NaN // true

즉, `NaN`은 어떤 값과 비교해도 항상 `false`를 반환하므로, `NaN !== NaN` 역시 `true`가 된다. 따라서, javascript에서 `x !== x``true`로 평가되는 특별한 경우는 바로 `NaN`일 때이다. 이로 인해 `x !== x`가 true인 흥미로운 결과를 얻게 된다.

마지막으로, NaN을 NaN과 일치하는지 비교를 할 때 true 가 반환되는 방법을 소개한다.

마지막으로, `NaN``NaN`과 일치하는지 비교를 할 때 `true` 가 반환되는 방법을 소개한다.

```js
Object.is(NaN, NaN) // true
```

`Object.is()``==` , `===` 와 다른 점 중 하나이다. `Object.is()``==`처럼 여러 강제가 있지도 않고, `===`와 다르게 NaN 을 동일하게 비교한다.
`Object.is()``==` , `===` 와 다른 점 중 하나이다. `Object.is()``==`처럼 여러 강제가 있지도 않고, `===`와 다르게 `NaN` 을 동일하게 비교한다.


## 자료 출처
Expand Down

0 comments on commit 08c84bd

Please sign in to comment.