λ€μ 쑰건μ λ§μ‘±νλ κ°μ²΄λ μΌκΈ κ°μ²΄
λΌκ³ νλ€.
- 무λͺ
μ 리ν°λ΄λ‘ μμ±ν μ μλ€. μ¦,
λ°νμμ μμ±μ΄ κ°λ₯νλ€.
λ³μλ μλ£κ΅¬μ‘°(κ°μ²΄, λ°°μ΄ λ±)μ μ μ₯ν μ μλ€.
ν¨μμ 맀κ°λ³μμ μ λ¬ν μ μλ€.
ν¨μμ λ°νκ°μΌλ‘ μ¬μ©ν μ μλ€.
// ν¨μλ 무λͺ
리ν°λ΄λ‘ μμ±κ°λ₯
// ν¨μλ λ³μμ μ μ₯ κ°λ₯
// λ°νμ μμ μ ν¨μ 리ν°λ΄μ΄ νκ°λμ΄ ν¨μ κ°μ²΄κ° μμ±λκ³ λ³μμ ν λΉ λλ€.(μ ννλ ν¨μ κ°μ²΄μ μ°Έμ‘°κ°μ΄ ν λΉ λλ€.)
const increase = function (num) {
return ++num;
};
const decrease = function (num) {
return --num;
};
// ν¨μλ κ°μ²΄μ μ μ₯ν μ μλ€.
const predicate = { increase, decrease };
// ν¨μλ 맀κ°λ³μ(= νλΌλ―Έν°, parameter)μ μ λ¬ν μ μλ€.
// ν¨μλ ν¨μμ λ°ν κ°μΌλ‘ μ¬μ©ν μ μλ€.
function makeCounter(predicate) {
let num = 0;
return function () {
num = predicate(num);
return num;
};
}
// ν¨μλ μΈμλ‘ ν¨μλ₯Ό μ λ¬ν μ μλ€.
const increaser = makeCounter(predicate.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2
const decreaser = makeCounter(predicate.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2
μΌκΈ κ°μ²΄λ‘μ¨ ν¨μκ° κ°μ§λ κ°μ₯ ν° νΉμ§
- μΌλ° κ°μ²΄μ κ°μ΄
ν¨μλ₯Ό ν¨μμ 맀κ°λ³μμ μ λ¬
ν μ μλ€. - ν¨μμ
λ°νκ°μΌλ‘ ν¨μλ₯Ό μ¬μ©
ν μ μλ€. - λ€μ 2κ°μ§κ° μλ°μ€ν¬λ¦½νΈμ ν¨μν νλ‘κ·Έλλ°μ κ°λ₯μΌνλ μ₯μ μ€ νλ
- μΆκ°μ μΌλ‘, μΌλ° κ°μ²΄λ νΈμΆν μ μμ§λ§ ν¨μ κ°μ²΄λ νΈμΆμ΄ κ°λ₯νλ©°, ν¨μ κ°μ²΄λ κ³ μ μ νλ‘νΌν°λ₯Ό μμ νλ€.
ν¨μλ κ°μ²΄(object)λ€
. λ°λΌμν¨μλ νλ‘νΌν°λ₯Ό κ°μ§ μ μλ€.
arguments κ°μ²΄
λ ν¨μ νΈμΆ μμ λ¬λ μΈμ(argument)λ€μ μ 보λ₯Ό λ΄κ³ μλ μν κ°λ₯ν(iterable) μ μ¬ λ°°μ΄ κ°μ²΄
μ΄λ€.
- ν¨μ λ΄λΆμμ μ§μ λ³μμ²λΌ μ¬μ©ν μ μλ
arguments κ°μ²΄λ₯Ό μ°Έμ‘°
- μλ°μ€ν¬λ¦½νΈμμλ ν¨μμ 맀κ°λ³μ(parameter)μ μΈμ(argument)μ κ°μκ° μΌμΉνλμ§ νμΈνμ§ μλλ€.
- λ°λΌμ, ν¨μ νΈμΆ μ 맀κ°λ³μ μλ§νΌ μΈμλ₯Ό μ λ¬νμ§ μμλ μλ¬κ° λ°μνμ§ μλλ€.
- μ΄λ, ν¨μλ₯Ό μ μν λ μ μΈν 맀κ°λ³μλ ν¨μκ° νΈμΆλλ©΄ ν¨μ λͺΈμ²΄ λ΄μμ μ묡μ μΌλ‘ μ μΈλκ³
undefined
λ‘ μ΄κΈ°νλ ν, μΈμκ° ν λΉλκΈ° λλ¬Έ
- 맀κ°λ³μλ³΄λ€ μΈμ(argument)λ₯Ό λ§μ΄ μ λ¬νμ κ²½μ°, μ΄κ³Όλ μΈμλ 무μλμ§ μκ³ ,
arguments κ°μ²΄μ νλ‘νΌν°μ 보κ΄
arguments κ°μ²΄
λ κΈ°λ³Έμ μΌλ‘length
νλ‘νΌν°λ₯Ό μ§μνλ€.- μ¬κΈ°μ
lengthλ μΈμ(argument)μ κ°μμ΄λ€.
length νλ‘νΌν°
λ₯Ό μ¬μ©ν μ μλ μ΄μ λarguments κ°μ²΄
κ°μ μ¬ λ°°μ΄ κ°μ²΄(array-like object)
μ΄κΈ° λλ¬Έμ΄λ€.- μ μ¬ λ°°μ΄ κ°μ²΄λ
length νλ‘νΌν°
λ₯Ό κ°μ§λ κ°μ²΄λ‘,for λ¬Έ
κ°μ λ°λ³΅λ¬ΈμΌλ‘ μνκ°λ₯νλ€.
- μ μ¬ λ°°μ΄ κ°μ²΄λ
arguments κ°μ²΄
λ 맀κ°λ³μ κ°μλ₯Ό νμ ν μ μλκ°λ³ μΈμ ν¨μ
λ₯Ό ꡬνν λ μ μ©νλ€.
function multiply(x, y) {
console.log(arguments);
console.log(`length : ${arguments.length}`);
return x + y;
}
console.log(multiply());
/*
[Arguments] {}
length : 0
NaN
*/
console.log(multiply(1));
/*
[Arguments] { '0': 1 }
length : 1
NaN
*/
console.log(multiply(1, 2));
/*
[Arguments] { '0': 1, '1': 2 }
length : 2
3
*/
console.log(multiply(1, 2, 3, 4, 5));
/*
[Arguments] { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
length : 5
3
*/
arguments κ°μ²΄
λ μ μ¬ λ°°μ΄ κ°μ²΄μ΄μ§, λ°°μ΄ κ·Έ μ체λ μλλ€.- λ°λΌμ, λ°°μ΄ λ©μλλ₯Ό μ¬μ©ν κ²½μ° μλ¬κ° λ°μνλ€.
- μ΄κ²μ 보μν λ°©λ²μΌλ‘
ES6
λΆν°Rest νλΌλ―Έν°
κ° λμ λμλ€. - Rest νλΌλ―Έν°λ₯Ό ν΅ν΄
λ°°μ΄ λ©μλλ₯Ό μ μ©ν μ μλ€.
// ES6 Rest Parameter
// argument κ°μ²΄λ₯Ό μ€μ "λ°°μ΄"μ²λΌ μ¬μ©ν μ μλ€.
function sum(...args) {
console.log(args, Array.isArray(args));
return args.reduce((acc, cur) => acc + cur, 0);
}
console.log(sum());
/*
[] true
0
*/
console.log(sum(1, 2));
/*
[ 1, 2 ] true
3
*/
console.log(sum(1, 2, 3, 4, 5));
/*
[ 1, 2, 3, 4, 5 ] true
15
*/
ν¨μ κ°μ²΄μ
length νλ‘νΌν°
λ ν¨μλ₯Ό μ μν λμ μΈν 맀κ°λ³μμ κ°μ
λ₯Ό κ°λ¦¬ν¨λ€.
- μ£Όμν μ μ
arguments κ°μ²΄
μlength νλ‘νΌν°
β ν¨μ κ°μ²΄μlength νλ‘νΌν°
argument κ°μ²΄μ length νλ‘νΌν°
=μΈμ(argument)μ κ°μ
ν¨μ κ°μ²΄μ length νλ‘νΌν°
=맀κ°λ³μ(parameter)μ κ°μ
function add(x, y) {
console.log(`add ν¨μ κ°μ²΄μ length : ${add.length}, arguments κ°μ²΄μ length : ${arguments.length}`);
return x + y;
}
console.log(add());
/*
add ν¨μ κ°μ²΄μ length : 2, arguments κ°μ²΄μ length : 0
NaN
*/
console.log(add(1, 2));
/*
add ν¨μ κ°μ²΄μ length : 2, arguments κ°μ²΄μ length : 2
3
*/
console.log(add(1, 2, 3, 4, 5));
/*
add ν¨μ κ°μ²΄μ length : 2, arguments κ°μ²΄μ length : 5
3
*/
ν¨μ κ°μ²΄μ
name νλ‘νΌν°
λν¨μ μ΄λ¦
μ λνλΈλ€.
- μ΅λͺ
ν¨μμ κ²½μ°
ES5
μμλ βλΉ λ¬Έμμ΄('')
ES6
μμλ βν¨μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ μλ³μ
λ₯Ό λνλΈλ€.
// ν¨μ κ°μ²΄ name νλ‘νΌν° - κΈ°λͺ
ν¨μ ννμ
const namedFunc = function foo() {};
console.log(namedFunc.name); // foo
// ν¨μ κ°μ²΄ name νλ‘νΌν° - 무λͺ
ν¨μ ννμ π
// - ES5 μμλ λΉ λ¬Έμμ΄('')
// - ES6 μμλ ν¨μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ μλ³μ
const anonymousFunc = function () {};
console.log(anonymousFunc.name); // anonymousFunc
function bar() {}
console.log(bar.name); // bar
- λͺ¨λ κ°μ²΄λ
[[ Prototype ]]
μ΄λΌλ λ΄λΆ μ¬λ‘―μ κ°λλ€. [[ Prototype ]]
λ΄λΆ μ¬λ‘―μPrototype κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
__proto__
νλ‘νΌν°λ[[ Prototype ]]
λ΄λΆ μ¬λ‘―μ΄ κ°λ¦¬ν€λ νλ‘ν νμ κ°μ²΄μ μ κ·ΌνκΈ° μν΄ μ¬μ©νλμ κ·Όμ νλ‘νΌν°
- μ¦, μ΄ νλ‘νΌν°μ μ§μ μ κ·Όν μλ μκ³ , κ°μ μ μΈ λ°©λ²μΌλ‘ νλ‘ν νμ μ μ κ·Όν μ μλ€.
const obj = { a: 1 };
console.log(obj.__proto__ === Object.prototype); // true (κ°μ²΄ 리ν°λ΄ ννλ‘ μμ±ν κ°μ²΄μ νλ‘ν νμ
κ°μ²΄λ Object.prototype)
console.log(obj.hasOwnProperty("a")); // true (obj κ°μ²΄μλ a νλ‘νΌν°κ° μμΌλκΉ true)
console.log(obj.hasOwnProperty("__proto__")); // false (__proto__ μ κ·Όμ νλ‘νΌν°λ μ§μ μ κ·Όν μ μλ νλ‘νΌν°κ° μλλ―λ‘ false)
prototype
νλ‘νΌν°λμμ±μ ν¨μλ‘ νΈμΆν μ μλ ν¨μ κ°μ²΄
, μ¦constructor
λ§μ΄ μμ νλ νλ‘νΌν°
- μΌλ° κ°μ²΄λ
non-constructor
μλprototype νλ‘νΌν°κ° μλ€.
console.log(function () {}.hasOwnProperty("prototype")); // true (ν¨μ κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό μμ )
console.log({}.hasOwnProperty("prototype")); // false (μΌλ° κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό μμ νμ§ X)