λͺ μμ νμ λ³ν(explict coercion)
orνμ μΊμ€ν (type casting)
μ κ°λ°μκ° μλμ μΌλ‘ κ°μ νμ μ λ³ννλ κ²
μ묡μ νμ λ³ν(implicit coercion)
orνμ κ°μ λ³ν(type coercion)
μ κ°λ°μμ μλμλ μκ΄μμ΄ ννμμ νκ°νλ λμ€μ μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ μ묡μ μΌλ‘ νμ μ΄ λ³νλλ κ²
- λͺ
μμ νμ
λ³νμ΄λ μ묡μ νμ
λ³νμ΄ μμ κ°(primitive value)μ μ§μ λ³κ²½νλ κ²μ μλλ€. β
λ³κ²½ λΆκ°λ₯ν κ°(immutable value)
- λ¨μ§, κΈ°μ‘΄ μμ κ°μ μ¬μ©ν΄ λ€λ₯Έ νμ
μ
μλ‘μ΄ μμ κ°μ μμ±
νλ κ²
μλ°μ€ν¬λ¦½νΈ μμ§μ΄ ννμμ νκ°ν λ κ°λ°μμ μλμλ μκ΄μμ΄
μ½λμ λ¬Έλ§₯μ κ³ λ €ν΄ μ묡μ μΌλ‘
λ°μ΄ν° νμ μ κ°μ λ³ν(μ묡μ νμ λ³ν)νλ κ²
- μ묡μ νμ
λ³νμ΄ λ°μνλ©΄ β
λ¬Έμμ΄(string), μ«μ(number), λΆλ¦¬μΈ(boolean)
κ³Ό κ°μμμ νμ (primitive type)
μ€ νλλ‘ νμ μ μλ λ³ν
// π― μ£Όμν κ² μ€μ¬
// μ«μ νμ
NaN + ''; // "NaN"
Infinity + '' // "Infinity"
// null νμ
null + ''; // "null"
// undefined νμ
undefined + ''; // "undefined"
// μ¬λ² νμ
(Symbol()) + ''; // TypeError: Cannot convert a Symbol value to a string
// κ°μ²΄ νμ
({}) + ''; // "[object Object]"
Math + ''; // "[object Math]"
[] + ''; // ""
[10, 20] + ''; // "10,20"
(function(){}_ + ''; // "function(){}"
Array + ''; // "function Array() { [native code] }"
// λ¬Έμμ΄ νμ
+""; // 0
+"0"; // 0
+"1"; // 1
+"string" + // NaN
// λΆλ¦¬μΈ νμ
true; // 1
+false; // 0
// null νμ
+null; // 0
// undefined νμ
+undefined; // NaN
// μ¬λ² νμ
+Symbol(); // TypeError: Cannot convert a Symbol value to a number
// κ°μ²΄ νμ
+{}; // NaN
+[]; // 0
+[10, 20]; // NaN
+function () {}; // NaN
λΉ λ¬Έμμ΄(''), λΉ λ°°μ΄([]), null, false
β0
true
β1
κ°μ²΄, λΉ λ°°μ΄μ΄ μλ λ°°μ΄(= κ°μ΄ μλ λ°°μ΄), undefined
βNaN
( μ£Όμ ! )
μλ°μ€ν¬λ¦½νΈ μμ§μ λΆλ¦¬μΈ νμ μ΄ μλ κ°μ
Truthy κ°(μ°ΈμΌλ‘ νκ°λλ κ°)
orFalsy κ°(κ±°μ§μΌλ‘ νκ°λλ κ°)
μΌλ‘ ꡬλΆνλ€.
// π‘ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ Falsy κ°μΌλ‘ νλ¨νλ κ°
+ false
+ undefined
+ null
+ 0, -0
+ NaN
+ ''(λΉ λ¬Έμμ΄)
Falsy κ°
μ μ μΈν λͺ¨λ κ°μTruthy κ°
κ°λ°μμ μλμ λ°λΌ λͺ μμ μΌλ‘ νμ μ λ³κ²½νλ λ°©λ²μλ λνμ μΌλ‘ λ€μκ³Ό κ°λ€.
νμ€ λΉνΈμΈ(built-in) μμ±μ ν¨μ
βString(), Number(), Boolean()
μnew ν€μλ
μμ΄ νΈμΆνλ λ°©λ²λΉνΈμΈ(built-in) λ©μλ μ¬μ©νλ λ°©λ²
- μ묡μ νμ λ³ν
String μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
Object.prototype.toString λ©μλλ₯Ό μ¬μ©νλ λ°©λ²
- λ¬Έμμ΄ μ°κ²° μ°μ°μλ₯Ό μ΄μ©νλ λ°©λ²
// 1. String μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
String(1); // "1"
String(NaN); // "NaN"
String(Infinity); // "Infinity"
String(true); // "true"
String(false); // "false"
// 2. Object.prototype.toString λ©μλλ₯Ό μ¬μ©νλ λ°©λ²
(1).toString(); // "1"
(NaN).toString(); // "NaN";
(Infinity).toString(); // "Infinity"
(true).toString(); // "true"
(false).toString(); // "false"
// 3. λ¬Έμμ΄ μ°κ²° μ°μ°μλ₯Ό μ΄μ©νλ λ°©λ²
1 + ''; // "1"
...
Number μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
parseInt, parseFloat ν¨μλ₯Ό μ¬μ©νλ λ°©λ²(λ¬Έμμ΄λ§ μ«μ νμ μΌλ‘ λ³ν κ°λ₯)
- μ°μ μ°μ°μλ₯Ό μ¬μ©νλ λ°©λ²
// 1. Number μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
Number("0"); // 0
Number("-1"); // -1
Number("10.53"); // 10.53
Number(true); // 1
Number(false); // 0
// 2. parseInt, parseFloat ν¨μλ₯Ό μ¬μ©νλ λ°©λ²(λ¬Έμμ΄λ§ μ«μ νμ
μΌλ‘ λ³ν κ°λ₯)
parseInt("0"); // 0
parseInt("-1"); // -1
parseInt("10.53"); // 10
parseFloat("10.53"); // 10.53
// μ°μ μ°μ°μλ₯Ό μ¬μ©νλ λ°©λ²
+"0"; // 0
Boolean μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
- !(λΆμ λ Όλ¦¬ μ°μ°μλ₯Ό λ λ² μ¬μ©νλ λ°©λ²
// 1. Boolean μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
Boolean('x'); // true
Boolean(''); // false
Boolean('false'); // true
Boolean(0); // false
Boolean(1); // true
Boolean(NaN); // false
Boolean(Infinity); // true
Boolean(null); // false
Boolean(undefined); // false
Boolean({}); // true
Boolean([]); // true
// 2. !(λΆμ λ
Όλ¦¬ μ°μ°μλ₯Ό λ λ² μ¬μ©νλ λ°©λ²
!!'x'; // true ( !(!'x') === !(false) -> true )
...
λ¨μΆ νκ°(short-circuit evaluation)
: λ Όλ¦¬ μ°μ°μ κ²°κ³Όλ₯Ό κ²°μ νλ νΌμ°μ°μλ₯Όνμ λ³ννμ§ μκ³ κ·Έλλ‘ λ°ν
- λ¨μΆ νκ°λ ννμμ νκ°νλ λμ€μ νκ°κ²°κ³Όκ° νμ λ κ²½μ° β λλ¨Έμ§ νκ° κ³Όμ μ μλ΅νλ€.
λ¨μΆ νκ° ννμ | νκ° κ²°κ³Ό |
---|---|
true ll anything | true |
false ll anything | anything |
true && anything | anything |
false && anything | false |
λ Όλ¦¬κ³±(&&)
= λ Όλ¦¬ μ°μ°μ κ²°κ³Όλ₯Ό κ²°μ νλ κ²μλ λ²μ§Έ νΌμ°μ°μ
"Apple" && "Banana"; // Banana
λ Όλ¦¬κ³±(&&) μ°μ°μ
λ λ κ°μ νΌμ°μ°μκ°λͺ¨λ trueλ‘ νκ°λ λ
βtrueλ₯Ό λ°ν
μ’ν -> μ°νμΌλ‘ νκ°κ° μ§ν
λ Όλ¦¬ν©(||)
= λ Όλ¦¬ μ°μ°μ κ²°κ³Όλ₯Ό κ²°μ νλ κ²μ첫 λ²μ§Έ νΌμ°μ°μ
"Apple" && "Banana"; // Apple
λ Όλ¦¬ν©(||) μ°μ°μ
λ λκ°μ νΌμ°μ°μ μ€νλλ§ trueλ‘ νκ°λμ΄λ
βtrueλ₯Ό λ°ν
μ’ν -> μ°νμΌλ‘ νκ°κ° μ§ν
// π‘ λ
Όλ¦¬ μ°μ°μ λ¨μΆ νκ° - κΈ°λ³Έ
// λ
Όλ¦¬ν©(||) μ°μ°
"Cat" || "Dog"; // "Cat"
false || "Dog"; // "Dog"
"Cat" || false; // "Cat"
// λ
Όλ¦¬κ³±(&&) μ°μ°
"Cat" && "Dog"; // "Dog"
false && "Dog"; // "false"
"Cat" && false; // "false"
// π‘ λ
Όλ¦¬ μ°μ°μ λ¨μΆ νκ° - ifλ¬Έ λ체 -> κ° ν λΉ μ κΉλν¨
var done = true;
var message = "";
// π© 쑰건문μΌλ‘ κ° ν λΉ
if (done) message = "κ°";
// π λ
Όλ¦¬ μ°μ°μ(λ
Όλ¦¬κ³±)μΌλ‘ κ° ν λΉ
meessage = done && "κ°";
// π‘ "κ°μ²΄"λ₯Ό κ°λ¦¬ν€κΈ°λ₯Ό κΈ°λνλ λ³μκ° null λλ undefined κ° μλμ§ νμΈνκ³ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν λ
// κ°μ²΄λ { ν€ : κ° } μΌλ‘ ꡬμ±λ νλ‘νΌν°(property)μ μ§ν©
// κ°μ²΄λ₯Ό κ°λ¦¬ν€κΈ°λ₯Ό κΈ°λνλ λ³μμ κ°μ΄ κ°μ²΄κ° μλ null μ΄λ undefined μΈ κ²½μ°, κ°μ²΄ μ°Έμ‘°μ TypeErrorκ° λ°μ -> νλ‘κ·Έλ¨ κ°μ μ’
λ£
// π©
var elem = null;
var value = elem.value; // TypeError: Cannot read property 'value' of null
// π
// elemμ΄ null λλ undefined κ°μ "Falsy κ°"μ΄λ©΄ elem κ°μΌλ‘ νκ°
// elemμ΄ "Truthy κ°"μ΄λ©΄ elem.value λ‘ νκ°
var elem = null;
var elem = elem && elem.value; // null
// π‘ ν¨μ 맀κ°λ³μμ κΈ°λ³Έκ°μ μ€μ ν λ
// ν¨μλ₯Ό νΈμΆν λ μΈμλ₯Ό μ λ¬νμ§ μμΌλ©΄ 맀κ°λ³μμλ undefined κ° ν λΉ
// π© μΈμλ₯Ό μ λ¬νμ§ μμ κ²½μ°
function getStringLength(str) {
return str.length;
}
getStringLength(); // TypeError: Cannot read property 'length' of undefined
// π λ¨μΆ νκ°λ₯Ό μ¬μ©ν 맀κ°λ³μμ κΈ°λ³Έκ° μ€μ
function getStringLength(str) {
str = str || "";
return str.length;
}
getStringLength(); // 0
// π Es6μ 맀κ°λ³μ default parameter μ€μ
function getStringLength(str = "") {
return str.length;
}
getStringLength(); // 0
?.
=μ΅μ λ 체μ΄λ(optional chaining) μ°μ°μ
- μ’νμ νΌμ°μ°μκ°
null λλ undefined
βundefined λ°ν
- κ·Έλ μ§ μμ κ²½μ° β
μ°νμ νλ‘νΌν°λ₯Ό μ°Έμ‘°
var elem = null;
var value = elem?.value; // undefined
- κ°μ²΄λ₯Ό κ°λ¦¬ν€κΈ°λ₯Ό κΈ°λνλ λ³μκ° null λλ undefinedκ° μλμ§ νμΈνκ³ νλ‘νΌν°λ₯Ό μμ νκ² μ°Έμ‘°ν λ μ μ©
- μ΅μ
λ 체μ΄λ λμ
μ΄μ μλ
λ Όλ¦¬κ³±(&&)μ μ¬μ©ν λ¨μΆ νκ°
λ₯Ό ν΅ν΄ β λ³μκ° null λλ undefined μΈμ§ νμΈνμ
var elem = null;
var value = elem && elem.value; // null (elemμ null)
// π‘ λ
Όλ¦¬κ³±(&&) μ°μ°μ vs μ΅μ
λ 체μ΄λ μ°μ°μ
// π© λ
Όλ¦¬κ³±(&&) μ°μ°μ = μ’ν νΌμ°μ°μκ° Falsyκ°μ΄λ©΄, μ’ν νΌμ°μ°μλ₯Ό κ·Έλλ‘ λ°ννλ€. (λ¨, 0 λλ ''μ κ°μ²΄λ‘ νκ°λ λλ μλ€.)
var str = ""; //
var length = str && str.length; // ''
// π μ΅μ
λ 체μ΄λ = μ’ν νΌμ°μ°μκ° Falsyκ°μ΄λΌλ null λλ undefined λ§ μλλ©΄, μ°νμ νλ‘νΌν°λ₯Ό μ°Έμ‘°νλ€.
var str = "";
var length = str?.length; // 0
??
=λ³ν© μ°μ°μ(nullish coalescing) μ°μ°μ
- μ’νμ νΌμ°μ°μκ°
null λλ undefined
βμ°νμ νΌμ°μ°μλ₯Ό λ°ν
- κ·Έλ μ§ μμ κ²½μ° β
μ’νμ νλ‘νΌν°λ₯Ό μ°Έμ‘°
var foo = null ?? "default string"; // "default string"
λ³μμ κΈ°λ³Έκ°μ μ€μ ν λ μ μ© !
- null λ³ν© μ°μ°μ λμ
μ΄μ μλ
λ Όλ¦¬ν©(||)μ μ¬μ©ν λ¨μΆ νκ°
λ₯Ό ν΅ν΄ β λ³μμ κΈ°λ³Έκ°μ μ€μ νμ
// π‘ λ
Όλ¦¬ν©(||) μ°μ°μ vs null λ³ν© μ°μ°μ
// π© λ
Όλ¦¬ν©(||) μ°μ°μ = μ’νμ νΌμ°μ°μκ° Falsyκ°μ΄λ©΄, μ°νμ νΌμ°μ°μλ₯Ό λ°ν (λ¨, 0 μ΄λ ''μ κΈ°λ³Έκ°μΌλ‘μ μ νΈνλ€λ©΄ μκΈ°μΉ μμ λμμ΄ λ°μ !)
var foo = "" || "default string"; // "default string"
// π null λ³ν© μ°μ°μ = μ’νμ νΌμ°μ°μκ° Falsyκ°μ΄λΌλ null λλ undefined κ° μλλ©΄, μ’νμ νΌμ°μ°μλ₯Ό κ·Έλλ‘ λ°ννλ€.
var foo = "" ?? "default string"; // ''