본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 3 : λ„€μ΄ν‹°λΈŒ

Table of Contents
  • κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” λ„€μ΄ν‹°λΈŒλ“€

String, Number, Boolean, Array, Object, Function, RegExp, Date, Error, Symbol

  • λ„€μ΄ν‹°λΈŒλŠ” λ‚΄μž₯ ν•¨μˆ˜μ΄λ‹€.
var a = new String('abc');
typeof a; // object
a instanceof String; // true
Object.prototype.toString.call(a); // "[object String]"
  • new String('abc') μƒμ„±μžμ˜ κ²°κ³ΌλŠ” μ›μ‹œ κ°’ abcλ₯Ό 감싼 객체 λ ˆνΌμ΄λ‹€.
  • typeof μ—°μ‚°μžλ‘œ 이 객체의 νƒ€μž…μ„ 확인해보면 μžμ‹ μ΄ 감싼 μ›μ‹œ κ°’μ˜ νƒ€μž…μ΄ μ•„λ‹Œ object의 ν•˜μœ„ νƒ€μž…μ— 가깝닀.
console.log(a); // StringΒ {"abc"}
  • new String('abc')은 abcλ₯Ό κ°μ‹ΈλŠ” λ¬Έμžμ—΄ 래퍼λ₯Ό μƒμ„±ν•˜λ©° μ›μ‹œ κ°’ abcλŠ” μ•„λ‹ˆλ‹€.

🎯 λ‚΄λΆ€ [[Class]]​

  • typeofκ°€ object인 κ°’μ—λŠ” [[Class]]λΌλŠ” λ‚΄λΆ€ ν”„λ‘œνΌν‹°κ°€ μΆ”κ°€λ‘œ λΆ™λŠ”λ‹€.
  • 이 ν”„λ‘œνΌν‹°λŠ” 직접 μ ‘κ·Όν•  수 μ—†κ³  Object.prototype.toString()λΌλŠ” λ©”μ„œλ“œμ— 값을 λ„£μ–΄ ν˜ΈμΆœν•¨μœΌλ‘œμ¨ 쑴재λ₯Ό μ—Ώλ³Ό 수 μžˆλ‹€.
Object.prototype.toString.call([1, 2, 3]); // "[object Array]"

Object.prototype.toString.call(/regex-literal/i); // "[object RegExp]"
  • λ‚΄λΆ€ [[Class]] 값이, 배열은 Array μ •κ·œμ‹μ€ RegExp이닀.
  • λŒ€λΆ€λΆ„ λ‚΄λΆ€ [[Class]]λŠ” ν•΄λ‹Ή κ°’κ³Ό κ΄€λ ¨λœ λ‚΄μž₯ λ„€μ΄ν‹°λΈŒ μƒμ„±μžλ₯Ό κ°€λ¦¬ν‚€μ§€λ§Œ, 그렇지 μ•Šμ€ κ²½μš°λ„ μ‘΄μž¬ν•œλ‹€.
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
  • μœ„μ™€ 같이 Null(), Undefined() 같은 λ„€μ΄ν‹°λΈŒ μƒμ„±μžλŠ” μ—†μ§€λ§Œ λ‚΄λΆ€ [[Class]] 값은 Null, Undefined 이닀.
  • ν•˜μ§€λ§Œ κ·Έ λ°–μ˜ λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ 같은 λ‹¨μˆœ μ›μ‹œ 값은 λ°•μ‹±(Boxing) 과정을 κ±°μΉœλ‹€.
Object.prototype.toString.call('abc'); // "[object String]"
Object.prototype.toString.call(42); // "[object Number]"
Object.prototype.toString.call(true); // "[object Boolean]"
  • λ‚΄λΆ€ [[Class]] 값이 각각 String, Number, Boolean으둜 ν‘œμ‹œλœ κ²ƒμœΌλ‘œ 보아 λ‹¨μˆœ μ›μ‹œ 값은 ν•΄λ‹Ή 객체 레퍼둜 μžλ™ 박싱됨을 μ•Œ 수 μžˆλ‹€.

