πΈ09μ₯. νμ λ³νκ³Ό λ¨μΆ νκ°
β
9.1 νμ
λ³νμ΄λ?
κΈ°μ‘΄ μμ κ°(primitive value)μ μ§μ λ³κ²½νλ κ²μ μλκ³ κΈ°μ‘΄ μμ κ°μ μ΄μ©ν΄ λ€λ₯Έ νμ
μ μλ‘μ΄ μμκ°μ μμ±νλ κ²μ΄λ€. (-> immutable value μ΄κΈ° λλ¬Έ)
λͺ μμ νμ λ³ν
/νμ μΊμ€ν
: κ°λ°μκ° μλμ μΌλ‘ κ°μ νμ μ λ³ννλ κ²μ묡μ νμ λ³ν
/νμ κ°μ λ³ν
: μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ μ묡μ μΌλ‘ νμ μ΄ λ³νλλ κ²
β
9.2 μ묡μ νμ
λ³ν
μλ°μ€ν¬λ¦½νΈ μμ§μ ννμμ νκ°ν λ κ°λ°μμ μλμλ μκ΄μμ΄ μ½λμ λ¬Έλ§₯μ κ³ λ €ν΄ μ묡μ μΌλ‘ λ°μ΄ν° νμ
μ κ°μ λ³νν λκ° μλ€.
λ¬Έμμ΄(string), μ«μ(number), λΆλ¦¬μΈ(boolean)
κ³Ό κ°μμμ νμ (primitive type)
μ€ νλλ‘ νμ μ μλ λ³νλλ€.
λ¬Έμμ΄ νμ
μΌλ‘ λ³ν
+
μ°μ°μλ νΌμ°μ°μ μ€ νλ μ΄μμ΄ λ¬Έμμ΄μ΄λ©΄, λ¬Έμμ΄ μ°κ²° μ°μ°μλ‘ λμνλ€.1 + '2' // -> "12"
// μ«μ νμ
, λΆλ¦¬μΈ νμ
, null νμ
, undefined νμ
λ°λ‘ μ μ© O
0 + ""; // "0"
-0 + ""; // "0"
NaN + ""; // "NaN"
Infinity + ""; // "Infinity"
null + ""; // "null"
// βμ£Όμν κ²
// μ¬λ² νμ
(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] }"
μ«μ νμ
μΌλ‘ λ³ν
μ°μ μ°μ°μ(-, *, /)
μ νΌμ°μ°μλ μ½λ λ¬Έλ§₯μ λͺ¨λ μ«μνμ μ΄μ΄μΌ νλ€.λ³νν μ μλ κ²½μ°, NaNμ λ°ννλ€.
+
λ¨ν μ°μ°μλ νΌμ°μ°μκ° μ«μ νμ μ κ°μ΄ μλλ©΄ μ«μ νμ μ κ°μΌλ‘ μ묡μ νμ λ³νμ μννλ€.
// λ¬Έμμ΄ νμ
+""; // 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 κ°(μ°ΈμΌλ‘ νκ°λλ κ°) or Falsy κ°(κ±°μ§μΌλ‘ νκ°λλ κ°) μΌλ‘ ꡬλΆνλ€.
β μλ°μ€ν¬λ¦½νΈ μμ§μ΄ Falsy κ°μΌλ‘ νλ¨νλ κ°
false
undefined
null
0, -0
NaN
''(λΉ λ¬Έμμ΄)
β
9.3 λͺ
μμ νμ
λ³ν
π κ°λ°μμ μλμ λ°λΌ λͺ
μμ μΌλ‘ νμ
μ λ³κ²½νλ λ°©λ²
1. νμ€ λΉνΈμΈ μμ±μ ν¨μ(String, Number, Boolean)λ₯Ό new μ°μ°μ μμ΄ νΈμΆνλ λ°©λ²
2. λΉνΈμΈ λ©μλλ₯Ό μ¬μ©νλ λ°©λ²
3. μ묡μ νμ
λ³ν μ΄μ©
λ¬Έμμ΄ νμ
μΌλ‘ λ³ν
String μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
Object.prototype.toString λ©μλλ₯Ό μ¬μ©νλ λ°©λ²
λ¬Έμμ΄ μ°κ²° μ°μ°μλ₯Ό μ΄μ©νλ λ°©λ² β μ묡μ νμ λ³ν
// 1. String μμ±μ ν¨μλ₯Ό new ν€μλ μμ΄ νΈμΆνλ λ°©λ²
String(1); // "1"
String(NaN); // "NaN"
String(true); // "true"
// 2. Object.prototype.toString λ©μλλ₯Ό μ¬μ©νλ λ°©λ²
(1).toString(); // "1"
Infinity.toString(); // "Infinity"
true.toString(); // "true"
μ«μ νμ
μΌλ‘ λ³ν
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("-1"); // -1
parseInt("10.53"); // 10
parseFloat("10.53"); // 10.53
λΆλ¦¬μΈ νμ
μΌλ‘ λ³ν
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 )
!!1; // true
β
9.4 λ¨μΆ νκ°(short-circuit evaluation)
ννμμ νκ°νλ λμ€μ κ²°κ³Όκ° νμ λ κ²½μ° λλ¨Έμ§ νκ° κ³Όμ μ μλ΅νλ κ²
λ
Όλ¦¬ μ°μ°μλ₯Ό μ¬μ©ν λ¨μΆ νκ°
λ
Όλ¦¬ μ°μ°μ κ²°κ³Όλ₯Ό κ²°μ νλ νΌμ°μ°μλ₯Ό νμ
λ³ννμ§ μκ³ κ·Έλλ‘ λ°ννλ€.
λ Όλ¦¬κ³±(&&)
μ’ν β μ°νμΌλ‘ νκ°κ° μ§νλκ³
λ κ°μ νΌμ°μ°μκ° λͺ¨λ trueλ‘ νκ°λ λ, trueλ₯Ό λ°νν¨
λ°λΌμ λ Όλ¦¬ μ°μ°μ κ²°κ³Όλ₯Ό κ²°μ νλ κ²μ
λ λ²μ§Έ νΌμ°μ°μ
λ Όλ¦¬ν©(||)
μ’ν β μ°νμΌλ‘ νκ°κ° μ§νλκ³
λ κ°μ νΌμ°μ°μ.μ€ νλλ§ trueλ‘ νκ°λμ΄λ, trueλ₯Ό λ°νν¨
λ°λΌμ λ Όλ¦¬ μ°μ°μ κ²°κ³Όλ₯Ό κ²°μ νλ κ²μ
첫 λ²μ§Έ νΌμ°μ°μ
// λ
Όλ¦¬ν©(||) μ°μ°
"Cat" || "Dog"; // "Cat"
false || "Dog"; // "Dog"
"Cat" || false; // "Cat"
// λ
Όλ¦¬κ³±(&&) μ°μ°
"Cat" && "Dog"; // "Dog"
false && "Dog"; // "false"
"Cat" && false; // "false"
π μ₯μ 1. ifλ¬Έμ λ체ν μ μλ€.
var done = true;
var notdone = false;
var data1 = "";
var data2 = "";
// if문
if (done) data1 = "κ°";
// πλ¨μΆνκ°Β μ¬μ©
// λ
Όλ¦¬ μ°μ°μ(λ
Όλ¦¬κ³±)μΌλ‘ κ° ν λΉ
data1 = done && "κ°";
// λ
Όλ¦¬ μ°μ°μ(λ
Όλ¦¬ν©)μΌλ‘ κ° ν λΉ
data2 = notdone || "κ°";
π μ₯μ 2. κ°μ²΄λ₯Ό κ°λ¦¬ν€κΈ°λ₯Ό κΈ°λνλ λ³μκ° null λλ undefined κ° μλμ§ νμΈνκ³ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν λ μ μ©νλ€.
κ°μ²΄ :
{key:value}
λ‘ κ΅¬μ±λ νλ‘νΌν°μ μ§ν©λ§μ½, κ°μ²΄λ₯Ό κ°λ¦¬ν€κΈ°λ₯Ό κΈ°λνλ λ³μμ κ°μ΄ κ°μ²΄κ° μλλΌ null/undefinedμΈ κ²½μ°, κ°μ²΄ μ°Έμ‘°μ TypeError λ°μ(νλ‘κ·Έλ¨ κ°μ μ’ λ£)
// κΈ°μ‘΄
var elem = null;
var value = elem.value; // TypeError: Cannot read property 'value' of null
// πλ¨μΆνκ°Β μ¬μ©
var elem = null;
var elem = elem && elem.value; // null
π μ₯μ 2. ν¨μ λ§€κ°λ³μμ κΈ°λ³Έκ°μ μ€μ ν λ μ μ©νλ€.
ν¨μλ₯Ό νΈμΆν λ μΈμλ₯Ό μ λ¬νμ§ μμΌλ©΄ λ§€κ°λ³μμλ 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
μ΅μ
λ 체μ΄λ μ°μ°μ
`?.` : μ΅μ
λ 체μ΄λ(optional chaining)μ°μ°μ
μ’νμ νΌμ°μ°μκ°
null λλ undefined
μΌ κ²½μ°,undefined λ°ν
κ·Έλ μ§ μμ κ²½μ°,
μ°νμ νλ‘νΌν°λ₯Ό μ°Έμ‘°
var elem = null;
var value = elem?.value; // undefined
λ Όλ¦¬κ³±(&&) μ°μ°μ vs μ΅μ λ 체μ΄λ μ°μ°μ
λ Όλ¦¬κ³± μ°μ°μ : μ’ν νΌμ°μ°μκ° Falsyκ°μ΄λ©΄, μ’ν νΌμ°μ°μλ₯Ό κ·Έλλ‘ λ°ννλ€. (λ¨, 0 λλ ''μ κ°μ²΄λ‘ νκ°λ λλ μλ€.)
μ΅μ λ 체μ΄λ : μ’ν νΌμ°μ°μκ° Falsyκ°μ΄λΌλ null λλ undefined λ§ μλλ©΄, μ°νμ νλ‘νΌν°λ₯Ό μ°Έμ‘°νλ€.
// λ
Όλ¦¬κ³±(&&) μ°μ°μ
var str = ""; //
var length = str && str.length; // ''
// π μ΅μ
λ 체μ΄λ
var str = "";
var length = str?.length; // 0
null λ³ν© μ°μ°μ
`??` : λ³ν© μ°μ°μ(nullish coalescing)
- null, undefinedλ§ μλλ©΄ μμ κ°μ λ°ννλ κ²μ 보μ₯ν΄μ€λ€.
μ’νμ νΌμ°μ°μκ°
null λλ undefined
μΌ κ²½μ°,μ°νμ νΌμ°μ°μλ₯Ό λ°ν
κ·Έλ μ§ μμ κ²½μ°,
μ’νμ νλ‘νΌν°λ₯Ό μ°Έμ‘°
λ³μμ κΈ°λ³Έκ°μ μ€μ ν λ μ μ©νλ€.
κΈ°μ‘΄ :
λ Όλ¦¬ν©(||)μ μ¬μ©ν λ¨μΆ νκ°
λ₯Ό ν΅ν΄ λ³μμ κΈ°λ³Έκ°μ μ€μ νλ€.μ’νμ νΌμ°μ°μκ° falseλ‘ νκ°λλ Falsyκ°μ΄λ©΄ μ°νμ νΌμ°μ°μλ₯Ό λ°ννλ€.
λ¨, 0 μ΄λ ''μ κΈ°λ³Έκ°μΌλ‘μ μ νΈνλ€λ©΄ μκΈ°μΉ μμ λμμ΄ λ°μ
null λ³ν©μ°μ°μ
??
λ μ’νμ νΌμ°μ°μκ° Falsyκ°μ΄λΌλ nullλλ undefinedκ° μλλ©΄ μ’νμ νΌμ°μ°μλ₯Ό κ·Έλλ‘ λ°ννλ€.
// λ
Όλ¦¬ν© μ°μ°μ
var foo = "" || "default string"; // "default string"
// null λ³ν©μ°μ°μ
var foo = "" ?? "default string"; // ''
π©π» λ΄ κ°λ° κ²½ν νκ³
νλ‘μ νΈμμ, λΉ λ¬Έμμ΄("")λ νΉμ κ°μΌλ‘ μ μ§νκ³ μΆμμ§λ§, || μ°μ°μλ₯Ό μ¬μ©ν΄ λΉ λ¬Έμμ΄μ΄ κΈ°λ³Έκ°μΌλ‘ λ체λλ λ¬Έμ κ° μκΈ΄ μ μ΄ μμλ€.
μλ₯Ό λ€λ©΄, μλ μ½λμμ dataκ° "" μ΄μ΄λ κ·Έλλ‘ resμ ν λΉνκ³ μΆμμ§λ§, "default"κ° ν λΉλλ λ¬Έμ ..
let data = "";
let res = data || "default";
console.log(res);
μ΄λ null λ³ν© μ°μ°μ(??
)λ₯Ό μΌλ€λ©΄ λ λμκ² λ€λ μκ°μ΄ λ€μλ€. λ€μμλ ??
μ¨λ΄μΌμ§!
Last updated