type icon indicating copy to clipboard operation
type copied to clipboard

使用Symbol.toStringTag后,type函数会判断错误

Open wyjie opened this issue 4 years ago • 3 comments

const object1 = {};
object1[Symbol.toStringTag] = 'Array';
console.log(type(object1));  // Array

是否可以去掉47行的if判断,直接使用对象的constructor

if(x.constructor == Object){
        return clsLow;
    }

wyjie avatar Mar 12 '21 08:03 wyjie

const object1 = {};
object1[Symbol.toStringTag] = 'Array';
console.log(type(object1));  // Array

这个期望object1的返回值是 'object' 而不是 'Array'吗?如果自定义了Symbol.toStringTag,感觉返回Symbol.toStringTag是合理的吧?

yanhaijing avatar Nov 28 '21 08:11 yanhaijing

const object1 = {};
object1[Symbol.toStringTag] = 'Array';
console.log(type(object1));  // Array

这个期望object1的返回值是 'object' 而不是 'Array'吗?如果自定义了Symbol.toStringTag,感觉返回Symbol.toStringTag是合理的吧?

好像也有道理

wyjie avatar Dec 23 '21 02:12 wyjie

Symbol.toStringTag 似乎就是为了修复,自定义的类实例,type都是object的问题吧

原来的场景

function A() {}

const a = new A
Object.prototype.toString.call(a) // '[object Object]'

Symbol.toStringTag改进后的情况

function A() {
  this[Symbol.toStringTag] = 'A' // 注意这里的区别
}

const a = new A
Object.prototype.toString.call(a) // '[object A]'

有了Symbol.toStringTag内部类可以区分开 自定义对象和原生对象了,没有Symbol.toStringTag,只能去constructor上面判断才可以(目前type库就是从这里拿的)

function A() {}

const a = new A
Object.prototype.toString.call(a) // '[object Object]' 这里无法区分

console.log(a.constructor.name) // 'A'

yanhaijing avatar Dec 23 '21 02:12 yanhaijing