Skip to content

ecmascript_3_1

KyusungDev edited this page Oct 10, 2017 · 5 revisions

for-of ๊ตฌ๋ฌธ๊ณผ iterator

๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

// twenty years ago,
for (var index = 0; index < myArray.length; index++) {
  console.log(myArray[index]);
}
// Since ES5
myArray.forEach(function (value) {
  console.log(value);
});

forEach๋Š” break๋‚˜ return์„ ์ด์šฉํ•ด ํ•จ์ˆ˜๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

// for-in?
for (var index in myArray) {    // ์‹ค์ œ ์ƒํ™ฉ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”
  console.log(myArray[index]);
}

for-in ๊ตฌ๋ฌธ์€ ๋ฐฐ์—ด ์ˆœํšŒ๋ฅผ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

  • index์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ "1","2","3"๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด์ด๋‹ค.
  • ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€๋œ ํ™•์žฅ ์†์„ฑ๊นŒ์ง€๋„ ๋ชจ๋‘ ์ˆœํšŒํ•œ๋‹ค.
  • ํŠน์ • ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฃจํ”„์˜ ์ˆœํšŒ ์ˆœ์„œ๊ฐ€ ๋ฌด์ž‘์œ„๋‹ค.

๊ฐœ์„ ์„ ์œ„ํ•œ ๋…ธ๋ ฅ

ํ˜„์กดํ•˜๋Š” ์ˆ˜๋ฐฑ๋งŒ๊ฐœ์˜ ์›น ์‚ฌ์ดํŠธ๊ฐ€ for-in ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— for-in์„ ๊ณ ์น ์ˆ˜ ์—†์—ˆ๊ธฐ์—,
์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋ฃจํ”„ ๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๋ฟ์ด์—ˆ๋‹ค.

์•„๋ž˜๊ฐ€ ๋…ธ๋ ฅ์˜ ๊ฒฐ๊ณผ๋ฌผ์ด๋‹ค.

// for-of
for (var value of myArray) {
  console.log(value);
}
  • ๋ฌธ๋ฒ•์ ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•˜๋‹ค.
  • for-in์˜ ๋‹จ์ ์„ ๋ชจ๋‘ ๋ฐฐ์ œํ•œ๋‹ค.
  • forEach() ๊ตฌ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ, break, continue, return ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค๋งŒ ์ˆœํšŒํ•œ๋‹ค.
  • Map, Set๊ณผ ๊ฐ™์€ collection ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. (์ดํ„ฐ๋ ˆ์ด๋ธ” ๊ฐ์ฒด ์ˆœํšŒ)
// Set iteration by for-of
var uniqueWords = new Set(words);
for (var word of uniqueWords) {
  console.log(word);
}
// Map iteration by for-of and destructuring
for (var [key, value] of phoneBookMap) {
  console.log(key + "'s phone number is: " + value);
}

for-of ๊ตฌ๋ฌธ์œผ๋กœ Object๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ for-of ๊ตฌ๋ฌธ์€ Object๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
for-of ๊ตฌ๋ฌธ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

for-of ๊ตฌ๋ฌธ์œผ๋กœ Object๋ฅผ ์ˆœํšŒํ•ด๋ณด์ž.

๊ทธ๋ ‡๋‹ค๋ฉด, for-of๋กœ Object๊ฐ€ ์ˆœํšŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์•ฝ์†(protocol)์„ ์ •ํ•˜๋ฉด Object๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?
์•ฝ์†์„ ์ •ํ•ด๋ณด์ž.

// Object์— ์ˆœํšŒ๊ฐ€๋Šฅํ•œ ์•ฝ์† ์ •ํ•˜๊ธฐ
var foo = {
  [Symbol.iterator]: () => ({
    items: ['p', 'o', 'n', 'y', 'f', 'o', 'o'],
    next: function next () {
      return {
        done: this.items.length === 0,
        value: this.items.shift()
      }
    }
  })
}

for (let pony of foo) {
  console.log(pony)
  // <- 'p'
  // <- 'o'
  // <- 'n'
  // <- 'y'
  // <- 'f'
  // <- 'o'
  // <- 'o'
}
// for-of in depth
for (VAR of ITERABLE) {
  STATEMENTS
}

var $iterator = ITERABLE[Symbol.iterator]();
var $result = $iterator.next();
while (!$result.done) {
  VAR = $result.value;
  STATEMENTS
  $result = $iterator.next();
}

