# 获取数据类型

function baseGetTag(value) {
  // ...
  // 假如不支持toStringTag属性,就直接返回
  if (!(symToStringTag && symToStringTag in Object(value))) {
    return toString.call(value);
  }
  // 对symbol的兼容支持
  const isOwn = hasOwnProperty.call(value, symToStringTag);
  const tag = value[symToStringTag];
  let unmasked = false;
  try {
    value[symToStringTag] = undefined;
    unmasked = true;
  } catch (e) {}

  const result = toString.call(value);
  if (unmasked) {
    if (isOwn) {
      value[symToStringTag] = tag;
    } else {
      delete value[symToStringTag];
    }
  }
  return result;
}

上面这一大段代码,都是为了兼容symbol。

因为内置的Object.prototype.toString会读取这个toStringTag属性作为返回值。假如用户修改了此属性值,那么返回的值,就不是symbol类型。

因此我们需要先清除这个属性的值,此时保存原始属性后,再将用户值填入属性,从而保证返回保存的正确数据类型。

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