-
Notifications
You must be signed in to change notification settings - Fork 0
ecmascript_3_1
๋ฐฐ์ด์ ์ํํ๋ ๋ฐฉ๋ฒ
// 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 ๊ตฌ๋ฌธ๋ ๋ด๋ถ์ ์ผ๋ก๋ ์ด๋ค ๋ฉ์๋๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๊ทธ๋ ๋ค๋ฉด, 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()๋ฅผ ๊ตฌํ
๋ํดํธ ํ๋ผ๋ฏธํฐ๋ ํจ์ํธ์ถ์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ค์ ๋ชจ๋ ์ฑ์ธํ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
ํน๋ณํ ๊ฐ์ ์ ๋ฌํ์ง ์์ ๊ฒฝ์ฐ 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) {...}ํธ์ถ๋ฐ๋ ํจ์์ ํ๋ผ๋ฏธํฐ์ 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 ๋๋ ๊ฒฝ์ฐ๋ ์ ๋ ์๊ณ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋น ๋ฐฐ์ด์ด ๋๋ค.
์คํ๋ ๋ ์ฐ์ฐ์๋ ์ดํฐ๋ฌ๋ธ ์ค๋ธ์ ํธ์ ์๋ฆฌ๋จผํธ๋ฅผ ํ๋์ฉ ๋ถ๋ฆฌํ์ฌ ์ ๊ฐํ ๋ ์ฌ์ฉํ๋ค.
-
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 ํ๋ผ๋ฏธํฐ๋ ์ ๊ฐ๋ ์๋ฆฌ๋จผํธ๋ฅผ ๋ค์ ๋ฐฐ์ด์ ์ค์ ํ๋ค.
๋์คํธ๋ญ์ฒ๋ง์ ๊ฐ์ฒด๋ ๋ฐฐ์ด์์ ๊ฐ์ ์ฝ๊ฒ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ด๋ค.
๋น๊ตฌ์กฐํ ํ ๋น ๋๋ ๋ถํ ํ ๋น ๋ฑ์ผ๋ก ๋ถ๋ฆฐ๋ค.
- ๋ฐฐ์ด์ ๋์คํธ๋ญ์ฒ๋ง ํ๊ธฐ
// 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();- ES6 In Depth: ์ดํฐ๋ ์ดํฐ(iterator)์ for-of ๋ฃจํ ๊ตฌ๋ฌธ
- ES6 Iterators in Depth
- Spread_operator
- es6-in-depth-destructuring
- es6-rest-spread-defaults-and-destructuring
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