Array, Map, Set์ด for-of ๊ตฌ๋ฌธ์œผ๋กœ ์ˆœํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฒƒ์€ ๊ณตํ†ต์ ์œผ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ(iterator) ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ : [Symbol.iterator]() ๋ฅผ ๊ตฌํ˜„
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ : next()๋ฅผ ๊ตฌํ˜„

Default Parameter

๋””ํดํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•จ์ˆ˜ํ˜ธ์ถœ์‹œ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๋ชจ๋‘ ์ฑ„์šธํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
ํŠน๋ณ„ํžˆ ๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ undefined์˜€์ง€๋งŒ ES6์—์„œ๋Š” ์ž„์˜์˜ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

function animalSentence(animals2="tigers", animals3="bears") {
    return `Lions and ${animals2} and ${animals3}! Oh my!`;
}

๋””ํดํŠธ ๊ฐ’์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค!

function animalSentenceFancy(animals2="tigers",
    animals3 = (animals2 === "bears") ? "sealions" : "bears")
{
  return `Lions and ${animals2} and ${animals3}! Oh my!`;
}

๋””ํดํŠธ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•”๋ฌต์ ์œผ๋กœ undefined์ด๋‹ค.

function myFunc(a=42, b) {...}
> function myFunc(a=42, b=undefined) {...}

Rest Parameter

ํ˜ธ์ถœ๋ฐ›๋Š” ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— spread ์—ฐ์‚ฐ์ž๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž‘์„ฑํ•œ ํ˜•ํƒœ๋ฅผ rest ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ€๋ณ€์ธ์ž๋ฅผ ๊ฐ€์ง„ function์„ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์ „ํ†ต์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

function containsAll(haystack) {
  for (var i = 1; i < arguments.length; i++) {
    var needle = arguments[i];
    if (haystack.indexOf(needle) === -1) {
      return false;
    }
  }
  return true;
}

๊ฐ€๋ณ€์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด arguments๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. arguments๋Š” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋ฉฐ, ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•  ๋•Œ ์ธ๋ฑ์Šค๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋ ˆ์ŠคํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ด๋Ÿฐ 2๊ฐ€์ง€ ๋‹จ์ ์„ ๋ณด์™„ํ•œ๋‹ค.

// In ES6
function containsAll(haystack, ...needles) {
  for (var needle of needles) {
    if (haystack.indexOf(needle) === -1) {
      return false;
    }
  }
  return true;
}

๋ ˆ์ŠคํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐฐ์—ด๋ณ€์ˆ˜์˜ ๊ฐ’์ด undefined ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ ˆ๋Œ€ ์—†๊ณ  ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ๋นˆ ๋ฐฐ์—ด์ด ๋œ๋‹ค.

Spread Operator

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ์˜ค๋ธŒ์ ํŠธ์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ถ„๋ฆฌํ•˜์—ฌ ์ „๊ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Uses of spread operator

  • Apply ํ˜ธ์ถœ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
// Math.max()๋ฅผ ์‚ฌ์šฉํ• ๋•Œ N๊ฐœ์˜ ๊ฐ’์œผ๋กœ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ apply๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœํ•ด์•ผ ํ–ˆ๋‹ค.
function getMaxOfArray(numArray) {
  return Math.max.apply(null, numArray);
}

getMaxOfArray([1, 2, 3]);
/// In ES6
var arr = [1, 2, 3];
var max = Math.max(...arr); // or Math.max(...[1, 2, 3]);
  • ๋ฐฐ์—ด์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
var arr1 = ['two', 'three'];
var arr2 = ['one', ...arr1, 'four', 'five'];

// ["one", "two", "three", "four", "five"]
  • ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
var arr = [1,2,3];
var arr2 = [...arr]; // like arr.slice() in ES5
arr2.push(4)
  • NodeList์™€ arguments์™€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๊ฐ„๋‹จํžˆ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ES5
var nodesArray = Array.prototype.slice.call(document.querySelectorAll("div"));
var nodesArray = [].slice.call(document.querySelectorAll("div"));

// ES6
var nodesArray = [...document.querySelectorAll('div')];
var myFn = function(...args) { } // rest parameter
  • jQuery๋‚˜ underscore์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” extend ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๊ฐ์ฒด ๋ณ‘ํ•ฉ์„ ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
