isSymbol
import getTag from './.internal/getTag.js'
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* isSymbol(Symbol.iterator)
* // => true
*
* isSymbol('abc')
* // => false
*/
function isSymbol(value) {
const type = typeof value
return type == 'symbol' || (type === 'object' && value != null && getTag(value) == '[object Symbol]')
}
export default isSymbol
getTag
const toString = Object.prototype.toString
/**
* Gets the `toStringTag` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
function getTag(value) {
if (value == null) {
return value === undefined ? '[object Undefined]' : '[object Null]'
}
return toString.call(value)
}
export default getTag
getTag:
Object.prototype.toString()
返回 "[object Type]"
,这里的 Type
是对象的类型。如果对象有 Symbol.toStringTag 属性,其值是一个字符串,则它的值将被用作 Type
。许多内置的对象,包括 Map 和 Symbol,都有 Symbol.toStringTag
。一些早于 ES6 的对象没有 Symbol.toStringTag
,但仍然有一个特殊的标签。它们包括(标签与下面给出的类型名相同):
arguments 对象返回 "[object Arguments]"
。其他所有内容,包括用户自定义的类,除非有一个自定义的 Symbol.toStringTag
,否则都将返回 "[object Object]"
。
在 null 和 undefined 上调用 Object.prototype.toString()
分别返回 [object Null]
和 [object Undefined]
。
主题:
(type === 'object' && value != null && getTag(value) == '[object Symbol]')
是否真的存在这种类型?是存在的。
class Myclass {
get [Symbol.toStringTag](){
return 'Symbol'
}
}
const my=new Myclass()
typeof my //'object'
Object.prototype.toString.call(my)//[object Symbol]
之前自己都一直构造不出来这个类型,还是问的chatjpt。