Javascript中valueOf与toString区别浅析_Javascript教程-查字典教程网
Javascript中valueOf与toString区别浅析
Javascript中valueOf与toString区别浅析
发布时间:2016-12-30 来源:查字典编辑
摘要:前言基本上,所有JS数据类型都拥有这两个方法,null除外。它们俩解决javascript值运算与显示的问题,重写会加大它们调用的优化。测试...

前言

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

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类