λ³μμ μ€μ½ν λ©λͺ¨λ¦¬
μλ°μ€ν¬λ¦½νΈλ λμ¨ν νμ (loosly typed) μΈμ΄ νΉμ λμ (dynamic) μΈμ΄λ‘, λ³μκ° κ°μ ΈμΌ ν λ°μ΄ν° νμ μ 미리 μ μΈν νμκ° μκ³ , λ³μμ νμ μ΄ μ€ν μ€μ λ°λ μ μλ μΈμ΄μ΄λ€.
var foo = 42; // Numbervar foo = 'bar'; // Stringvar foo = true; // Boolean
#
μμ κ°κ³Ό μ°Έμ‘° κ°μλ°μ€ν¬λ¦½νΈμλ κΈ°λ³Έ νμ (Primitive, λλ μμ μλ£ν)κ³Ό μ°Έμ‘° νμ (Reference)μλ°μ΄ν°λ₯Ό μ μ₯ν μ μλ€.
μμ νμ : Number, String, Boolean, Undefined, Null, Symbol
'κ°μΌλ‘' μ κ·Ό
λ³μμ μ μ₯λ μ€μ κ°μ μ‘°μ
μ°Έμ‘° νμ : Object
'μ°Έμ‘°λ‘' μ κ·Ό
κ°μ²΄ μμ²΄κ° μλλΌ ν΄λΉ κ°μ²΄μ λν 'μ°Έμ‘°'λ₯Ό μ‘°μ
βοΈ μμ κ° vs μ°Έμ‘° κ°μ μ°¨μ΄λ₯Ό 머리 μμ λ°μλμ.
Explaining Value vs. Reference in Javascript
#
μμ κ°var x = 10;var y = 'abc';var z = null;
Variables | Values |
---|---|
x | 10 |
y | 'abc' |
z | null |
#
μ°Έμ‘° κ°var arr = [];arr.push(1);
Variables | Values | Addresses | Objects |
---|---|---|---|
arr | <#001> | #001 | [] |
Variables | Values | Addresses | Objects |
---|---|---|---|
arr | <#001> | #001 | [1] |
#
λμ νλ‘νΌν°μ°Έμ‘° κ°μλ μΈμ λ νλ‘νΌν°μ λ©μλμ μΆκ°, μμ , μμ κ° κ°λ₯νλ€.
var person = new Object();person.name = 'Nicholas';alert(person.name); // "Nicholas"
μμ κ°μλ νλ‘νΌν°λ₯Ό μΆκ°ν μ μλ€. (μλ¬κ° λ°μνλ κ²μ μλλ€.)
var name = 'Nicholas';name.age = 27;alert(name.age); // undefined
#
κ° λ³΅μ¬μμ κ°μ λ€λ₯Έ λ³μλ‘ λ³΅μ¬ν λλ νμ¬ μ μ₯λ κ°μ μλ‘ μμ±ν λ€μ μλ‘μ΄ λ³μμ 볡μ¬νλ€. λ λ³μλ μμ ν λΆλ¦¬λμ΄ μλ€.
var num1 = 5;var num2 = num1;
![2020-04-27-λ³μμ-μ€μ½ν-λ©λͺ¨λ¦¬-image-0](./images/2020-04-27-λ³μμ-μ€μ½ν-λ©λͺ¨λ¦¬-image-0.png)
![2020-04-27-λ³μμ-μ€μ½ν-λ©λͺ¨λ¦¬-image-1](./images/2020-04-27-λ³μμ-μ€μ½ν-λ©λͺ¨λ¦¬-image-1.png)
μ°Έμ‘° κ° λ³΅μ¬ μμ μλ λ³μμ λ€μ΄ μλ κ°μ΄ λ€λ₯Έ λ³μλ‘ λ³΅μ¬λκΈ°λ λ§μ°¬κ°μ§μΈλ° , μ΄ λ 볡μ¬λλ κ°μ κ°μ²΄ μμ²΄κ° μλλΌ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λΌλ κ²μ΄λ€.
var obj1 = new Object();var obj2 = obj1;obj1.name = 'Nicholas';alert(obj2.name); // "Nicholas"
λ λ³μκ° κ°μ κ°μ²΄λ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ κ°μ²΄μ νλ‘νΌν°λ₯Ό λ³κ²½νλ©΄, λ κ°μ΄ λͺ¨λλ³κ²½λλ€.
βοΈ μ€λ₯Έμͺ½μ μλ λ©λͺ¨λ¦¬ μμμ ν(Heap)μ΄λΌκ³ νλ€.
#
맀κ°λ³μ μ λ¬ECMAScriptμ ν¨μ 맀κ°λ³μλ λͺ¨λ κ°μΌλ‘ μ λ¬(Pass by value)λλ€. μΈλΆμ μλ κ°μ ν¨μμ μΈμλ‘ λ£μ΄μ£Όλ©΄ 맀κ°λ³μμ 볡μ¬λμ΄ ν¨μ λ΄λΆμμ μ¬μ©ν μ μλ€.
βοΈ λ§€κ°λ³μ(parameters)μ μ λ¬μΈμ(arguments)
μ΄ λ 볡μ¬λλ λ°©μμ μμμ μ€λͺ ν κ° λ³΅μ¬μ λμΌνλ€. μμ κ°μ νΌλμ μ¬μ§κ°μμ§λ§ μ°Έμ‘° κ°μ κ²½μ° νΌλμ μ¬μ§κ° μλ€.
function setName(obj) { obj.name = 'Nicholas';}
var person = new Object();person.name = 'Alberto';setName(person);alert(person.name); // "Nicholas"
μ΄ μμ μμ setName()
ν¨μλ₯Ό μ€ννκ³ λμ person.name
μ΄ λ°λ κ²μ λ³΄κ³ λ§€κ°λ³μκ° μ°Έμ‘° ννλ‘ μ λ¬λμλ€κ³ μ€ν΄νλ κ²½μ°κ° μλ€. νμ§λ§, μ΄λ ν¨μ λ΄μμ μ°Έμ‘°λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬μ μλ κ°μ²΄μ μ κ·ΌνμκΈ° λλ¬Έμ κ°μ²΄μ νλ‘νΌν°λ₯Ό λ³κ²½ν μ μμλ κ²μ΄λ€.
Variables | Values | # | Addresses | Objects |
---|---|---|---|---|
person | <#234> | # | #234 | {name: "Alberto"} β {name: "Nicholas"} |
obj | <#234> | # |
function setName(obj) { obj = { name: 'Nicholas', };}
var person = new Object();person.name = 'Alberto';setName(person);alert(person.name); // "Alberto"
λ°λ©΄, ν¨μ λ΄λΆλ₯Ό 맀κ°λ³μ obj
μ μλ‘μ΄ κ°μ²΄λ₯Ό ν λΉνλ κ²μΌλ‘ λ³κ²½νλ©΄ setName()
ν¨μλ₯Ό μ€νν΄λ person.name
μ΄ λ³νμ§ μμ κ²μ λ³Ό μ μλ€.
μ²μμλ 맀κ°λ³μ obj
μ person
μ μ£Όμ κ°μ΄ 볡μ¬λμμΌλ, μ΄νμ obj
μμλ‘μ΄ κ°μ²΄( {name: "Nicholas"}
)λ₯Ό ν λΉν κ²μΌλ‘, κΈ°μ‘΄μ κ°μ²΄λ μν₯μ λ°μ§μλλ€.
Variables | Values | # | Addresses | Objects |
---|---|---|---|---|
person | <#234> | # | #234 | {name: "Alberto"} |
obj | <#234> β <#567> | # | #567 | {name: "Nicholas"} |
Understanding JavaScript Pass By Value
#
νμ νλ³typeof
μ°μ°μλ λ³μκ° Number, String, Boolean, undefined μΌ λλ μ νν νμ
μ μ μ μκ³ , κ°μ²΄μ΄κ±°λ null μΌ κ²½μ° objectλ₯Ό λ°ννλ€.
κ°μ²΄κ° μ΄λ€ νμ
μ κ°μ²΄μΈμ§ μκ³ μΆμ λκ° μλλ° μ΄ λλ typeof
μ°μ°μ λμ instanceof
μ°μ°μκ° λμμ΄ λλ€. instanceof
μ°μ°μλ objectμ νλ‘ν νμ
체μΈμ constructor.prototype
μ΄ μ‘΄μ¬νλμ§ νλ³νλ€.
var person = { name: 'Alberto',};var colors = ['red', 'blue', 'green'];
var fruit1 = new String('banana');var fruit2 = 'apple';
console.log(person instanceof Object); // trueconsole.log(colors instanceof Object); // trueconsole.log(colors instanceof Array); // trueconsole.log(fruit1 instanceof Object); // trueconsole.log(fruit1 instanceof String); // trueconsole.log(fruit2 instanceof Object); // falseconsole.log(fruit2 instanceof String); // false
μμ κ°μ΄ κ°μ²΄μ instanceof
μ μ΄μ©ν΄ μ΄λ κ°μ²΄μ μΈμ€ν΄μ€μΈμ§λ₯Ό νλ³ν μ μλ€.
βοΈ
fruit1
κ³Όfruit2
μ μ°¨μ΄μ μ μνμ.fruit1
μ String κ°μ²΄λ₯Ό μμ±νκ²μ΄κ³ ,fruit2
λ 리ν°λ΄λ‘ κΈ°λ³Έ νμ String κ°μ΄λ€.
[μλ°μ€ν¬λ¦½νΈ] new String("")κ³Ό ""(String literal)κ³Ό String("")μ λνμ¬
#
μ€ν 컨ν μ€νΈμ μ€μ½νλ³μλ ν¨μμ μ€ν 컨ν μ€νΈλ λ€λ₯Έ λ°μ΄ν°μ μ κ·Όν μ μλμ§, μ΄λ»κ² νλνλμ§λ₯Ό κ·μ νλ€. κ° μ€ν 컨ν μ€νΈμλ λ³μ κ°μ²΄(variable object)κ° μ°κ²°λμ΄ μμΌλ©°ν΄λΉ 컨ν μ€νΈμμ μ μλ λͺ¨λ λ³μμ ν¨μλ μ΄ κ°μ²΄μ μ‘΄μ¬νλ€.
βοΈ μ΄ κ°μ²΄λ μ½λμμ μ κ·Όν μλ μλ€. μ΄λ©΄μμ λ°μ΄ν°λ₯Ό λ€λ£° λ μ΄ κ°μ²΄λ₯Ό μ΄μ©νλ€.
κ·Έλ¦Ό μΆμ² : π μ€ν 컨ν μ€νΈμ μλ°μ€ν¬λ¦½νΈμ λμ μ리 - Poiemaweb
컨νΈλ‘€μ΄ μ€ν κ°λ₯ν μ½λλ‘ μ΄λνλ©΄, λ Όλ¦¬μ μ€ν ꡬ쑰λ₯Ό κ°μ§λ μλ‘μ΄ μ€ν컨ν μ€νΈ μ€νμ΄ μμ±λλ€. μ€νμ LIFO(Last In First Out, νμ μ μΆ)μ ꡬ쑰λ₯Όκ°μ§λ λμ΄ κ΅¬μ‘°μ΄λ€.
μ μ μ½λ(Global code)λ‘ μ»¨νΈλ‘€μ΄ μ§μ νλ©΄, μ μ μ€ν 컨ν μ€νΈκ° μμ±λκ³ μ€ν 컨ν μ€νΈ μ€νμ μμΈλ€. μ μ μ€ν 컨ν μ€νΈλ μ ν리μΌμ΄μ μ΄ μ’ λ£λ λ(μΉνμ΄μ§μμ λκ°κ±°λ λΈλΌμ°μ λ₯Ό λ«μ λ)κΉμ§ μ μ§λλ€.
ν¨μλ₯Ό νΈμΆνλ©΄ ν΄λΉ ν¨μμ μ€ν 컨ν μ€νΈκ° μμ±λλ©° μ§μ μ μ€νλ μ½λ λΈλ‘μ μ€ν 컨ν μ€νΈ μμ μμΈλ€.
ν¨μ μ€νμ΄ λλλ©΄ ν΄λΉ ν¨μμ μ€ν 컨ν μ€νΈλ₯Ό νκΈ°νκ³ μ§μ μ μ€ν 컨ν μ€νΈμ 컨νΈλ‘€μ λ°ννλ€.
컨ν μ€νΈμμ μ½λλ₯Ό μ€ννλ©΄, λ³μ κ°μ²΄μ μ€μ½ν 체μΈ(scope chain)μ΄ λ§λ€μ΄ μ§λ€ . μ€μ½ν 체μΈμ λͺ©μ μ μ€ν 컨ν μ€νΈκ° μ κ·Όν μ μλ λͺ¨λ λ³μμ ν¨μμ μμλ₯Όμ νλ κ²μ΄λ€.
μ½λκ° μ€νλλ 컨ν μ€νΈμ λ³μ κ°μ²΄
ν΄λΉ 컨ν μ€νΈλ₯Ό ν¬ν¨νλ 컨ν μ€νΈ(λΆλͺ¨ 컨ν μ€νΈ)
λΆλͺ¨μ λΆλͺ¨ 컨ν μ€νΈ
...
μ μ 컨ν μ€νΈ
μλ³μλ₯Ό μ°Ύμ λ μ΄ μ€μ½ν 체μΈμ μμλ₯Ό λ°λΌκ°λ©΄μ μλ³μ μ΄λ¦μ κ²μνλ€. λ΄λΆμ»¨ν μ€νΈλ μ€μ½ν 체μΈμ ν΅ν΄ μΈλΆ 컨ν μ€νΈ μ 체μ μ κ·Ό κ°λ₯νμ§λ§, μΈλΆ 컨ν μ€νΈλ λ΄λΆ 컨ν μ€νΈμ λν΄ μ ν μ μ μλ€.
var color = 'blue';
function changeColor() { var anotherColor = 'red';
function swapColors() { var tempColor = anotherColor; anotherColor = color; color = tempColor; }
swapColors();}
changeColor();console.log(color);
μ΄ μ½λμλ μ μ 컨ν
μ€νΈ, changeColor()
μ λ‘컬 컨ν
μ€νΈ, swapColors()
μλ‘컬 컨ν
μ€νΈλ‘ μΈ κ°μ μ½ν
μ€νΈκ° μλ€. swapColors
λ μμ μ λ³μ κ°μ²΄μμ λ³μλ ν¨μ μ΄λ¦μ κ²μνκ³ μ°Ύμ§ λͺ»νλ©΄ μ€μ½ν 체μΈμ λ°λΌ ν λ¨κ³ μ© μ¬λΌκ°λ€. νμ§λ§ μ μ 컨ν
μ€νΈμμλ λ‘컬 컨ν
μ€νΈμ μ κ·Όν μ μλ€.
#
μ€μ½ν μ²΄μΈ νμ₯μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ νμ₯ν μ μλ λ°©λ²μ΄ μλ€.
try-catch
λ¬Έμcatch
λΈλ‘with
λ¬Έ
λ λ¬Έμ₯μ μ€μ½ν μ²΄μΈ μμ λ³μ κ°μ²΄λ₯Ό μΆκ°νλ€. with
λ¬Έμ ν΄λΉ κ°μ²΄κ° μ€μ½ν체μΈμ μΆκ°λκ³ , catch
λ¬Έμμλ μλ¬ κ°μ²΄λ₯Ό μ μΈνλ λ³μ κ°μ²΄κ° μμ±λλ€.
function buildUrl() { var qs = '?debug=true';
with (location) { var url = href + qs; }
return url;}
μ¬κΈ°μ href
λ with
λ¬Έμ΄ μΆκ°ν location κ°μ²΄μ λ€μ΄μλ λ³μμ΄λ€. with
λ¬Έλ΄λΆμμ μ μΈν λ³μ url μ΄ ν¨μμ 컨ν
μ€νΈλ‘ νΈμ
λμ΄ ν¨μ κ°μΌλ‘ λ°νλ μ μλ€.
#
μλ°μ€ν¬λ¦½νΈμ λΈλ‘ λ 벨 μ€μ½νES5κΉμ§ var
κ° λ³μλ₯Ό μ μΈν μ μλ μ μΌν ν€μλμμ§λ§, ES6λΆν°λ let
ν€μλλ₯Ό μ¬μ©νμ¬ λΈλ‘ λ 벨 μ€μ½νμ λ³μλ₯Ό μ μν μ μλ€.
ν¨μ λ 벨 μ€μ½ν(Function-level scope) ν¨μ λ΄μμ μ μΈλ λ³μλ ν¨μ λ΄μμλ§ μ ν¨νλ©° ν¨μ μΈλΆμμλ μ°Έμ‘°ν μ μλ€. μ¦, ν¨μ λ΄λΆμμ μ μΈν λ³μλμ§μ λ³μμ΄λ©° ν¨μ μΈλΆμμ μ μΈν λ³μλ λͺ¨λ μ μ λ³μμ΄λ€.
λΈλ‘ λ 벨 μ€μ½ν(Block-level scope) λͺ¨λ μ½λ λΈλ‘(ν¨μ, if λ¬Έ, for λ¬Έ, while λ¬Έ, try/catch λ¬Έ λ±) λ΄μμ μ μΈλ λ³μλ μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νλ©° μ½λλΈλ‘ μΈλΆμμλ μ°Έμ‘°ν μ μλ€. μ¦, μ½λ λΈλ‘ λ΄λΆμμ μ μΈν λ³μλ μ§μ λ³μμ΄λ€.
var
λ₯Ό μ¬μ©νμ¬ μ μΈλ λ³μλ ν¨μ λ 벨 μ€μ½νλ₯Ό κ°μ§κΈ° λλ¬Έμ, if λ¬Έ, for λ¬Έ, while λ¬Έ λ±μ λΈλ‘ λ΄λΆμμ μ¬μ©λλ λ³μλΌ ν μ§λΌλ ν΄λΉ λΈλ‘μ΄ μ€νλ μ΄νμνκ΄΄λμ§ μκ³ μ‘΄μ¬νλ€. (λ€λ₯Έ μΈμ΄μμλ μΌλ°μ μΌλ‘ λΈλ‘ λ 벨 μ€μ½νλ‘ ν΄λΉ λ³μλνκ΄΄λλ€.)
if (true) { var color = 'blue';}alert(color); // "blue"
for (var i = 0; i < 10; i++) { doSomething(i);}alert(i); // 10
λ³μ μ μΈ
var
λ‘ μ μΈλ λ³μλ μλμΌλ‘ κ°μ₯ κ°κΉμ΄ 컨ν
μ€νΈμ μΆκ°λλ€. ν¨μ λ΄λΆμμλν¨μμ λ‘컬 컨ν
μ€νΈ, with
λ¬Έ λ΄λΆμμλ ν¨μ 컨ν
μ€νΈκ° κ°μ₯ κ°κΉμ΄ 컨ν
μ€νΈμ΄λ€. λ³μλ₯Ό μ μΈνμ§ μμ μ± μ΄κΈ°ν ν κ²½μ° μλμΌλ‘ μ μ 컨ν
μ€νΈμ μΆκ°λλ€.
function add(num1, num2) { var sum = num1 + num2; return sum;}
var result = add(10, 20);alert(sum); // μ ν¨ν λ³μκ° μλ
function add(num1, num2) { sum = num1 + num2; // var ν€μλλ₯Ό μλ΅νμ¬ μ μ 컨ν
μ€νΈ return sum;}
var result = add(10, 20);alert(sum); // 30
μλ³μ κ²μ
컨ν μ€νΈ μμμ μλ³μλ₯Ό μ°Έμ‘°νλ € νλ©΄ μλ³μλ₯Ό κ²μνκ² λλλ°, κ²μμ κ°μ₯ κ°κΉμ΄ 컨ν μ€νΈμμ μμνμ¬ μ΄λ¦μ μ°ΎμΌλ©΄ κ²μμ λ©μΆκ³ λ³μλ₯Ό μ€μ νλ€. μ°Ύμ§ λͺ»νλ©΄ κ²μμ κ³μνλλ°, μ μμμλ μ°Ύμ§ λͺ»ν κ²½μ° μλ³μκ° μ μλμ§ μμ κ²μΌλ‘νλ¨νκ³ κ²μμ λ©μΆλ€.
var color = 'blue';function getColor() { return color;}alert(getColor()); // "blue"
μλ³μκ° λ‘컬 컨ν μ€νΈμ μ μλμ΄ μμΌλ©΄, λΆλͺ¨ 컨ν μ€νΈμ κ°μ μ΄λ¦μ μλ³μκ°μμ΄λ μ°Έμ‘°ν μ μλ€. μ μ 컨ν μ€νΈμ λ³μλ₯Ό μ΄μ©ν κ²½μ° window κ°μ²΄λ₯Ό μ°Έμ‘°νλ©΄μ¬μ©ν μ μλ€.
var color = 'blue';
function getColor() { var color = 'red'; console.log(color); console.log(window.color);}
getColor();
#
κ°λΉμ§ μ½λ μ C μΈμ΄μμλ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μν΄ malloc()
κ³Ό free()
λ₯Ό μ¬μ©νλλ°, μλ°μ€ν¬λ¦½νΈλ κ°μ²΄κ° μμ±λμμ λ μλμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ μΈλͺ¨ μμ΄μ‘μ λ μλμΌλ‘ν΄μ νλ κ°λΉμ§ 컬λ μ
μ μ¬μ©νλ€. μ΄λ¬ν κ°λΉμ§ 컬λ μ
νλ‘μΈμ€λ μ£ΌκΈ°μ μΌλ‘ μ€νλκ³ , νΉμ μμ μμ μννλλ‘ μ§μ ν μλ μλ€.
ν¨μ λ΄ μ§μ λ³μμ κ²½μ° ν¨μλ₯Ό μ€ννλ©΄ λ³μκ° μμ±λκ³ , μ€νμ λ³μμ κ°μ μ μ₯ν λ©λͺ¨λ¦¬κ° ν λΉλλ€. ν¨μκ° μ’ λ£λλ©΄ λ³μκ° λ μ΄μ νμνμ§ μμΌλ―λ‘ κ°λΉμ§μ»¬λ ν°κ° νμν μ μλ€. νμ§λ§ μ΄λ€ λ³μκ° λ μ΄μ μ¬μ©λμ§ μλμ§, μ¬μ©λ κ°λ₯μ±μ΄ μλμ§ νλ¨ν μ μλ λ°©λ²μ΄ νμνλ€.
#
νμνκ³ μ§μ°κΈ°μλ°μ€ν¬λ¦½νΈμμ λ리 μ°μ΄λ κ°λΉμ§ 컬λ μ λ°©λ²μ "νμνκ³ μ§μ°κΈ° (mark-and-sweep)"μ΄λ€. κ°λΉμ§ 컬λ ν°κ° μλνλ©΄ λ©λͺ¨λ¦¬μ μ μ₯λ λ³μ μ 체μ νμλ₯Ό λ¨κΈ΄ λ€μ, 컨ν μ€νΈμ μλ λ³μμ 컨ν μ€νΈμ μλ λ³μκ° μ°Έμ‘°νλ λ³μμμνμλ₯Ό μ§μ΄λ€. μ΄λ κ² ν λ€ νμκ° λ¨μ μλ λ³μκ° μ»¨ν μ€νΈμ μλ λ³μμ 무κ΄νλ―λ‘ μμ ν΄λ μμ νλ€κ³ νλ¨νμ¬, 'λ©λͺ¨λ¦¬ μ²μ'λ₯Ό μ€νν΄ νκ΄΄νκ³ λ©λͺ¨λ¦¬λ₯Ό νμνλ€.
#
μ°Έμ‘° μΉ΄μ΄ν"μ°Έμ‘° μΉ΄μ΄ν (reference counting)"μ΄λΌκ³ λΆλ¦¬λ κ°λΉμ§ 컬λ μ λ°©λ²λ μλ€. λ³μλ₯Ό μ μΈνκ³ μ°Έμ‘° κ°μ΄ ν λΉλ λλ§λ€ μ°Έμ‘° μΉ΄μ΄νΈλ₯Ό 1μ© λλ¦¬κ³ , κ°μ μ°Έμ‘°νλ λ³μμ λ€λ₯Έ κ°μ΄ ν λΉ λ λλ§λ€ μ°Έμ‘° μΉ΄μ΄νΈλ₯Ό 1μ© μ€μ¬μ, μ°Έμ‘° μΉ΄μ΄νΈκ° 0μ΄λΌλ©΄ ν΄λΉ κ°μ μ κ·Όν λ°©λ²μ΄ μλ€κ³ νλ¨νμ¬ λ©λͺ¨λ¦¬λ₯Ό νμνλ λ°©λ²μ΄λ€.
νμ§λ§ μ΄λ μν μ°Έμ‘°λΌλ μ¬κ°ν λ¬Έμ κ° μλ€.
function problem() { var objectA = new Object(); var objectB = new Object();
objectA.someOtherObject = objectB; objectB.anotherObject = objectA;}
μ΄ μμ μμ objectA
μ objectB
κ° μλ‘λ₯Ό μ°Έμ‘°νμ¬ κ°κ°μ μ°Έμ‘° μΉ΄μ΄νΈκ° 2μΈλ° , ν¨μ μ€νμ΄ λλ λ€μλ μ°Έμ‘° μΉ΄μ΄νΈκ° 0μ΄ λμ§ μμΌλ―λ‘ λ λ³μκ° κ³μ λ©λͺ¨λ¦¬μ λ¨μ λλΉκ° λ°μνλ€.
μ΅μ€νλ‘λ¬ 8κ³Ό μ΄μ λ²μ μμ κ°μ²΄ μ€ μΌλΆκ° C++μ μ¬μ©ν μ°Έμ‘° μΉ΄μ΄ν λ°©μμΌλ‘ꡬνλμκ³ μν μ°Έμ‘° λ¬Έμ κ° λ°μνλ€.
μν μ°Έμ‘° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ ν΄λΉ κ°μ²΄λ₯Ό λ€ μ¬μ©ν λ€μ λ μ¬μ΄μ μ°κ²°μλμ΄μΌ νλ€. nullμ ν λΉνλ©΄ μ°κ²°μ μ κ±°ν μ μλ€.
#
μ±λ₯κ°λΉμ§ 컬λ μ μ μ€ννλ νμ΄λ°μ΄ μ±λ₯ ν₯μμ μν΄ μ€μνλ€. μΈν°λ· μ΅μ€νλ‘λ¬λλ무 μμ£Ό κ°λΉμ§ 컬λ ν°λ₯Ό μ€ννμ¬ μ±λ₯ λ¬Έμ λ₯Ό μΌκΈ°ν΄μλ€.
#
λ©λͺ¨λ¦¬ κ΄λ¦¬κ°λΉμ§ 컬λ μ μ μ§μνλ νλ‘κ·Έλλ° νκ²½μμλ κ°λ°μκ° λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ κ²½μ°μ§μμλ λλ―λ‘ νΈλ¦¬νλ€. νμ§λ§ μΉ λΈλΌμ°μ μμ μ¬μ©ν μ μλ λ©λͺ¨λ¦¬λ μΌλ° λ°μ€ν¬ν± μ±μ λΉν΄ λ§€μ° μ μΌλ―λ‘ κ°λ₯ν ν μ΅μνμ λ©λͺ¨λ¦¬λ§ μ¬μ©ν΄μΌ μ±λ₯μ μ¬λ¦΄ μμλ€.
κ°μ₯ μ’μ λ°©λ²μ μ½λ μ€νμ νμν λ°μ΄ν°λ§ μ μ§νλ κ²μ΄λ€. νμμμ΄μ§ λ°μ΄ν°λ nullμ ν λΉνμ¬ μ°Έμ‘°λ₯Ό μ κ±°νλ κ²μ΄ μ’λ€. μλμΌλ‘ μ°Έμ‘° μ κ±°ν΄μΌ ν λμμμ£Όλ‘ μ μ λ³μ λ° μ μ κ°μ²΄μ νλ‘νΌν° μΈλ°, μ§μ λ³μλ 컨ν μ€νΈλ₯Ό λΉ μ Έλκ°λμκ°μλμΌλ‘ μ°Έμ‘°κ° μ κ±°λμ§λ§, μ μ λ³μλ μ°Έμ‘°λ₯Ό μ κ±°νμ§ μμΌλ©΄ κ³μ λ©λͺ¨λ¦¬μ λ¨μμκ² λλ€.
βοΈ μ°Έμ‘°λ₯Ό μ κ±°ν μκ° ν λΉλ λ©λͺ¨λ¦¬κ° μλμΌλ‘ λ°νλλ κ²μ μλλ€. μ°Έμ‘° μ κ±°λ₯Ό ν μ΄νμ μ€νλ κ°λΉμ§ 컬λ μ μμ ν΄λΉ λ©λͺ¨λ¦¬κ° νμλλ€.
#
μμ½μλ°μ€ν¬λ¦½νΈ λ³μμλ μμ κ°κ³Ό μ°Έμ‘° κ° λ κ°μ§ ννλ‘ κ°μ μ μ₯ν μ μλ€.
μμ κ°κ³Ό μ°Έμ‘° κ°μλ λ€μμ νΉμ§μ΄ μλ€.
μμ κ°μ κ³ μ λ ν¬κΈ°λ₯Ό κ°μ§λ©° μ€ν λ©λͺ¨λ¦¬μ μ μ₯λλ€.
μμ κ°μ ν λ³μμμ λ€λ₯Έ λ³μλ‘ λ³΅μ¬νλ©΄ κ° μμ²΄κ° λ³΅μ¬λλ€.
μ°Έμ‘° κ°μ κ°μ²΄μ΄λ©° ν λ©λͺ¨λ¦¬μ μ μ₯λλ€.
λ³μμ μ°Έμ‘° κ°μ μ μ₯νλ©΄ ν΄λΉ λ³μλ κ°μ²΄μ λν μ°Έμ‘°λ§ μ μ₯ν λΏ κ°μ²΄ μ체λ₯Όμ μ₯νλ κ²μ μλλ€.
μ°Έμ‘° κ°μ ν λ³μμμ λ€λ₯Έ λ³μλ‘ λ³΅μ¬νλ©΄ ν΄λΉ κ°μ²΄μ λν μ°Έμ‘°λ§μ 볡μ¬νλ―λ‘ λ λ³μλ κ°μ κ°μ²΄λ₯Ό μ°Έμ‘°νλ€.
typeof
μ°μ°μλ κ°μ μμ νμ μ νλ³νλ©°instanceof
μ°μ°μλ κ°μ μ°Έμ‘° νμ μ νλ³νλ€.
μμ κ°κ³Ό μ°Έμ‘° κ°μ κ°λ¦¬μ§ μκ³ λͺ¨λ λ³μλ μ€μ½νλΌκ³ λΆλ₯΄κΈ°λ νλ μ€ν 컨ν μ€νΈμ μ‘΄μ¬νλλ°, μ€ν 컨ν μ€νΈλ λ³μκ° μ‘΄μ¬νλ κΈ°κ°μ κ²°μ νλ©° μ΄λ μ½λκ° ν΄λΉ λ³μμ μ κ·Όν μ μλμ§λ κ²°μ νλ€.
μ€ν 컨ν μ€νΈμλ μ μ 컨ν μ€νΈμ ν¨μ 컨ν μ€νΈκ° μλ€.
μ€ν 컨ν μ€νΈμ μ§μ ν λλ§λ€ μ€μ½ν 체μΈμ΄ λ§λ€μ΄μ§λ©°, μ€μ½ν 체μΈμ λ³μμν¨μλ₯Ό κ²μνλλ° μ°μΈλ€.
ν¨μ 컨ν μ€νΈλ ν΄λΉ μ€μ½νμ μλ λ³μ, ν΄λΉ μ€μ½νλ₯Ό ν¬ν¨νλ 컨ν μ€νΈμ μλ λ³μ, μ μ 컨ν μ€νΈμ μλ λ³μμ λͺ¨λ μ κ·Όν μ μλ€.
μ μ 컨ν μ€νΈλ μ μ 컨ν μ€νΈμ μλ λ³μμ ν¨μμλ§ μ κ·Όν μ μμΌλ©°, λ‘컬(ν¨μ) 컨ν μ€νΈμ μλ λ°μ΄ν°μ μ§μ μ μΌλ‘ μ κ·Όν μλ μλ€.
μ€ν 컨ν μ€νΈλ λ³μμ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό μΈμ ν΄μ ν μ μλμ§ νλ¨νλλ° λμμ΄λλ€.
μλ°μ€ν¬λ¦½νΈλ μλμΌλ‘ κ°λΉμ§ 컬λ μ μ μννλ―λ‘ κ°λ°μκ° λ©λͺ¨λ¦¬ ν λΉκ³Ό νμμν¬κ² μ κ²½ μΈ νμλ μλ€. μλ°μ€ν¬λ¦½νΈμ κ°λΉμ§ 컬λ μ 루ν΄μ λ€μκ³Ό κ°λ€.
κ°μ΄ μ€μ½νλ₯Ό λ²μ΄λλ©΄ μλμΌλ‘ νμλκ³ λ€μμ κ°λΉμ§ 컬λ μ μ μ€νν λ μμ λλ€.
μ£Όλ‘ μ°μ΄λ κ°λΉμ§ 컬λ μ μκ³ λ¦¬μ¦μ "νμνκ³ μ§μ°κΈ°"μ΄λ€.
λ€λ₯Έ μκ³ λ¦¬μ¦μ "μ°Έμ‘° μΉ΄μ΄ν "μΈλ° μ΄ λ°©λ²μ μν μ°Έμ‘° λ¬Έμ κ° μλ€.
λ³μμμ μ°Έμ‘°λ₯Ό μ κ±°νλ©΄ μν μ°Έμ‘° λ¬Έμ λ ν΄κ²°ν μ μκ³ , κ°λΉμ§ μ½λ μ μλ λμμ΄ λλ€.
ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκΈ° μν΄μλ μ μ κ°μ²΄, μ μ κ°μ²΄μ νλ‘νΌν°, μν μ°Έμ‘°μ λνμ°Έμ‘°λ₯Ό μ κ±°ν΄μΌ νλ€.
#
μ°Έκ³ μλ£Explaining Value vs. Reference in Javascript
Understanding JavaScript Pass By Value
[μλ°μ€ν¬λ¦½νΈ] new String("")κ³Ό ""(String literal)κ³Ό String("")μ λνμ¬