Range
- 주어진 길이만큼 숫자 배열 반환
- curry 쓰지말자!
[안느긋한 range]
var add = (a, b) => a + b;
const range = l => {
let i = -1;
let res = [];
while (++i < l) {
res.push(i);
}
return res;
};
var list = range(4);
log(list); // [0, 1, 2, 3]
log(reduce(add, list)); // 6
[느긋한 L.range]
const L = {};
L.range = function* (l) {
let i = -1;
while (++i < l) {
yield i;
}
};
var list = L.range(4);
log(list);
// GeneratorFunctionPrototype {_invoke: function invoke(), constructor: Object...
// 이터레이터 (제너레이터 객체)가 반환됨
log(reduce(add, list)); // 6 // 이 list 역시 이터러블이라서 결과 도출됨
[두 range 비교]
const range = l => {
let i = -1;
let res = [];
while (++i < l) {
log('range', i)
res.push(i);
}
return res;
};
var list = range(4);
L.range = function* (l) {
log('hi')
let i = -1;
while (++i < l) {
log('LRange', i);
yield i;
}
};
var list = L.range(4);
// 위의 range는 실행과 즉시 배열로 평가가 되었다
// range 0
// range 1
// range 2
// range 3
// hi는 출력되지 않음
// 아래 range는 next() 가 될때 (조회가 될때) 평가가 된다
// 바로 평가되지 않고 필요할 때까지 기다렸다가 평가가 된다
log(list.next().value); // LRange 0
log(list.next().value); // LRange 1
range 함수가 호출된 시점
- 바로 평가되지 않고 필요할 때까지 기다렸다가 평가가 되고 연산을 한다 (lazy)
[테스트]
function test(name, time, f) {
console.time(name);
while (time--) f();
console.timeEnd(name);
}
test('range', 10, () => reduce(add, range(1000000)));
test('L.range', 10, () => reduce(add, L.range(1000000)));
console.clear();
// L.range가 더빠르다
Take