欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Javascript中valueOf与toString区别

程序员文章站 2023-01-29 13:54:42
前言 基本上,所有JS数据类型都拥有这两个方法,null除外。它们俩解决javascript值运算与显示的问题,重写会加大它们调用的优化。 测试分析 先看一例: var a...
前言

基本上,所有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。