由图可以看出,对象包含有 toString、valueOf 函数。
规则:
1、正常情况下,优先调用toString()
2、有运算操作符的情况下valueOf()的优先级高于toString()
3、当调用valueOf()方法无法运算后还是会再调用toString()方法
例子1、
var abc = { toString:function(){ return '测试' } } // 有运算符,优先执行 valueOf,但是不存在valueOf则执行toString if(abc == '测试'){ console.log("相等") }
例子2、
var n = { valueOf: function () { return 2 }, toString: function () { return 1 } } //2 有运算符 优先执行 valueOf,如果不存在valueOf,则执行toString console.log(+n); //1 正常情况执行 toString console.log(obj[n]);
例子3、
var n = { toString: function () { return 1 }, valueOf: function () { console.log(999); return {} } } //这里有操作符,执行 valueOf,但是返回的不是基础类型无法处理,将会调用用 toString 转为 基础类型 console.log(n + 100)
例子4、
var a = { i: 1, valueOf:function(){ if(this.i === 1){ return this.i++ }else if(this.i === 2){ return this.i++ }else{ return 12 } } } //有运算符会执行valueOf函数 if( a == 1 && a == 2 && a == 12 ){ console.log(1); }
还没有评论,来说两句吧...