JavaScript type coercion explained Know your - Lee-hyuna/33-js-concepts-kr GitHub Wiki
[2018λ 5μ 2μΌμ μμ λ¨]:μ΄ κΈμ available in Russianμ κΈμ΄λ€. Serj Bulavykμ λ Έλ ₯μ λ°μλ₯Ό ...
νμ λ³νμ ν νμ μμ λ€λ₯Έ νμ (λ¬Έμμ΄μμ μ«μ, objectμμ boolean λ±)μΌλ‘ κ°μ λ³ν νλ κ³Όμ μ΄λ€. μμμ μ΄λ objectμ΄λ μ΄λ€ νμ μ΄λ νμ λ³νμ λμμ΄ λλ€. νΈμΆ νκΈ° μν΄μλ μμ νμ λ€μ number, string, boolean, null, undefined, ES6μ μΆκ°λ Symbolμ΄λ€.
νμ
λ³νμ μ€μ§μ μΈ μλ₯Ό λ€μλ©΄, λμ¨ν λλ± μ°μ°μ a
μ b
μ νμ
μ λν΄ μ΄λ»κ² μ μ©λλμ§ λ³΄μ¬μ£Όλ JavaScript Comparison Tableλ₯Ό 보λΌ. μ΄ νλ ==
μ°μ°μκ° μ묡μ μΈ νμ
μ νλ³νμΌλ‘ μΈν΄ νΌλμ μ£Όκ³ μ΄λ¬ν μ‘°ν©λ€μ λͺ¨λ κΈ°μ΅νκΈ°λ νλ€λ€. (scaryλ₯Ό νΌλμ μ€λ€κ³ μμν¨...) κ·Έλ κ² ν νμ μκ³ , κ·Έλ₯ κΈ°λ³Έμ μΈ νμ
μ νμ
λ³νμ μ리λ₯Ό λ°°μ°κΈ°λ§ νλ©΄ λλ€.
μ΄ κΈμ μλ°μ€ν¬λ¦½νΈμ νμ λ³νμ΄ μ΄λ»κ² μμ©νλμ§ μ¬μΈ΅μ μΌλ‘ μ€λͺ νλ©°, νμμ μΈ μ§μμΌλ‘ 무μ₯ μμΌμΌμ£Όλ―λ‘, λ€μκ³Ό κ°μ ννλ€μ΄ μ΄λ€ μ°μ°μ νλμ§ μ€λͺ νλ μμ κ°μ λλ μ μμ κ²μ΄λ€. κΈ°μ¬κ° λλ λκΉμ§ λλ λ΅μ 보μ¬μ£Όκ³ μ€λͺ μ νκ² λ€.
true + false
12 / "6"
"number" + 15 + 3
15 + 3 + "number"
[1] > null
"foo" + + "bar"
'true' == true
false == 'false'
null == ''
!!"false" == !!"true"
[βxβ] == βxβ
[] + null + 1
[1,2,3] == [1,2,3]
{}+[]+{}+[1]
!+[]+[]+![]
new Date(0) - 0
new Date(0) + 0
κ·Έλ μμ μ½λλ€μ κ°λ°μλ‘μ ν μ μλ κ½€ μ΄λ¦¬μμ κ²(μ€μ)λ€μ΄λ€. μ΄ μ¬λ‘λ€μ 90%μμλ μ묡μ μΈ ννμ νμ λ³νμ κ°μ μ±μ νΌνλ κ²μ΄ μ’μ. μμ μ½λλ€μ νμ λ³νμ΄ μ΄λ»κ² μμ©νλμ§ λΉμ μ μ§μμ μννκΈ° μν νμ΅μΌλ‘ ν΄λ΄. μ§λ£¨νλ©΄ wtfjs.comμμ λ λ§μ μλ₯Ό μ°Ύμ μ μμ΄.
κ·Έλ°λ° λλλ‘ Javascript κ°λ°μ μ§μ± μ λν λ©΄μ μΌλ‘ νμ λ³νμ λν΄ μ§λ¬Έμ λ°μ μ μμΌλ κ³μ μ½μ΄ π
νμ λ³νμ μ묡μ μ΄κ±°λ λͺ μμ μΌ μ μλ€.
κ°λ°μκ° Number(value)
μ²λΌ μ μ ν μ½λλ₯Ό μμ±νμ¬ μ ν κ°μ λ³νν μλλ₯Ό λνλΌ λ λͺ
μμ νλ³ν (λλ νμ
μΊμ€ν
)μ΄λΌκ³ λΆλ₯Έλ€.
μλ°μ€ν¬λ¦½νΈλ νμ μ λμ¨ν μΈμ΄(weakly-typed languageλ₯Ό νμ μ λμ¨ν μΈμ΄λΌκ³ λ²μν¨)μ΄κΈ° λλ¬Έμ κ°λ μλμΌλ‘ λ€λ₯Έ νμ κ°μ λ³ν λ μ μμΌλ©°, μ묡μ λ³νμ΄λΌκ³ νλ€. μ°μ°μλ₯Ό λ€λ₯Έ νμ μ κ°μ μ μ©ν λ μ£Όλ‘ λ°μνλ€.
1 == null
, 2/'5'
, null + new Date()
λλ if (value) {β¦}
μ²λΌ μ£Όλ³ μ»¨ν
μ€νΈμ μν΄ value
μ΄ booleanμΌλ‘ νλ³νμ΄ μΌμ΄λλ€.
μ묡μ νλ³νμ΄ λ°μνμ§ μμ μ°μ°μλ μ격ν λλ±μ°μ°μλ‘ λΆλ¦¬λ ===
μ΄λ€. λ°λ©΄ λμ¨ν λλ±μ°μ°μλ ==
μ λΉκ΅νκ³ νμνλ€λ©΄ νμ
νλ³νμ΄ μΌμ΄λλ€.
μ묡μ νλ³νμ double edge swordμ΄λ€. μ΄κ²μ μ’μ κ³Ό κ²°ν¨μ νλ₯ν μμ²μ΄μ§λ§ λν νλ³μ±μ μμ§ μκ³ μ½λλ₯Ό μ κ² μΈ μ μκ² ν΄μ£Όλλ° μ μ©ν λ©μ»€λμ¦μ΄λ€.
μλ°μ€ν¬λ¦½νΈμλ μΈκ°μ§ λ³ν νμ μ΄ μλ€λ κ²μ μμΌνλ€.
- to string
- to boolean
- to number
λμ§Έλ‘ μμνμ κ³Ό objectμ λν λ³ν λ‘μ§μ λ€λ₯΄κ² μμ©νμ§λ§, μμνμ κ³Ό object λͺ¨λ μ΄ μΈκ°μ§ λ°©λ²μΌλ‘ λ³νλ μ μλ€.
μμ νμ λΆν° μμνμ !
κ°μ λ¬Έμμ΄λ‘ λͺ
μμ μΌλ‘ λ³ννλ €λ©΄ String()
μ μ¬μ©νλ€. μ묡μ νλ³νμ λ€μκ³Ό κ°μ λ¬Έμμ΄μΌ λ μ΄μ§ μ°μ°μ +
μ μν΄ μΌμ΄λλ€.
String(123) // explicit
123 + '' // implicit
λͺ¨λ μμ κ°μ μμλλ‘ μμ°μ€λ½κ² λ¬Έμμ΄λ‘ λ³νλλ€.
String(123) // '123'
String(-12.3) // '-12.3'
String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
String(false) // 'false'
Symbol conversion is a bit tricky, because it can only be converted explicitly, but not implicitly. Read more on Symbol
coercion rules.
Symbol λ³νμ λͺ
μμ μΌλ‘ λ³νν μ μμ λΏ, μ묡μ μΌλ‘λ λ³νν μ μκΈ° λλ¬Έμ μ½κ° κΉλ€λ‘λ€.Symbol
κ·μΉμ κ΄λ ¨ν κ²μ https://leanpub.com/understandinges6/read/#leanpub-auto-symbol-coercion μ νλ² μ½μ΄λ³΄λΌ.
String(Symbol('my symbol')) // 'Symbol(my symbol)'
'' + Symbol('my symbol') // TypeError is thrown
κ°μ BooleanμΌλ‘ λͺ
μμ μΌλ‘ λ³ννλ €λ©΄ Boolean()
μ μ μ©νλ€. μμμ νλ³νμ λ
Όλ¦¬μ μΈ λ§₯λ½μμ λ°μνκ±°λ, λ
Όλ¦¬μ°μ°μ( ||
&&
!
)μ μν΄ μΌμ΄λλ€.
Boolean(2) // explicit
if (2) { ... } // implicit due to logical context
!!2 // implicit due to logical operator
2 || 'hello' // implicit due to logical operator
μ°Έκ³ : ||
μ &&
κ³Ό κ°μ λ
Όλ¦¬ μ°μ°μλ λ΄λΆμ μΌλ‘ boolean νλ³νμ νμ§λ§ μ€μ λ‘λ booleanμ΄ μλλλΌλ μλμ νΌμ°μ°μμ κ°μ λ°ννλ€.
// returns number 123, instead of returning true
// 'hello' and 123 are still coerced to boolean internally to calculate the expression
let x = 'hello' && 123; // x === 123
boolean λ³νμ κ²°κ³Όκ° true
λλ false
μ΄ λκ°μ§ λΏμ΄λ©°, κ±°μ§ κ°μ κ°λ€μ λν λͺ©λ‘μ μ½κ² κΈ°μ΅ν μ μλ€.
Boolean('') // false
Boolean(0) // false
Boolean(-0) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(false) // false
μμ μ½λλ€μ μλ κ°μ object, function, Array
, Date
, user-defined type λ± μ§μ§ κ°μ true
λ‘ λ°ννλ€. Symbolμ μ°Έ κ°μ κ°μ΄μ΄λ€. λΉ objectμ arrayλ μ°Έ κ°μ κ°μ΄λ€.
Boolean({}) // true
Boolean([]) // true
Boolean(Symbol()) // true
!!Symbol() // true
Boolean(function() {}) // true
λͺ
μμ μΌλ‘ λ³ννκΈ° μν΄μλ Boolean()
μ String()
μ κ°μ΄ Number()
μ μ¬μ©νλ€.
λ λ§μ μΌμ΄μ€μμ μΌμ΄λκΈ° λλ¬Έμ μμμ νλ³νμ κΉλ€λ‘λ€.
- λΉκ΅μ°μ°μλ€ (
>
,<
,<=
,>=
) - λΉνΈμ°μ°μλ€ (
|
&
^
~
) - μ°μ μ°μ°μλ€(
-
+
*
/
%
). μ°Έκ³ , μ΄μ§ μ°μ°μ +λ λ¬Έμμ΄μ λ§λλ©΄ μ«μνλ³νμ΄ μΌμ΄λμ§ μλλ€. - unary
+
operator - λμ¨ν λλ±μ°μ°μ
==
(incl.!=
).
μ°Έκ³ : ==
μ λκ°μ λΉκ΅κ° λ¬Έμμ΄μΌ λ μ«μ νλ³νμ μΌμ΄λμ§ μλλ€.
Number('123') // explicit
+'123' // implicit
123 != '456' // implicit
4 > '5' // implicit
5/null // implicit
true | 0 // implicit
μ¬κΈ°μ μμκ°μμ μ«μλ‘ λ³ννλ λ°©λ²μ λ€μκ³Ό κ°λ€.
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Number(" 12 ") // 12
Number("-12.34") // -12.34
Number("\n") // 0
Number(" 12s ") // NaN
Number(123) // 123
λ¬Έμμ΄μ μ«μλ‘ λ³νν λ μμ§μ λ¨Όμ λ°±μ€νμ΄μ€, \n
, \t
λ¬Έμμ΄μ μλΌμ μλΌλΈ λ¬Έμμ΄μ΄ μ ν¨ν μ«μλ₯Ό λνλ΄μ§ μμΌλ©΄ NaN
μ λ°ννλ€. λ¬Έμμ΄μ΄ λΉμ΄ μμΌλ©΄ 0
μ λ°ννλ€.
null
and undefined
μ λ€λ₯΄κ² λ€λ€μ§λλ°, null
μ 0
μ΄ λκ³ , undefined
μ NaN
μ΄ λλ€.
Symbolsμ λͺ
μμ μΌλ‘λ μ묡μ μΌλ‘ μ«μλ‘ λ³νν μ μλ€. κ²λ€κ° TypeError
λ undefined
μ²λΌ NaN
μΌλ‘ λ³νλμ΄ μ§λ€. (Moreover, TypeError
is thrown, instead of silently converting to NaN
, like it happens for undefined
.)
Symbolμ λ³νμ κ·μΉμ MDNμμ λ λ§μ΄ λμ μλ€.
Number(Symbol('my symbol')) // TypeError is thrown
+Symbol('123') // TypeError is thrown
λκ°μ§ νΉλ³ν λ£°μ΄ μλ€λ κ²μ κΈ°μ΅νλΌ.
1.null
λλ undefined
μ ==
μ μ μ©νλ©΄ μ«μ λ³νμ μΌμ΄λμ§ μλλ€. null
μ null
λλ undefined
μ ν΄λΉνλ©° λ€λ₯Έ μ΄λ€ κ²κ³Ό κ°μ§ μλ€.
null == 0 // false, null is not converted to 0
null == null // true
undefined == undefined // true
null == undefined // true
-
NaN
μ κ·Έ μ체μλ λΉκ΅κ° λμ§ μλλ€.
if (value !== value) { console.log("we're dealing with NaN here") }
μ§κΈκΉμ§ μμκ°μ λν νμ νλ³νμ μ΄ν΄λ³΄μλ€. λ³λ‘ ν₯λ―Έλ‘μ§ μμ.
objectμ μμ§μ΄ [1] + [2,3]
κ³Ό κ°μ ννμ΄ μμ λλ λ¨Όμ objectμ μμκ°μ λ³νν λ€μ μ΅μ’
νμ
μΌλ‘ λ³νν΄μΌνλ€. κ·Έλ¦¬κ³ μ¬μ ν μ«μ, λ¬Έμμ΄, booleanμ μΈκ°μ§ λ³ν μ νλ§ μλ€.
κ°μ₯ κ°λ¨ν κ²½μ°λ boolean νλ³νμ΄λ€. λΉ μμκ°μ νμ objectμ΄λ λ°°μ΄μ΄λ κ°μ true
μ μν΄ λ³νμ΄ λλ€.
objectλ μ«μ λ° λ¬Έμμ΄ λ³νμ λͺ¨λ λ΄λΉνλ λ΄λΆ [[ToPrimitive]]
μ ν΅ν΄ μμ μνλ‘ λ³νλλ€.
λ€μμ [[ToPrimitive]]
μ λ©μλμ μν μλ μ½λμ΄λ€.
function ToPrimitive(input, preferredType){
switch (preferredType){
case Number:
return toNumber(input);
break;
case String:
return toString(input);
break
default:
return toNumber(input);
}
function isPrimitive(value){
return value !== Object(value);
}
function toString(){
if (isPrimitive(input.toString())) return input.toString();
if (isPrimitive(input.valueOf())) return input.valueOf();
throw new TypeError();
}
function toNumber(){
if (isPrimitive(input.valueOf())) return input.valueOf();
if (isPrimitive(input.toString())) return input.toString();
throw new TypeError();
}
}
js-to-primitive-internal.js
[[ToPrimitive]]
μ input valueκ³Ό preferred typeμ Number
μ String
μΌλ‘ κ°μ΄ μ λ¬λλ©° preferredTypeμ 쑰건μ optionalν λΆλΆμ΄λ€.
μ«μ νλ³νκ³Ό λ¬Έμμ΄ λ³ν λͺ¨λ input ojbectμ valueOf
μ toString
μ΄ λκ°μ§ λ©μλλ₯Ό μ¬μ©νλλ°, λκ°μ§ λ©μλλ λͺ¨λ Object.prototype
μ λͺ
μλμ΄ μμ΄ Date
, Array
λ± νμλ νμ
μμ μ¬μ©ν μ μλ€.
μλλ μΌλ°μ μΈ μκ³ λ¦¬μ¦μ΄λ€.
-
inputμ΄ μ΄λ―Έ μμμ μ΄λΌλ©΄, μ무 κ²λ νμ§ μκ³ λ°νλλ€.
-
input.toString()
μ΄ νΈμΆλλ©΄, κ·Έ κ²°κ³Όκ° μμμ μ΄λΌλ©΄ λ°ννλ€. -
input.valueOf()
μ΄ νΈμΆλλ©΄, κ·Έ κ²°κ³Όκ° μμμ μ΄λΌλ©΄ λ°ννλ€. -
input.toString()
μ΄λinput.valueOf()
μ΄ μμμ μ΄μ§ μλ€λ©΄TypeError
λ₯Ό λ°ννλΌ.
μ«μ νλ³νμ μ°μ valueOf
(3)μ νΈμΆνκ³ , toString
(2) νΈμΆνλ€. λ¬Έμνλ³νμ toString
(2)μ νΈμΆν ν valueOf
(3) νΈμΆνμ¬ μ«μ λ³νκ³Ό λ¬Έμν λ³νμ λ°λμ΄λ€.
λλΆλΆμ λΉνΈμΈλ νμ
μ valueOf
μ΄ μκ±°λ this
λ objectλ₯Ό λ°ννλ valueOf
κ° μμ΄μ μμμ μΈ κ²μ΄ μλλ―λ‘ λ¬΄μλκ³ μλ€. κ·Έλ κΈ° λλ¬Έμ μ«μμ λ¬Έμμ΄ λ³ν λͺ¨λ toString()
μ΄λΌκ³ λΆλ₯΄λ κ²μΌλ‘ λλ μ μλ€.
λ€λ₯Έ μ°μ°μλ preferredType
νλΌλ―Έν°μ λμμ λ°μ μ«μ λλ λ¬Έμμ΄ λ³νμ μΌμΌν¬ μ μλ€. κ·Έλ¬λ ==
μ μ΄μ§ μ°μ°μ+
λ default
λ³ν μνλ₯Ό μΌμΌν€λ λκ°μ§ κ²½μ°μ΄λ€. μ΄ κ²½μ° λ¬Έμμ΄ λ³νμ νλ Date
μ μ μΈνκ³ λλΆλΆμ λ΄μ₯λ νμ
μ μ«μ λ³νμ defaultλ‘ κ°μ νλ€.
Date
μ λ³νμ μμ΄λ€.
let d = new Date();
// get string representation
let str = d.toString(); // 'Wed Jan 17 2018 16:15:42'
// get numeric representation, num of milliseconds since Unix epoch
let num = d.valueOf(); // 1516198542525
// compare with a string representation
// true because d is converted to same string
console.log(d == str); // true
// compare with numeric representation
// false, because d is not converted to a number via valueOf()
console.log(d == num); // false
// Result is 'Wed Jan 17 2018 16:15:42Wed Jan 17 2018 16:15:42'
// '+' same to '==' triggers default conversion mode
console.log(d + d);
// Result is 0, since '-' operator explicitly triggers numeric conversion, not a default one
console.log(d - d);
date-object-to-primitive-conversion.js
objectμμ μμκ°μΌλ‘ νλ³ν λ‘μ§μ hookμ μν΄ toString()
κ³Ό valueOf()
λ©μλμ κΈ°λ³Έκ°μ overrideν μ μλ€.
var obj = {
prop: 101,
toString(){
return 'Prop: ' + this.prop;
},
valueOf() {
return this.prop;
}
};
console.log(String(obj)); // 'Prop: 101'
console.log(obj + '') // '101'
console.log(+obj); // 101
console.log(obj > 100); // true
view raw
es5-toprimitive-hooks.js
obj + ββ
κ° μ΄λ»κ²β101β
μ λ¬Έμμ΄λ‘ λ°ννλμ§ μ£Όλͺ©νλΌ.+
μ°μ°μλ κΈ°λ³Έ λ³ν λͺ¨λλ₯Ό μΌμΌμΌ μμ λ§ν κ²μ²λΌObject
μ μ«μ νλ³νμ λν΄νΈλ‘ κ°μ νμ¬toString()
μ΄ μλvalueOf()
λ©μλλ₯Ό λ¨Όμ μ¬μ©νλ€.
ES5μμλ toString
μ valueOf
λ©μλ overridingμ μν΄ μ€λΈμ νΈμμ μμκ°μΌλ‘ hook ν μ μλ€.
ES6μμλ objectμ [Symbol.toPrimtive]
λ©μλλ₯Ό μ¬μ©νλ©΄ λ΄λΆ [[ToPrimitive]]
μ 루ν΄μ μμ ν λ체νμ¬ μ¬μ©ν μ μμ΅λλ€.
class Disk {
constructor(capacity){
this.capacity = capacity;
}
[Symbol.toPrimitive](hint){
switch (hint) {
case 'string':
return 'Capacity: ' + this.capacity + ' bytes';
case 'number':
// convert to KiB
return this.capacity / 1024;
default:
// assume numeric conversion as a default
return this.capacity / 1024;
}
}
}
// 1MiB disk
let disk = new Disk(1024 * 1024);
console.log(String(disk)) // Capacity: 1048576 bytes
console.log(disk + '') // '1024'
console.log(+disk); // 1024
console.log(disk > 1000); // true
view raw
es6-symbol-toprimitive.js
μ΄λ¬ν μ΄λ‘ μ΄ μ μ©λμ΄ μλ λ€μμ μλ₯Ό λ€μ΄λ³΄μ.
true + false // 1
12 / "6" // 2
"number" + 15 + 3 // 'number153'
15 + 3 + "number" // '18number'
[1] > null // true
"foo" + + "bar" // 'fooNaN'
'true' == true // false
false == 'false' // false
null == '' // false
!!"false" == !!"true" // true
['x'] == 'x' // true
[] + null + 1 // 'null1'
[1,2,3] == [1,2,3] // false
{}+[]+{}+[1] // '0[object Object]1'
!+[]+[]+![] // 'truefalse'
new Date(0) - 0 // 0
new Date(0) + 0 // 'Thu Jan 01 1970 02:00:00(EET)0'
μλμμλ κ°κ°μ ννμ λν μ€λͺ μ μ°Ύμ μ μμ΅λλ€.
μ΄μ§μ°μ°μ +
λ true
μ false
μ μ«μ λ³νμ μΌμΌν¨λ€.
true + false
==> 1 + 0
==> 1
μ°μ μ°μ°μ /
λ λ¬Έμμ΄ '6'
μ μ«μ λ³νμ μΌμΌν¨λ€.
12 / '6'
==> 12 / 6
==>> 2
μ°μ°μ +
λ left-to-rightμΌλ‘ μ°κ΄μ΄ μκΈ° λλ¬Έμ(μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ μ°μ°μ μ§ννλ€ λλ...) "number" + 15
μ΄ λ¨Όμ λμ¨λ€. ν νΌμ°μ°μλ λ¬Έμμ΄μ΄κΈ° λλ¬Έμ +
μ°μ°μλ μ«μ 15μ λν λ¬Έμμ΄ λ³νμ μΌμΌν¨λ€. λλ²μ§Έ λ¨κ³ expressionμ "number15" + 3
λ 첫λ²μ§Έμ μ μ¬νκ² λΉκ΅κ° λλ€.
βnumberβ + 15 + 3
==> "number15" + 3
==> "number153"
15 + 3
μ΄ λ¨Όμ λΉκ΅κ° λλ€. λ νΌμ°μ°μλ λͺ¨λ μ«μμΈ λ§νΌ κ°μν νμλ μ ν μλ€. λλ²μ§Έ λ¨κ³ μμλ 18 + 'number'
μ΄ λ¨Όμ λΉκ΅κ° λλ©°, νλμ νΌμ°μ°μλ λ¬Έμμ΄μ΄κΈ° λλ¬Έμ λ¬Έμμ΄ λ³νμ μΌμΌν¨λ€.
15 + 3 + "number"
==> 18 + "number"
==> "18number"
λΉκ΅ μ°μ°μ >
μ [1]
κ³Ό null
λ‘ μ«μ λ³νμ μΌμΌν¨λ€.
[1] > null
==> '1' > 0
==> 1 > 0
==> true
Unary +
μ°μ°μλ μ΄μ§μ°μ°μ +
λ³΄λ€ μ°μ μμκ° λλ€. κ·Έλμ +'bar'
κ° λ¨Όμ λΉκ΅κ° λλ€. Unary +
λ λ¬Έμμ΄ 'bar'
μ μ«μ λ³νμ μΌμΌν¨λ€.λ¬Έμμ΄μ΄ μ ν¨ν μ«μλ₯Ό λνλ΄μ§ λͺ»νκΈ° λλ¬Έμ κ²°κ³Όλ NaN
μ΄λ€. λλ²μ§Έ λ¨κ³μμλ 'foo' + NaN
μ΄ λΉκ΅κ° λλ€.
"foo" + + "bar"
==> "foo" + (+"bar")
==> "foo" + NaN
==> "fooNaN"
==
μ μ«μν λ³νμ μΌμΌν€κ³ , λ¬Έμμ΄ 'true'
μ μ λΆ NaNμΌλ‘ λ³νλμ΄ boolean true
μ 1λ‘ λ³νλλ€.
'true' == true
==> NaN == 1
==> false
false == 'false'
==> 0 == NaN
==> false
==
μ λ³΄ν΅ μ«μ λ³νμ μΌμΌν€μ§λ§,null
μ κ²½μ°λ κ·Έλ μ§ μλ€. null
μ null
λλ undefined
μ΄κ³ , λ€λ₯Έ μ΄λ€ κ²κ³Όλ κ°μ§ μλ€.
null == ''
==> false
!!
μ°μ°μλ 'true'
μ 'false'
λκ°μ§ λ¬Έμμ΄μ trueλ‘ λ³ννλλ°, μ΄λ λΉμ΄ μμ§ μμ λ¬Έμμ΄μ΄κΈ° λλ¬Έμ΄λ€. κ·Έλ¬κ³ λμ ==
μ true
λΌλ λ κ°μ booleanμ μλ¬΄λ° νλ³νμμ΄ κ°μμ§λ§ 체ν¬νλ€.
!!"false" == !!"true"
==> true == true
==> true
==
μ°μ°μλ λ°°μ΄μ μ«μ λ³νμ μΌμΌν¨λ€. λ°°μ΄μ valueOf()
λ©μλλ λ°°μ΄ μ체λ₯Ό λ°ννμ¬ μμμ μΈ κ²μ΄ μλκΈ° λλ¬Έμ 무μλκ³ μλ€. λ°°μ΄μ toString()
μ ['x']
μ 'x'
λ¬Έμμ΄λ‘ λ³ννλ€.
['x'] == 'x'
==> 'x' == 'x'
==> true
+
μ°μ°μλ []
μ λν μ«μ λ³νμ μΌμΌν¨λ€. λ°°μ΄μ valueOf()
λ©μλλ κΈ°λ³Έμ΄ μλ λ°°μ΄ μ체λ₯Ό λ°ννκΈ° λλ¬Έμ 무μλκ³ μλ€. λ°°μ΄μ toString
μ λΉ λ¬Έμμ΄μ λ°ννλ€.
λλ²μ§Έ λ¨κ³μμλ '' + null + 1
μΌλ‘ λΉκ΅κ° λλ€.
[] + null + 1
==> '' + null + 1
==> 'null' + 1
==> 'null1'
λ
Όλ¦¬μ μΈ ||
μ &&
μ°μ°μλ booleanμΌλ‘ νλ³νμ΄ λμ§λ§ μλμ νΌμ°μ°μλ λ°ννμ§ μλλ‘ νλ€. 0
μ κ±°μ§ κ°μ κ°μΈ λ°λ©΄ '0'
μ μ°Έ κ°μ κ°μ΄λ€. μλνλ©΄ λΉ λ¬Έμμ΄μ΄ μλκΈ° λλ¬Έμ΄λ€. {}
μ λΉ objectμ μμ μ°Έ κ°μ κ°μ΄λ€.
0 || "0" && {}
==> (0 || "0") && {}
==> (false || true) && true // internally
==> "0" && {}
==> true && true // internally
==> {}
λ νΌμ°μ°μμ νμ
μ΄ λμΌνκΈ° λλ¬Έμ νλ³νμ νμνμ§ μλλ€. ==
μ objectμ λμΌμ±μ΄ μλλΌ objectμ identityμ(my think's ... objectμ identityλ 무μμΌκΉ...) νμΈνλ κ²κ³Ό λ λ°°μ΄μ΄ μλ‘ λ€λ₯Έ κ²½μ°μ΄κΈ° λλ¬Έμ κ·Έ κ²°κ³Όλ false
μ΄λ€.
[1,2,3] == [1,2,3]
==> false
λͺ¨λ νΌμ°μ°μλ μμκ°μ΄ μλλ―λ‘ +
λ κ°μ₯ μΌμͺ½μ μλ μ«μ λ³νμΌλ‘ λΆν° μμνλ€. Objectβs
μ Arrayβs
μ valueOf
λ©μλλ objectμ체λ₯Ό λ°ννκΈ° λλ¬Έμ 무μλκ³ μλ€. toString()
μ fallbackμΌλ‘ μ¬μ©λλ€. μ¬κΈ°μ trickμ 첫λ²μ§Έλ‘ {}
μ λ¬Έμ κ·Έλλ‘κ° μλλΌ λΈλ‘ μ μΈλ¬Έμ²λΌ μ¬κ²¨μ Έ 무μλλ€λ κ²μ΄λ€. κ·Έλμ λΉκ΅λ toString()
λ©μλλ₯Ό ν΅ν΄ λΉ λ¬Έμμ΄λ‘ λ³νλ λ€μ +[]
μμμ μμλμ΄ 0
μΌλ‘ λ³νλλ€.
{}+[]+{}+[1]
==> +[]+{}+[1]
==> 0 + {} + [1]
==> 0 + '[object Object]' + [1]
==> '0[object Object]' + [1]
==> '0[object Object]' + '1'
==> '0[object Object]1'
μ΄κ²μ μ°μ°μ μ°μ μμμ λ°λΌ μ°¨κ·Όμ°¨κ·Ό μ€λͺ νλ κ²μ΄ μ’λ€.
!+[]+[]+![]
==> (!+[]) + [] + (![])
==> !0 + [] + false
==> true + [] + false
==> true + '' + false
==> 'truefalse'
-
μ°μ°μλ μ«μ νλ³νμ μΌμΌν¨λ€. Date
. Date.valueOf()
μ μ λμ€ μ΄ν μ λ°λ¦¬μ΄λ₯Ό λ°ννλ€.
new Date(0) - 0
==> 0 - 0
==> 0
+
μ°μ°μλ κΈ°λ³Έμ μΈ λ³νμ μΌμΌν€κ³ , Dateλ λ¬Έμμ΄ νλ³νμ κΈ°λ³ΈμΌλ‘ κ°μ νκΈ° λλ¬Έμ valueOf()
κ° μλλΌ toString()
λ©μλκ° μ¬μ©λλ€.
new Date(0) + 0
==> 'Thu Jan 01 1970 02:00:00 GMT+0200 (EET)' + 0
==> 'Thu Jan 01 1970 02:00:00 GMT+0200 (EET)0'
Nicholas C. Zakasκ° μ΄ Understanding ES6 μ± μ΄ κ°μ₯ μ μ°μ¬μ‘λ€κ³ μΆμ²νλ€. μ΄ μ± μ λ무 λμ λ λ²¨μ΄ μλλΌ νλ₯ν ES6 νμ΅ μλ£λ‘ λ΄μ€μ λ무 λ§μ΄ νκ³ λ€μ§ μλλ€.
Axel Rauschmayerμ΄ μ΄ SpeakingJSμ ES5λ₯Ό μ΅νκΈ°μ μ’λ€.
(Russian) Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΡΠ΅Π±Π½ΠΈΠΊ Javascriptβββhttps://learn.javascript.ru/. μ΄ κ²μ νμ νλ³νμ λν λ νμ΄μ§κ° μλ€.
JavaScript Comparison Tableβββhttps://dorey.github.io/JavaScript-Equality-Table/
wtfjsβββμμ μ½λλ€μ μ 곡ν¨βββhttps://wtfjs.com/
λ²μ μλ¬Έ : https://medium.freecodecamp.org/js-type-coercion-explained-27ba3d9a2839