今天看到一个题目,如下所示:
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方法进行类型转换。