🎯 래퍼 λ°•μ‹±ν•˜κΈ°β€‹

  • μ›μ‹œ κ°’μ—” ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œκ°€ μ—†μœΌλ―€λ‘œ .length, .toString()으둜 μ ‘κ·Όν•˜λ €λ©΄ μ›μ‹œ 값을 객체 래퍼둜 κ°μ‹Έμ€˜μ•Ό ν•œλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›μ‹œ 값을 μ•Œμ•„μ„œ λ°•μ‹±(λž˜ν•‘) ν•˜λ―€λ‘œ λ‹€μŒκ³Ό 같은 μ½”λ“œκ°€ κ°€λŠ₯ν•˜λ‹€.
var a = 'abc';

a.length; // 3
a.toUpperCase(); // 'ABC'
  • λ”°λΌμ„œ 루프 쑰건 i < a.length 처럼 λΉˆλ²ˆν•˜κ²Œ λ¬Έμžμ—΄ κ°’μ˜ ν”„λ‘œνΌν‹°/λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ•”μ‹œμ μœΌλ‘œ 객체λ₯Ό 생성할 ν•„μš”κ°€ 없도둝 μ²˜μŒλΆ€ν„° 값을 객체둜 κ°–κ³  μžˆλŠ” 것이 μ΄μΉ˜μ— λ§žλŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, 쒋은 생각이 μ•„λ‹ˆλ‹€.
  • κ°œλ°œμžκ°€ 직접 객체 ν˜•νƒœλ‘œ(μ΅œμ ν™”λ˜μ§€ μ•Šμ€ λ°©ν–₯으둜) μ„  μ΅œμ ν™”(pre-Optimize)ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ 더 느렀질 수 μžˆλ‹€.
  • 직접 객체 ν˜•νƒœλ‘œ 써야 ν•  μ΄μœ λŠ” 거의 μ—†κ³ , ν•„μš”μ‹œ 엔진이 μ•Œμ•„μ„œ μ•”μ‹œμ μœΌλ‘œ λ°•μ‹±ν•˜κ²Œ ν•˜λŠ” 것이 λ‚«λ‹€.

πŸ“š 객체 래퍼의 함정​

  • λ‹€μŒ μ˜ˆμ œλŠ” Boolean으둜 λž˜ν•‘ν•œ 값이 μžˆλ‹€.
var a = new Boolean(false);

if(!a) {
console.log('Oops'); // μ‹€ν–‰ X
}
  • falseλ₯Ό 객체 래퍼둜 κ°μŒŒμ§€λ§Œ λ¬Έμ œλŠ” 객체가 truthyλž€ 점이닀.
  • κ·Έλž˜μ„œ μ˜ˆμƒκ³Ό 달리, μ•ˆμ— λ“€μ–΄μžˆλŠ” falseκ°’κ³Ό λ°˜λŒ€μ˜ 결과이닀.
  • μˆ˜λ™μœΌλ‘œ μ›μ‹œ 값을 λ°•μ‹±ν•˜λ €λ©΄ Object() ν•¨μˆ˜λ₯Ό μ΄μš©ν•œλ‹€.
var a = 'abc';
var b = new String(a);
var c = Object(a);

typeof a; // "string"
typeof b; // "object"
typeof c; // "object"

b instanceof String; // true
c instanceof String; // true

Object.prototype.toString.call(b); // "[object String]"
Object.prototype.toString.call(c); // "[object String]"
  • ν•˜μ§€λ§Œ 객체 레퍼둜 직접 λ°•μ‹±ν•˜λŠ” 건 κΆŒν•˜μ§€ μ•ŠλŠ”λ‹€.

🎯 언박싱​

  • 객체 래퍼의 μ›μ‹œ 값은 valueOf() λ©”μ„œλ“œλ‘œ μΆ”μΆœν•œλ‹€.
var a = new String('abc');
var b = new Number(42);
var c = new Boolean(true);

a.valueOf(); // 'abc'
b.valueOf(); // 42
c.valueOf(); // true
  • μ΄λ•Œλ„ μ•”μ‹œμ μΈ 언박싱이 μΌμ–΄λ‚œλ‹€. (μžμ„Έν•œ 사항 κ°•μ œλ³€ν™˜μ€ 4μž₯μ—μ„œ)
