# 缓存时,如何区分undefined是用户存入的值还是默认空值

const HASH_UNDEFINED = '__lodash_hash_undefined__';

class Hash {
  // ...其他操作
  get(key) {
		const data = this.__data__;
    const result = data[key];
    return result === HASH_UNDEFINED ? undefined : result;
  }
  
  has(key) {
    const data = this.__data__;
    return data[key] !== undefined;
  }
  
  set(key, value) {
    const data = this.__data__;
    this.size += this.has(key) ? 0 : 1;
    data[key] = value === undefined ? HASH_UNDEFINED : value;
    return this;
  }
}

这里存在一个问题,即:判断key是否存在,是依据data[key]值是否为undefined来判断。

但是用户想要存入的值,可能为undefined,此时就会无法区分undefined到底是存入的值还是空值。而Lodash,做了一层转换,将用户存入的undefined转换为一个字符串,从而区分了undefined

当然,这样还是有一个问题,即用户存入值正好为__lodash_hash_undefined__时,会识别为undefined,不过这种情况应该会非常少。

为什么Lodash不使用,数组、对象或Symbol来替代默认的字符串呢?因为Lodash是分模块发布的,不同的模块可能依赖不同版本的Hash类,这样HASH_UNDEFINED指向的内存或者Symbol值就不一致,也就没法区别undefiend了。

最近更新时间: 2020/9/6 11:30:38