// extend sample in ES5
function extend(target /* ,source ,... */) {  
  var args = [].slice.call(arguments, 1); 

  return args.reduce(function(merged, obj) {
    return Object.keys(obj).reduce(function(receiver, prop) {
      if (obj.hasOwnProperty(prop)) {
        receiver[prop] = obj[prop];
      }
      return receiver;
    }, merged);
  }, target);
}

var base = { a: 1, b: 2 },  
    src1 = { b: 3 },
    src2 = { c: 4 },
    merged;

merged = extend(base, src1, src2);  

// ES6 using object#assign
let merged = Object.assign(base, src1, src2);  
//=> { a: 1, b: 3, c: 4 }

// ES6 spread operator
let merged = { ...base, ...src1, ...src2 };
//=> { a: 1, b: 3, c: 4 }

spread ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฐฐ์—ด์„ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋ถ„๋ฆฌ, ์ „๊ฐœํ•˜๊ณ , rest ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ „๊ฐœ๋œ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋‹ค์‹œ ๋ฐฐ์—ด์— ์„ค์ •ํ•œ๋‹ค.

Destructuring

๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์€ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์—์„œ ๊ฐ’์„ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๋˜๋Š” ๋ถ„ํ•  ํ• ๋‹น ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.

Uses of Destructuring

  • ๋ฐฐ์—ด์„ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ•˜๊ธฐ
// ES5
var first = someArray[0];
var second = someArray[1];
var third = someArray[2];

// ES6 Array destructuring
var [first, second, third] = someArray; // [ variable1, variable2, ..., variableN ] = array;

var [foo, [[bar], baz]] = [1, [[2], 3]];
console.log(foo); // 1
console.log(bar); // 2
console.log(baz); // 3

// ์ผ๋ถ€ ์š”์†Œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
var [,,third] = ["foo", "bar", "baz"];
console.log(third); // "baz"

// rest operator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งจ๋’ค ์š”์†Œ๋“ค์„ ๋‹ค๋ฅธ ๋ฐฐ์—ด์— ํ• ๋‹น
var [head, ...tail] = [1, 2, 3, 4]; // new Array(1,2,3,4);
console.log(tail); // [2, 3, 4]
  • ๊ฐ์ฒด๋ฅผ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ•˜๊ธฐ
var robotA = { name: "Bender" };
var robotB = { name: "Flexo" };

var { name: nameA } = robotA;
var { name: nameB } = robotB;

console.log(nameA); // "Bender" 
console.log(nameB); // "Flexo"

// ์ถ•์•ฝ ๋ฌธ๋ฒ• ์‚ฌ์šฉํ•˜๊ธฐ
var { foo, bar } = { foo: "lorem", bar: "ipsum" };
console.log(foo); // "lorem"
console.log(bar); // "ipsum"

// ์ค‘์ฒฉ๋œ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํŒจํ„ด
var complicatedObj = {
  arrayProp: [
    "Zapp",
    { second: "Brannigan" }
  ]
};

var { arrayProp: [first, { second }] } = complicatedObj;

console.log(first); // "Zapp"
console.log(second); // "Brannigan"
  • ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ
var map = new Map();
map.set(window, "the global");
map.set(document, "the document");

for (var [key, value] of map) {
  console.log(key + " is " + value);
}
// "[object Window] is the global"
// "[object HTMLDocument] is the document"

// ์ˆœํšŒํ•˜๋ฉด์„œ key ๊ฐ’์—๋งŒ ์ ‘๊ทผํ•˜๊ธฐ
for (var [key] of map) {
  // ...
}

// ์ˆœํšŒํ•˜๋ฉด์„œ value ๊ฐ’์—๋งŒ ์ ‘๊ทผํ•˜๊ธฐ
for (var [,value] of map) {
  // ...
}
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ
// ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ
function returnMultipleValues() {
  return [1, 2];
}
var [foo, bar] = returnMultipleValues();

// ๊ฐ์ฒด๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ด์šฉํ•ด ๋ฆฌํ„ด๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •
function returnMultipleValues() {
  return {
    foo: 1,
    bar: 2
  };
}
var { foo, bar } = returnMultipleValues();

์ฐธ์กฐ

Object

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_operator http://www.datchley.name/es6-rest-spread-defaults-and-destructuring/ https://medium.com/ecmascript-2015/default-rest-spread-f3ab0d2e0a5e

Clone this wiki locally