var a = new String('abc');
var b = a + ''; // 'b'μ—λŠ” μ–Έλ°•μ‹±λœ μ›μ‹œ κ°’ 'abc'이 λŒ€μž…λœλ‹€.

typeof a; // "object"
typeof b; // "string"

🎯 λ„€μ΄ν‹°λΈŒ, λ‚˜λŠ” μƒμ„±μžλ‹€.​

  • λ°°μ—΄, 객체, ν•¨μˆ˜, μ •κ·œμ‹ 값은 λ¦¬ν„°λŸ΄ ν˜•νƒœλ‘œ μƒμ„±ν•˜λŠ” 것이 μΌλ°˜μ μ΄μ§€λ§Œ, λ¦¬ν„°λŸ΄μ€ μƒμ„±μž ν˜•μ‹μœΌλ‘œ λ§Œλ“  것과 λ™μΌν•œ μ’…λ₯˜μ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€.
  • ν•„μš”ν•΄μ„œ μ“°λŠ” 게 μ•„λ‹ˆλΌλ©΄ μƒμ„±μžλŠ” 가급적 쓰지 μ•ŠλŠ” 편이 μ’‹λ‹€.

πŸ“š Array()​

var a = new Array(1, 2, 3);
a; // [1, 2, 3]

var b = [1, 2, 3];
b; // [1, 2, 3]

Array() μƒμ„±μž μ•žμ— newλ₯Ό 뢙이지 μ•Šμ•„λ„ λœλ‹€. 뢙이지 μ•Šμ•„λ„ 뢙인 κ²ƒμ²˜λŸΌ μž‘λ™ν•œλ‹€. 즉, Array(1, 2, 3)와 new Array(1, 2, 3) 와 κ°™λ‹€.

  • Array μƒμ„±μžλŠ” 인자둜 숫자λ₯Ό ν•˜λ‚˜λ§Œ λ°›μœΌλ©΄ κ·Έ 숫자λ₯Ό μ›μ†Œλ‘œν•˜λŠ” 배열을 μƒμ„±ν•˜λŠ” 게 μ•„λ‹ˆλΌ λ°°μ—΄μ˜ 크기λ₯Ό 미리 μ •ν•˜λŠ” κΈ°λŠ₯이닀.
  • ν•˜μ§€λ§Œ λ°°μ—΄μ˜ 크기λ₯Ό 미리 μ •ν•œλ‹€λŠ” 것 μžμ²΄κ°€ 밀이 μ•ˆ λœλ‹€.
  • κ·Έλ ‡κ²Œ ν•˜λ €λ©΄ 빈 배열을 λ§Œλ“€κ³  λ‚˜μ€‘μ— length ν”„λ‘œνΌν‹°μ— 숫자 값을 ν• λ‹Ήν•˜λŠ” 게 λ§žλ‹€.

빈 μŠ¬λ‘―μ„ ν•œ ꡰ데 이상 가진 배얼을 ꡬ멍 λ‚œ λ°°μ—΄(Sparse Array)라고 ν•œλ‹€.

var a = new Array(3);
var b = [undefined, undefined, undefined];
var c = [];
c.length = 3;

a; // [empty Γ— 3]
b; // [undefined, undefined, undefined]
c; // [empty Γ— 3]
  • λΈŒλΌμš°μ € 개발자 μ½˜μ†” μ°½ λ§ˆλ‹€ 객체λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 방식이 제각각이라 ν˜Όλž€μ΄ κ°€μ€‘λœλ‹€.
  • a와 bκ°€ μ–΄λ–¨ λ•ŒλŠ” 같은 κ°’μ²˜λŸΌ 보이닀가도 그렇지 μ•Šμ„ λ•Œλ„ μžˆλ‹€.
a.join('-'); // "--"
b.join('-'); // "--"

