const HASH_UNDEFINED = '__lodash_hash_undefined' class Hash{ // Hash 只接收一个二维数组做为参数 // new Hash([['tes1',1],['test2',2],['test3',3]]) // => // { // size: 3, // __data__: { // test1: 1, // test2: 2, // test3: 3 // } // } constructor(entires) { let index = -1 const length = entries == null ? 0 : entries.length // 初始化 __data__ 属性和 size this.clear() // 遍历传入的二维数组,调用 set 方法,初始化缓存的值 while(++index < length) { const entry = entries[index] this.set(entry[0], entry[1]) } } // 初始化 __data__ 属性和 size // clear 的做用是清空缓存 clear() { // Object.create 的第一个参数为建立对象的原型对象, // 传入 null 的时候,返回的就是一个真空对象,即没有原型的对象,所以不会有原型属性的干扰,用来作缓存对象十分适合。 this.__data__ = Object.create(null) this.size = 0 } //delete 方法用来删除指定 key 的缓存 // 成功删除返回 true, 不然返回 false // 删除操做一样须要维护 size 属性和缓存值。 delete (key) { //调用 has 方法来判断缓存是否存在,若是存在,用 delete 操做符将 __data__ 中对应的属性删除。 const result = this.has(key) && delete this.__data__ // delete 操做符在成功删除属性时会返回 true,若是成功删除,则须要将 size 减小 1 。 this.size -= result ? 1 : 0 return result } // get 方法是从缓存中取值 get(key) { const data = this.__data__ const result = data[key] return result === HASH_UNDEFINED ? undefined : result } // has 用来判断是否已经有缓存数据,若是缓存数据已经存在,则返回 true // 这个判断有一个坑 has(key) { const data = this.__data__ return data[key] !== undefined } // set 用来增长或者更新须要缓存的值 // set 的时候须要同时维护 size 和在缓存的值。 set(key, value) { const data = this.__data__ // 判断对应的 key 是否已经被缓存过,若是已经缓存过,则 size 保持不变,不然 size 加 1 this.size += this.has(key)? 0 : 1 data[key] = value === undefined ? HASH_UNDEFINED : value return this // 在 has 中说到用 data[key] !== undefined 有一个坑,由于要缓存的值也能够是 undefined ,若是不作处理,确定会致使判断错误。 // lodash 的处理方式是将 undefined 的值转换成 HASH_UNDEFINED ,也即一开始便定义的 __lodash_hash_undefined__ 字符串来储存。 // 因此在缓存中,是用字符串 __lodash_hash_undefined__ 来替代 undefined 的。 } } export default Hash
should return join all array elements into a string
_.join(['a', 'b', 'c'], '~'); * // => 'a~b~c'
查看这段代码中的应用 : https://github.com/skychx/web...webpack
/** * 2.filename 和 chunkFilename 的区别 */ let btn = document.createElement('button') btn.innerHTML = 'click me' document.body.appendChild(btn) async function getAsyncComponent() { var element = document.createElement('div') const { default: _ } = await import ('lodash') element.innerHTML = _.join(['hello!', 'dynamic', 'imports', 'async', ' ']) return element } btn.addEventListener('click', () => { getAsyncComponent().then(component => { document.body.appendChild(component) }) })