_getRawTag.js npm分支

getRawTag函数用于获取对象的原始toStringTag,它避免了Symbol.toStringTag可能被篡改的影响。函数首先保存并可能清除Symbol.toStringTag的值,然后调用nativeObjectToString来获取未受污染的标签,最后恢复Symbol.toStringTag的原状。然而,这个方法不适用于undefined和null,因为调用会抛出错误。
摘要由CSDN通过智能技术生成

代码:

var Symbol = require('./_Symbol');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;

/**
 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the raw `toStringTag`.
 */
function getRawTag(value) {
  var isOwn = hasOwnProperty.call(value, symToStringTag),
      tag = value[symToStringTag];

  try {
    value[symToStringTag] = undefined;
    var unmasked = true;
  } catch (e) {}

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

module.exports = getRawTag;

疑惑:为什么不直接返回var result = nativeObjectToString.call(value)就行还要那么多操作?

解答:

Symbol.toStringTag可以被用户随意修改,getRawTag是为了获取value最原始的类型,所以先把symToStringTag的值拿出来,再置空,这样就不会影响nativeObjectToString.call(value)。最后再把Symbol.toStringTag属性值还原。

方法缺陷:

不能判断undefined和null类型,nativeObjectToString.call(value)还会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值