a.map(function(v, i){return i;}); // [empty Γ— 3]
b.map(function(v, i){return i;}); // [0, 1, 2]
  • a.map()은 a에 슬둯이 μ—†κΈ° λ•Œλ¬Έμ— map() ν•¨μˆ˜κ°€ μˆœνšŒν•  μ›μ†Œκ°€ μ—†λ‹€.
  • join()은 κ΅¬ν˜„ 둜직이 λ‹€μŒκ³Ό κ°™κΈ° λ•Œλ¬Έμ— λ‹€λ₯΄λ‹€.
function fakeJoin(arr, connector) {
var str = '';
for(var i = 0; i < arr.length; i++) {
if(i > 0) {
str += connector;
}
if(arr[i] !== undefined) {
str += arr[i];
}
}
return str;
}

var a = new Array(3);
fakeJoin(a, '-'); // "--"
  • join()은 슬둯이 μžˆλ‹€λŠ” κ°€μ •ν•˜μ— length만큼 루프λ₯Ό λ°˜λ³΅ν•œλ‹€.
  • map() ν•¨μˆ˜λŠ” 빈 슬둯 배열이 μž…λ ₯되면 예기치 μ•Šμ€ κ²°κ³Όκ°€ λΉšμ–΄μ§€κ±°λ‚˜ μ‹€νŒ¨μ˜ 원인이 λœλ‹€.
  • μ§„μ§œ undefined κ°’ μ›μ†Œλ‘œ μ±„μ›Œμ§„ 배열은 μ–΄λ–»κ²Œ μƒμ„±ν• κΉŒ?
var a = Array.apply(null, { length: 3 });
a; // [undefined, undefined, undefined]
  • apply()λŠ” λͺ¨λ“  ν•¨μˆ˜μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ μœ ν‹Έλ¦¬ν‹°μ΄λ‹€.
  • 첫 번째 인자 thisλŠ” 객체 λ°”μΈλ”©μœΌλ‘œ, null둜 μ„ΈνŒ…ν–ˆλ‹€.
  • 두 번째 μΈμžλŠ” 인자의 λ°°μ—΄(λ˜λŠ” λ°°μ—΄ λΉ„μŠ·ν•œ μœ μ‚¬ λ°°μ—΄)둜, 이 μ•ˆμ— ν¬ν•¨λœ μ›μ†Œλ“€μ΄ 펼쳐져(Spread) ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬λœλ‹€.
  • λ”°λΌμ„œ Array.apply()λŠ” Array() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λ™μ‹œμ— { length: 3 } 객체 값을 펼처 인자둜 λ„£λŠ”λ‹€.
  • apply() λ‚΄λΆ€μ—μ„œλŠ” μ•„λ§ˆ 0μ—μ„œ length μ§μ „κΉŒμ§€ 루프λ₯Ό μˆœνšŒν•  것이닀.
  • μΈλ±μŠ€λ³„λ‘œ κ°μ²΄μ—μ„œ ν‚€λ₯Ό κ°€μ Έμ˜¨λ‹€. (arr[0], arr[1], arr[2])
  • λ¬Όλ‘  이 μ„Έ ν”„λ‘œνΌν‹°λ„ λͺ¨λ‘ { length: 3 } κ°μ²΄μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λͺ¨λ‘ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • 즉, Array()λ₯Ό ν˜ΈμΆœν•˜λ©΄ Array(undefined, undefined, undefined)처럼 λ˜μ–΄, 빈 슬둯이 μ•„λ‹Œ, undefined둜 μ±„μ›Œμ§„ 배열이 νƒ„μƒν•œλ‹€.
  • μ ˆλŒ€λ‘œ 빈 슬둯 배열을 애써 λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜μ§€ 말자.

πŸ“š Object(), Function(), and RegExp()​

  • 일반적으둜 Object(), Function(), RegExp() μƒμ„±μžλ„ 선택 사항이닀.(λΆ„λͺ…ν•œ μ˜λ„κ°€ μ•„λ‹ˆλ©΄ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 편이 μ’‹λ‹€).
var c = new Object();
c.foo = 'bar';
c; // { foo: 'bar' }

var d = { foo: 'bar' };
d; // { foo: 'bar' }

var e = new Function('a', 'return a * 2;');
var f = function(a) { return a * 2; }
function g(a) { return a * 2; }

