js toString valueOf 隐式调用

    看了别人写的toString 和 valueOf 觉得写得有点乱,自己总结了一下:

    1.先测一下优先级

Object.prototype.valueOf = function(){
	console.log("valueOf");
	return this.i;
};
Object.prototype.toString = function(){
	console.log("toString");
	return this.i;
};

var aa = {i: 10};
alert(aa);// 10 toString
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf

    或者:

var aa = {
	i: 10,
	toString: function() {
		console.log('toString');
		return this.i;
	},
	valueOf: function() {
		console.log('valueOf');
		return this.i;
	}
}
alert(aa);// 10 toString
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf
alert(aa === '10'); // false

    结论:

    操作符情况下或者明显的数值调用情况下 如(Number) 优先调用 valueOf 

    其他情况下优先调用 toString 

    2.分开来看一下,

    2.1、本地对象中只有toString

var aa = {
	i: 10,
	toString: function() {
		console.log('toString');
		return this.i;
	}
}
alert(aa);// 10 toString
alert(+aa); // 10 toString
alert(''+aa); // 10 toString
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 toString
alert(aa == '10'); // true toString

    全部调用了toString

    也就是说需要调用valueOf的时候,先查找本地,如果没有就调用本地toString;

    2.2、本地对象中只有valueOf

var aa = {
 i: 10,
 valueOf: function() {
  console.log('valueOf');
  return this.i;
 }
}
alert(aa);// [object Object] 
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // [object Object] 
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf

   没有全部调用valueOf (过程是需要调用toString的时候,查找本地,没有就去原型中调用

   也就是说需要调用toString的时候,查找本地,如果没有不去本地调用valueOf,而是去原型中查找;

   那么弄哑toString

Object.prototype.toString = null;
var ccc = {
 i: 10,
 valueOf: function() {
  console.log('valueOf');
  return this.i;
 }
}
alert(ccc);// 10 valueOf
alert(+ccc); // 10 valueOf
alert(''+ccc); // 10 valueOf
alert(String(ccc)); // 10 valueOf
alert(Number(ccc)); // 10 valueOf
alert(ccc == '10'); // true valueOf
alert(ccc === '10'); // false

    如果弄哑原型中的toString、原型中也找不到toString,就去调用本地的valueOf(如果本地也没有valueOf,调用        toString时就报错);

    上面看调用valueOf的时候有点特别,那么重写原型valueOf看下

Object.prototype.valueOf = function(){
	console.log("valueOf");
	return this.i;
};
var aa = {
	i: 10,
	toString: function() {
		console.log('toString');
		return this.i;
	}
}
alert(aa);// 10 toString
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf

    可以看到,重写原型valueOf之后,本地没有valueOf也不会去调用本地的toString,而是会查找原型中的valueOf进行调用;

对于上面的现象猜测有可能调用原生原型valueOf的时候调用toString???暂时没精力研究了。。

ps : 加一小点, 比较操作的时候,任何操作数与NaN比较结果都是false。

你可能感兴趣的:(js toString valueOf 隐式调用)