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 등) 에서 작동안함
자바스크립트의 암묵적인 타입 변환(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
모든 자바스크립트 값은 ture
나 false
로 변환될 수 있는 특성을 갖고 있습니다. true
로 형변환을 강제하는 것을 truthy
라고 합니다. 또 false
로 형변환을 강제하는 것을 falsy
라고 합니다.
falsy
로 취급되는 값들입니다. (이 외에는 전부 truthy
로 취급됩니다.)
NaN
은 자기 자신과도 같지 않은 특별한 숫자 값입니다. (NaN
은 자바스크립트에서 유일하게 자기 자신과 같지 않은 값입니다.)