var h = new RegExp('^a*b+', 'g');
var i = /^a*b+/g;
  • new Object() 같은 μƒμ„±μž 폼은 사싀상 μ‚¬μš©ν•  일이 μ—†λ‹€.
  • Function μƒμ„±μžλŠ” ν•¨μˆ˜μ˜ μΈμžλ‚˜ λ‚΄μš©μ„ λ™μ μœΌλ‘œ μ •μ˜ν•΄μ•Ό ν•˜λŠ”, 맀우 λ“œλ¬Έ κ²½μš°μ— ν•œν•΄ μœ μš©ν•˜λ‹€.
  • μ •κ·œ ν‘œν˜„μ‹μ€ λ¦¬ν„°λŸ΄ ν˜•μ‹μœΌλ‘œ μ •μ˜ν•  것을 적극 ꢌμž₯ν•œλ‹€. ꡬ문이 쉽고 무엇보닀 μ„±λŠ₯상 이점이 μžˆλ‹€.
  • RegExp()λŠ” μ •κ·œ ν‘œν˜„μ‹ νŒ¨ν„΄μ„ λ™μ μœΌλ‘œ μ •μ˜ν•  경우 의미 μžˆλŠ” μœ ν‹Έλ¦¬ν‹°λ‹€.
var name = 'kyle';
var namePattern = new RegExp('\\b(?:' + name + ')+\\b', 'ig');

var matches = someText.match(namePattern);

πŸ“š Date() and Error()​

  • λ„€μ΄ν‹°λΈŒ μƒμ„±μž Date()와 Error()λŠ” λ¦¬ν„°λŸ΄ ν˜•μ‹μ΄ μ—†μœΌλ―€λ‘œ λ‹€λ₯Έ λ„€μ΄ν‹°λΈŒμ— λΉ„ν•΄ μœ μš©ν•˜λ‹€.
  • date 객체 값은 new Date()둜 μƒμ„±ν•œλ‹€.
  • ES5에 μ •μ˜λœ 정적 λ„μš°λ―Έ ν•¨μˆ˜(Helper Function), Date.now()λ₯Ό μ‚¬μš©ν•˜λŠ” 게 더 쉽닀. (getTime() 보닀)
  • Error() μƒμ„±μžλŠ” μ•žμ— newκ°€ μžˆλ“  μ—†λ“  κ²°κ³ΌλŠ” κ°™λ‹€.
  • error 객체의 μ£Ό μš©λ„λŠ” ν˜„μž¬μ˜ μ‹€ν–‰ μŠ€νƒ μ½˜ν…μŠ€νŠΈ(Execution Stack Context)λ₯Ό ν¬μ°©ν•˜μ—¬ 객체에 담은 것이닀.
  • 이 μ‹€ν–‰ μŠ€νƒ μ½˜ν…μŠ€νŠΈλŠ” ν•¨μˆ˜ 호좜 μŠ€νƒ, error 객체가 λ§Œλ“€μ–΄μ§„ 쀄 번호 λ“± 디버깅에 도움이 될 λ§Œν•œ 정보듀을 λ‹΄κ³  μžˆλ‹€.
  • error κ°μ²΄λŠ” 보톡 throw μ—°μ‚°μžμ™€ ν•¨κ»˜ μ‚¬μš©ν•œλ‹€.
function foo(x) {
if(!x) {
throw new Error('error..');
}
// ...
}

πŸ“š Symbol()​

  • ES6μ—μ„œ 처음 선보인, μƒˆλ‘œμš΄ μ›μ‹œ κ°’ νƒ€μž…μ΄λ‹€.
  • μ‹¬λ²Œμ€ 좩돌 μ—Όλ € 없이 객체 ν”„λ‘œνΌν‹°λ‘œ μ‚¬μš© κ°€λŠ₯ν•œ, νŠΉλ³„ν•œ 유일 값이닀.(μ ˆλŒ€μ μœΌλ‘œ μœ μΌν•¨μ΄ 보μž₯λ˜μ§€λŠ” μ•ŠλŠ”λ‹€.)
  • μ‹¬λ²Œμ€ ν”„λ‘œνΌν‹°λͺ…μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμœΌλ‚˜, ν”„λ‘œκ·Έλž¨ μ½”λ“œλ‚˜ 개발자 μ½˜μ†” μ°½μ—μ„œ μ‹¬λ²Œμ˜ μ‹€μ œ 값을 λ³΄κ±°λ‚˜ μ ‘κ·Όν•˜λŠ” 건 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • ES6μ—λŠ” Symbol.create, Symbol.iterator μ‹μœΌλ‘œ Symbol ν•¨μˆ˜ 객체의 정적 ν”„λ‘œνΌν‹°λ‘œ μ ‘κ·Όν•œλ‹€.
