js中的valueOf和toString

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38102188/article/details/84662025

valueOf和toSring两个函数是除null和undefined两种数据类型以外其他五种数据类型(number/string/bool/object/symbol)原型链上共有的函数,那么这两个函数主要是用来干什么的呢?司徒正美大神给出的答案是:值运算和显示问题,一般在隐式类型转换时会自动调用。
例1:
如果同时重写了valueOf和toString方法:

var aaa = {
  i: 10,
  valueOf: function() { 
	  console.log('valueOf')
	  return this.i+30; 
  },
  toString: function() { 
	  console.log('toString')
	  return this.i+10;
   }
}
 console.log(aaa > 20); // valueOf  true
 console.log('' + aaa);  //  valueOf  40
 console.log(++aaa); // valueOf  41
 console.log(+aaa); //  valueOf  40
 alert(aaa); // toString 20
 console.log(aaa == 40) //valueOf true
 console.log(String(aaa)) // toString 20

总结:涉及到操作符的问题,valueOf的优先级比toString的优先级高,涉及到显示问题,toString方法优先级比valueOf方法高。
例2:
如果只是重写了toString方法:

var aaa = {
  i: 10,
  toString: function() { 
	  console.log('toString')
	  return this.i+10;
   }
}
 console.log(aaa > 20); // toString false
 console.log('' + aaa);  //  toString 20
 console.log(++aaa); // toString 21
 console.log(+aaa); //  toSring 20
 alert(aaa); // toString 20
 console.log(aaa == 20) //toString true
 console.log(String(aaa)) // toString 20

总结:只重写了toString方法的话,toString方法比原型链上的valueOf方法优先级高。
例3
如果只重写了valueOf方法:

var aaa = {
  i: 10,
  valueOf: function() { 
	  console.log('valueOf')
	  return this.i+30;
   }
}
 console.log(aaa > 20); // valueOf true
 console.log('' + aaa);  //  valueOf 40
 console.log(++aaa); // valueOf 41
 console.log(+aaa); //  valueOf 40
 alert(aaa); // [object Object]
 console.log(aaa == 20) //valueOf false
 console.log(String(aaa)) // [object Object]

总结:只重写了valueOf方法的话,涉及到值运算优先调用valueOf方法,涉及到显示问题还是优先调用原型链上的toString方法。

参考:https://www.cnblogs.com/rubylouvre/archive/2010/10/01/1839748.html

猜你喜欢

转载自blog.csdn.net/m0_38102188/article/details/84662025