- 对象和字符串对比,对象.toString()变为字符串
- 对象转数字:先调toString()转为字符串,再用Number()函数转为数字
- 对象和对象对比不会隐式转换
eg:
var a = { _default: 0, toString: function() { return ++this._default } } if(a==1&&a==2&&a==3) { console.log('you are win') }
//输出 you are win
上例中最后进入了if判断中,因为在if判断中,对象a调用重写了的toString方法,并且转化为字符串,最后因为和数字进行对比,再调用对象__proto__上的Number方法转化为数字。所以每一次的对比就对对象a进行了一次调用,++运算也会让值增加,if判断为true最后进入判断中。
{}的隐式转换
js中,加法运算的规则很简单,只会触发两种情况:
1.number + number
2.string + string
如果有一个数为string,则将另一个操作数隐式的转换为string,然后通过字符串拼接得出结果。
如果两个都是number类型则直接运算得出结果
如果为布尔值这种简单的数据类型,那么将会转换为number类型来进行运算得出结果
如果操作数为对象或者是数组这种复杂的数据类型,那么就将两个操作数都转换为字符串,进行拼接 。
eg:
console.log({}+{}) //[object Object][object Object] console.log({}+[])//[object Object] console.log(([]+[]).length)//0
Function.prototype.toString()
此方法返回一个表示当前函数源代码的字符串
eg:
let test = function(){} console.log(test.toString())
//function(){}
Function.prototype.length
此属性指明函数的形参个数
eg:
let test = function() {} console.log(test.length) //0 let trys = function(a,b,c) {} console.log(trys.length) //3