Reflect.apply(Object.prototype.toString, val, []).slice(8, -1)
console.log(getTypeObject(111))
console.log(getTypeReflect(111))
/**
* 获取数据类型 方案一:正则
* @author 阿吉
*/
const getType = obj => {
let type = typeof obj;
if (type !== "object") {
return type;
return Object.prototype.toString.call(obj).replace(/^$/, '$1');
slice(start, end): 得到的是 [start, end)
3-4. Object.prototype.toString(val)原理
本质是拆箱原理,即ToPrimitive(input,preferedType?)
ECMA 规范 262 系列文档
toString()简化版步骤: (1) if(val === null || val === undefined) return '[object Null]' || '[object Nudefined]' (2)else 对应包装类 Object(val) (3) tag =Object(val)[Symbol.toStringTag]||Object(val).prototype[Symbol.toStringTag] (4) return "[object " + tag + "]"
代码演示:
const toStringSteps = {
[Symbol.toStringTag]: 'AJ',
toString() {
return 'toString'
},
valueOf() {
return 'valueOf'
},
console.log(Object.prototype.toString.call(toStringSteps)) // '[object AJ]'
class toStringProtoSteps {}
toStringProtoSteps.prototype[Symbol.toStringTag] = 'A'
console.log(Object.prototype.toString.call(new toStringProtoSteps())) // '[object AJProro]'
新标准中的Symbol.toStringTag是为了把 toString()接口化,用于新对象,同时兼容老对象。 同时,Symbol.toStringTag优先级比toString()和valueOf()高。
能使用 Symbol.toStringTag 的有:
JSON[Symbol.toStringTag]; // 'JSON'
Math[Symbol.toStringTag]; // 'Math'
Atomics[Symbol.toStringTag]; // 'Atomics'
BigInt.prototype[Symbol.toStringTag]; // "BigInt"
Symbol.prototype[Symbol.toStringTag]; // "Symbol"
Set.prototype[Symbol.toStringTag]; // "Set"
Map.prototype[Symbol.toStringTag]; // "Map"
WeakSet.prot