前端小白笔记,Object之toString

144 阅读1分钟

今天看到一个题目,如下所示:

if(a==1 && a==2 && a==3) {
    console.log('hhh')
}

那么,要怎么定义这个a才可以输出hhh呢?

toString

我想到的是object的toString方法。

一个对象进行运算时,都要经过类型转换,通过调用toString或valueOf方法,返回一个原始值再进行运算。

toString方法默认返回“[object Type]”,Type表示对象的类型;valueOf方法默认返回对象本身。

let a = {} + 1        // [object Object]1

当需要用原始值的时候,JS会自动调用这两个方法的其中一个,我们也可以直接调用

let a = {}
a.toString()      // [object Object]
a.valueOf()       // 返回对象本身,a===a.valueOf()

重写toString

toString方法是可以重写的,所以我们可以通过定义一个对象字面量重写toString方法来解决上面那个问题,代码如下所示:

const a = {
    i: 0
    toString: function () {
        return ++ this.i
    }
}

注意,当toString和valueOf方法返回的都不是原始值时,运算会报错。

Uncaught TypeError: Cannot convert object to primitive value

检测对象类型

我们可以用下面的方式检测对象类型,还可以通过Symbol.toStringTag自己定义toString返回的Type。

// Object.prototype.toString.call(data)    //[object Type]

const a = []
Object.prototype.toString.call(a)   //[object Array]
a[Symbol.toStringTag] = 'myArr'
Object.prototype.toString.call(a)   //[object myArr]

思考

当我把问题改为全等符号的时候,表达式返回false。但是当我运算a + 1,返回的却是数值2。

这是不是说明比较运算和加法运算有各自的类型转换方式。

比较运算时,对象通过String(obj)进行类型转换。

加法运算则是通过调用toString或valueOf方法进行类型转换。