# 获取数据类型
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
类型。
因此我们需要先清除这个属性的值,此时保存原始属性后,再将用户值填入属性,从而保证返回保存的正确数据类型。