越看越菜系列
其实compact本身没得啥,就是一个用于去除数组中假值的函数。
false, null, 0, "", undefined, NaN都为假值。
源码:
function compact(array){
let resIndex = 0;
const result = [];
if(array == null){
return result;
}
for(const value of array){
if(value){
result[resIndex++] = value;
}
}
return result;
}
其实老实讲这个源码比较简单,但 大佬跟了一句,为什么用for of 循环? , 前方高能提醒:
for of 循环内部调用 数组原型链上的 Symbol.iterator 方法。
然后 来到了 阮一峰老师的es6了 Generator函数的语法
for of 循环可以自动遍历 Generator 函数运行时生成的Iterator 对象,且不需要调用 next 方法
function* foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6;
}
for (let v of foo()) {
console.log(v);
}
// 1 2 3 4 5
然后举个例子嘿嘿
Array.prototype[Symbol.iterator] = function (){
let index = 0;
const _self = this;
return {
next: function () {
if ( index < -self.length){
return {value: _self[index++] * 2 , done : false}
}else{
return {done: true}
}
}
}
}
//使用 Generator 函数改写
Array.prototype[Symbol.iterator] = function* (){
let index = 0;
while( index < this.length){
yield this[index++] * 2;
}
}
写在后面
- ES6的语法还是很不熟悉,应当多读读大佬的博客
- 跟着大佬看 lodash的源码,确实可以看到很多没得注意到的地方,应当继续加油
- 自己写的博客,与大佬比起来,文章脉络不清晰,表达也不很得体到位,继续写,多写写。