rest params
Q1.
function bar (param1,param2,...rest){
console.log(param2) //?
console.log(rest) //?
}
bar(1,2,3,4,5)
JavaScript
복사
function bar (...rest,param1,param2){
console.log(param2) //?
console.log(rest) //?
}
bar(1,2,3,4,5)
JavaScript
복사
매개변수 기본값
Q2.
function foo(name = "LEE"){
console.log(name);
}
foo(); // ?
foo(undefined); //?
foo(null); //?
JavaScript
복사
이터레이션 프로토콜
이터러블 프로토콜이란?
이터러블에는 어떤 문법, 연산을 사용할 수 있는가?
이터레이터 프로토콜
class Stack {
constructor(arr) {
if (!arr.hasOwnProperty("length"))
throw Error("배열 형식이 아닌 객체는 할당할 수 없습니다.");
this._stack = arr ? Array.from(arr) : [];
}
push(value) {
this._stack.push(value);
}
pop() {
return this._stack.pop();
}
top() {
return this._stack[this._stack.length - 1];
}
// Symbol.itertor 메서드가 이터레이터를 반환하므로 이터러블이다.
[Symbol.iterator]() {
const { _stack } = this;
let index = _stack.length;
// 이터레이터
return {
next() {
return { value: _stack[--index], done: index === -1 };
},
};
}
iterator() {
return this[Symbol.iterator]();
}
}
const { log } = console;
const stack1 = new Stack([1, 2, 3]);
for (let i of stack1) {
log(i);
}
const stack2 = new Stack({ 0: 4, 1: 5, 2: 6, length: 3 });
log([...stack2, ...stack1]);
const i1 = stack1.iterator();
while (1) {
const res = i1.next();
if (res.done) break;
log(res);
}
JavaScript
복사
for … in 과 for … of의 차이점은?
지연평가
지연 평가란? 그리고 그 이점은?
아래 코드의 결과
function take(iter, n) {
let res =[];
for(let value of iter) {
res.push(value);
console.log(value)
if(res.length === n) return res;
}
}
function evaluate(n=10) {
const res = [];
for(let i=0; i<n; ++i) {
console.log('evaluate ' + i);
res[i] = i;
}
return res;
}
// 제너레이터 함수: 이터러블이면서 동시에 이터레이터인 제너레이터 객체를 반환.
function* evaluateLazy(n=10) {
for(let i=0; i<n; ++i) {
console.log('evaluate lazy' +i);
yield i;
}
}
const arr1 = take(evaluate(10), 5);
const arr2 = take(evaluateLazy(10), 5);
console.log(arr1);
console.log(arr2);
JavaScript
복사
•
지연평가의 성능상 이점
const arr = Array.from({length: 1000000}, ()=>0);
console.time('strict')
arr
.map((_, i) => i)
.map((x) => x**2)
.slice(0, 10)
console.timeEnd('strict');
const {from} = rxjs;
const {map, tap, take} = rxjs.operators;
const lazyArray = from(arr);
console.time('lazy')
lazyArray.pipe(
map((_, i) => i),
map((x) => x**2),
take(10),
).subscribe()
console.timeEnd('lazy');
JavaScript
복사
스프레드 문제
var a = [1,2,3];
var b = ['you', 'are'];
var c = function(a,b){
console.log( [[...a], ...[...b]][1] )
}
c(a,b)
JavaScript
복사