当前位置: 移动技术网 > IT编程>开发语言>JavaScript > Javascript中valueOf与toString区别

Javascript中valueOf与toString区别

2017年12月21日  | 移动技术网IT编程  | 我要评论
前言

基本上,所有JS数据类型都拥有这两个方法,null除外。它们俩解决javascript值运算与显示的问题,重写会加大它们调用的优化。

测试分析

先看一例:

var aaa = { 

 i: 10, 

 valueOf: function() { return this.i+30; }, 

 toString: function() { return this.valueOf()+10; } 

 

alert(aaa > 20); // true 

alert(+aaa); // 40 

alert(aaa); // 50 

 

之所以有这样的结果,因为它们偷偷地调用valueOf或toString方法。

但如何区分什么情况下是调用了哪个方法呢,我们可以通过另一个方法测试一下。

由于用到console.log,请在装有firebug的FF中实验!

 

var bbb = {

 i: 10,

 toString: function() {

  console.log('toString');

  return this.i;

 },

 valueOf: function() {

  console.log('valueOf');

  return this.i;

 }

}

 

alert(bbb);// 10 toString

alert(+bbb); // 10 valueOf

alert(''+bbb); // 10 valueOf

alert(String(bbb)); // 10 toString

alert(Number(bbb)); // 10 valueOf

alert(bbb == '10'); // true valueOf

alert(bbb === '10'); // false

结果给人的感觉是,如果转换为字符串时调用toString方法,如果是转换为数值时则调用valueOf方法,但其中有两个很不和谐。一个是alert(''+bbb),字符串合拼应该是调用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 

 

再看valueOf。

var bb = { 

 i: 10, 

 valueOf: function() { 

  console.log('valueOf'); 

  return this.i; 

 } 

 

alert(bb);// [object Object] 

alert(+bb); // 10 valueOf 

alert(''+bb); // 10 valueOf 

alert(String(bb)); // [object Object] 

alert(Number(bb)); // 10 valueOf 

alert(bb == '10'); // true valueOf 

 

发现有点不同吧?!它没有像上面toString那样统一规整。

对于那个[object Object],我估计是从Object那里继承过来的,我们再去掉它看看。

 

Object.prototype.toString = null; 

var cc = { 

 i: 10, 

 valueOf: function() { 

  console.log('valueOf'); 

  return this.i; 

 } 

 

alert(cc);// 10 valueOf 

alert(+cc); // 10 valueOf 

alert(''+cc); // 10 valueOf 

alert(String(cc)); // 10 valueOf 

alert(Number(cc)); // 10 valueOf 

alert(cc == '10'); // true valueOf 

 

总结:valueOf偏向于运算,toString偏向于显示。

1、 在进行对象转换时(例如:alert(a)),将优先调用toString方法,如若没有重写toString将调用valueOf方法,如果两方法都不没有重写,但按Object的toString输出。

2、 在进行强转字符串类型时将优先调用toString方法,强转为数字时优先调用valueOf。

3、 在有运算操作符的情况下,valueOf的优先级高于toString。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网