console.log([] instanceof Array); //true

console.log({} instanceof Array); //false

console.log({} instanceof Object); //true

console.log("" instanceof String); //false

// JavaScript WTF moment
typeof null //false (?)

primitive (string, boolean, number 등) 에서 작동안함

by leonardomso & jakeseo_me # #

4. Implicit, Explicit, Nominal, Structuring and Duck Typing

자바스크립트의 암묵적인 타입 변환(implicit coercion) 은 간단하게 말하자면 예상치 못한 타입을 받았을 때 예상 가능한 타입으로 바꿔준다고 생각하면 됩니다. 그로 인해 사용자는 숫자 값을 넘겨야 하는 곳에 문자열을 넣을 수도 있고 문자열을 넣어야 하는 곳에 객체를 넘길 수도 있습니다. 이러한 일이 발생했을 때 자바스크립트 엔진은 사용자가 잘못 넣은 타입을 올바른 타입으로 변환하려고 시도합니다. 이것은 자바스크립트의 주요한 기능 중 하나이며 가장 피해야 할 기능입니다.

3 * "3" // 9
1 + "2" + 1 // 121

true + true // 2
10 - true // 9

const foo = {
	valueOf: () => 2
}
3 + foo // 5
4 * foo // 8

const bar = {
	toString: () => " promise is a boy :)"
}

1 + bar // "1 promise is a boy :)"

4 * [] // 0
4 * [2] // 8
4 + [2] // "42"
4 + [1, 2] // "41, 2"
4 * [1, 2] // NaN

"string" ? 4 : 1 // 4
undefined ? 4 : 1 // 1

문자열

사용자가 숫자 표현식에서 문자열(-, *, /, %을 포함한 문자열)을 피연산자로 넘겼을 때마다 숫자의 암묵적 타입변환 프로세스는 문자열을 인자로 자바스크립트 내부에 내장된 Number 함수를 불러오는 것과 비슷합니다. 이것은 꽤나 직관적입니다. 숫자 문자(Numeric Characters)를 가졌다면 어떤 문자열이라도 동등한 숫자로 바뀝니다. 하지만 만일 문자열에 숫자가 아닌 것(Non-Numeric Characters)이 포함되어 있으면 NaN을 리턴하게 됩니다. 아래 코드의 결과를 잘 보세요.

3 * "3" // 3 * 3
3 * Number("3") // 3 * 3
Number("5") // 5

Number("1.") // 1
Number("1.34") // 1.34
Number("0") // 0
Number("012") // 12

Number("1,") // NaN
Number("1+1") // NaN
Number("1a") // NaN
Number("la") // NaN
Number("one") // NaN
Number("text") // NaN

배열 객체

배열에서 상속된 toString 메소드는 약간 다르게 동작합니다. 이것은 배열에서 아무런 인자도 넣지 않은 join 메소드를 호출한 것과 비슷한 방식으로 작동하게 됩니다.

[1, 2, 3].toString() // "1,2,3"
[1, 2, 3].join() // "1,2,3"
[].toString() // ""
[].join() // ""

"me" + [1,2,3] // "me1,2,3"
4 + [1,2,3] // "41,2,3"
4 * [1,2,3] // NaN

Falsy와 Truthy

모든 자바스크립트 값은 turefalse로 변환될 수 있는 특성을 갖고 있습니다. true로 형변환을 강제하는 것을 truthy라고 합니다. 또 false로 형변환을 강제하는 것을 falsy라고 합니다.

NaN

NaN은 자기 자신과도 같지 않은 특별한 숫자 값입니다. (NaN은 자바스크립트에서 유일하게 자기 자신과 같지 않은 값입니다.)