obj[Symbol.iterator] = function() { /* ... */ };
  • μ‹¬λ²Œμ„ 직접 μ •μ˜ν•˜λ €λ©΄ Symbol() λ„€μ΄ν‹°λΈŒλ₯Ό μ‚¬μš©ν•œλ‹€.
  • Symbol()은 μ•žμ— newλ₯Ό 뢙이면 μ—λŸ¬κ°€ λ‚˜λŠ”, μœ μΌν•œ λ„€μ΄ν‹°λΈŒ μƒμ„±μžλ‹€.
var mysym = Symbol('my symbol');
mysym; // Symbol(my symbol)
mysym.toString(); // "Symbol(my symbol)"
typeof mysym; // "symbol"

var a = { };
a[mysym] = 'foobar';
Object.getOwnPropertySymbols(a); // [Symbol(my symbol)]
  • μ‹¬λ²Œμ€ μ „μš©(Private) ν”„λ‘œνΌν‹°λŠ” μ•„λ‹ˆμ§€λ§Œ, 본래의 μ‚¬μš© λͺ©μ μ— 맞게 λŒ€λΆ€λΆ„ μ „μš© ν˜Ήμ€ νŠΉλ³„ν•œ ν”„λ‘œνΌν‹°λ‘œ μ‚¬μš©ν•œλ‹€.
  • μ‹¬λ²Œμ€ 객체가 μ•„λ‹ˆλ‹€. λ‹¨μˆœν•œ 슀칼라 μ›μ‹œ 값이닀.

πŸ“š λ„€μ΄ν‹°λΈŒ ν”„λ‘œν† νƒ€μž…β€‹

  • λ‚΄μž₯ λ„€ν‹°μ΄λΈŒ μƒμ„±μžλŠ” 각자의 .prototype 객체λ₯Ό 가진닀.(Array.prototype..)

prototype κ°μ²΄μ—λŠ” ν•΄λ‹Ή 객체의 ν•˜μœ„ νƒ€μž…λ³„λ‘œ κ³ μœ ν•œ 둜직이 담겨 μžˆλ‹€.

  • λ¬Έμžμ—΄ μ›μ‹œ 값을 ν™•μž₯ν•œ κ²ƒκΉŒμ§€ ν¬ν•¨ν•˜μ—¬ λͺ¨λ“  String κ°μ²΄λŠ” 기본적으둜 String.prototype 객체에 μ •μ˜λœ λ©”μ„œλ“œμ— μ ‘κ·Όν•  수 μžˆλ‹€.
String.prototype.indexOf() // λ¬Έμžμ—΄μ—μ„œ νŠΉμ • 문자의 μœ„μΉ˜λ₯Ό 검색
String.prototype.charAt() // λ¬Έμžμ—΄μ—μ„œ νŠΉμ • μœ„μΉ˜μ˜ 문자λ₯Ό λ°˜ν™˜
String.prototype.substr(), substring(), slice() // λ¬Έμžμ—΄ 일뢀λ₯Ό μƒˆλ‘œμš΄ λ¬Έμžμ—΄λ‘œ μΆ”μΆœ
String.prototype.toUpperCase(), toLowerCase() // λŒ€μ†Œλ¬Έμž λ³€ν™˜λœ λ¬Έμžμ—΄ 생성
String.prototype.trim() // μ•ž/λ’€ κ³΅λž€μž‰ 제거된 μƒˆλ‘œμš΄ λ¬Έμžμ—΄ 생성
  • 이 쀑 λ¬Έμžμ—΄ 값을 λ³€κ²½ν•˜λŠ” λ©”μ„œλ“œλŠ” μ—†λ‹€.
  • μˆ˜μ •μ΄ μΌμ–΄λ‚˜λ©΄ 늘 κΈ°μ‘΄ κ°’μœΌλ‘œλΆ€ν„° μƒˆλ‘œμš΄ 값을 μƒμ„±ν•œλ‹€.
  • ν”„λ‘œν† νƒ€μž… μœ„μž„(Prototype Delegation) 덕뢄에 λͺ¨λ“  λ¬Έμžμ—΄μ΄ 이 λ©”μ„œλ“œλ“€μ„ 가이 μ“Έ 수 μžˆλ‹€.
