越看越菜系列


其实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;
	}
}

写在后面

  1. ES6的语法还是很不熟悉,应当多读读大佬的博客
  2. 跟着大佬看 lodash的源码,确实可以看到很多没得注意到的地方,应当继续加油
  3. 自己写的博客,与大佬比起来,文章脉络不清晰,表达也不很得体到位,继续写,多写写。