夜下客

繁体版 简体版
夜下客 > JS修炼法则 > 第4章 JS类型判断

第4章 JS类型判断

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

『加入书签,方便阅读』