var a = ' abc ';

a.indexOf('c'); // 3
a.toUpperCase(); // ' ABC ';
a.trim(); // 'abc'
  • λͺ¨λ“  λ„€μ΄ν‹°λΈŒ ν”„λ‘œν† νƒ€μž…μ΄ ν‰λ²”ν•œ 것은 μ•„λ‹ˆλ‹€.
typeof Function.prototype; // 'function'
Function.prototype(); // 빈 ν•¨μˆ˜

RegExp.prototype.toString(); // "/(?:)/" - 빈 regex
  • λ„€μ΄ν‹°λΈŒ ν”„λ‘œν† νƒ€μž…μ„ λ³€κ²½ν•  μˆ˜λ„ μžˆμ§€λ§Œ λ°”λžŒμ§ν•˜μ§€ λͺ»ν•˜λ‹€.
Array.isArray(Array.prototype); // true
Array.prototype.push(1, 2, 3); // 3
Array.prototype; // [1, 2, 3]

// 이런 μ‹μœΌλ‘œ 놔두면 μ΄μƒν•˜κ²Œ μž‘λ™ν•  수 μžˆλ‹€.
Array.prototype.length = 0;
  • ν”„λ‘œν† νƒ€μž…μ€ λ””ν΄νŠΈλ‹€
  • λ³€μˆ˜μ— μ μ ˆν•œ 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ Function.prototype -> 빈 ν•¨μˆ˜, RegExp.prototype -> 빈 μ •κ·œμ‹, Array.prototype -> 빈 배열은 λͺ¨λ‘ λ””ν΄λ“œ 값이닀.
  • ν”„λ‘œν† νƒ€μž…μœΌλ‘œ λ””ν΄νŠΈ 값을 μ„ΈνŒ…ν•˜λ©΄ 좔가적인 이점이 μžˆλ‹€.
  • .prototype듀은 이미 μƒμ„±λ˜μ–΄ λ‚΄μž₯된 μƒνƒœμ΄λ―€λ‘œ 단 ν•œ 번만 μƒμ„±λœλ‹€.
  • μ–΄λ–€ μ‹μœΌλ‘œλ„ ν”„λ‘œν† νƒ€μž…μ„ λ³€κ²½ν•˜μ§€ μ•Šλ„λ‘ μœ μ˜ν•΄μ•Ό ν•œλ‹€.

🎯 μ •λ¦¬ν•˜κΈ°β€‹

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›μ‹œ 값을 κ°μ‹ΈλŠ” 객체 레퍼, 즉 λ„€μ΄ν‹°λΈŒλ₯Ό μ œκ³΅ν•œλ‹€. (String, Number)
  • 객체 λ ˆνΌμ—λŠ” νƒ€μž…λ³„λ‘œ μ“Έ λ§Œν•œ κΈ°λŠ₯이 κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. (ex. trim(), concat())
  • abc같은 λ‹¨μˆœ 슀칼라 μ›μ‹œ 값이 μžˆμ„ λ•Œ, 이 κ°’μ˜ length ν”„λ‘œνΌν‹°λ‚˜ String.prototype에 μ •μ˜λœ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μžλ™μœΌλ‘œ μ›μ‹œ 값을 λ°•μ‹±(ν•΄λ‹Ήλ˜λŠ” 객체 레퍼둜 감싼닀.)ν•˜μ—¬ ν•„μš”ν•œ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό μ“Έ 수 있게 도와쀀닀.