深入理解Javascript中的valueOf与toString


Posted in Javascript onJanuary 04, 2017

基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下。

toString()

toString()函数的作用是返回object的字符串表示,JavaScript中object默认的toString()方法返回字符串”[object Object]“。定义类时可以实现新的toString()方法,从而返回更加具有可读性的结果。JavaScript对于数组对象、函数对象、正则表达式对象以及Date日期对象均定义了更加具有可读性的toString()方法:

1.array的toString()方法将返回以逗号分隔的数组成员。比如,[1,2,3].toString()会返回字符串”1,2,3″。

2.function的toString()方法将返回函数的文本定义。比如,(function(x){return x*2;}).toString()会返回字符串”function(x){return x*2;}”。

3.RegExp的toString()方法与function的toString()方法类似,将返回正则表达式的文本定义。比如,/\d+/g.toString()会返回字符串”/\\d+/g”。

4.Date的toString()方法将返回一个具有可读性的日期时间字符串。

5.如果 Boolean 值是 true,则返回 “true”。否则,返回 “false”。

valueOf()

valueOf()函数的作用是返回该object自身。与toString()一样,定义类时可以实现新的valueOf()方法,从而返回需要的结果。JavaScript对于Date对象定义了更加具有可读性的valueOf()方法:

1.Date的valueOf()方法将返回一个时间戳数值,该数值为Date对象与1970年1月1日零时的时间差(以毫秒为单位)。其他一律返回对象本身。

在js高程里面有一段代码:

var colors = ["red", "blue", "green"]; // 创建一个包含3 个字符串的数组 
alert(colors.toString()); // red,blue,green 
alert(colors.valueOf()); // red,blue,green 
alert(colors); // red,blue,green

三个输出全部一样,那么toString()和valueOf()区别到底是什么?看下一个我写的例子:

var arr = [1,2,3]; 
alert(Array.isArray(arr.valueOf())); 
alert(Array.isArray(arr.toString()));

结果是第一个是true而第二个是false,为什么呢,其实valueOf()调用完以后还是返回一个数组。这个数组被alert的时候会调用toString()函数,所以不是valueOf()和toString()函数相同,而是间接的调用了toString()函数!
进一步测试下:

var arr = [1,2,3]; 
arr.toString = function () { 
  alert("你调用了toString函数"); 
} 
alert(arr.valueOf());

结果就是我们会看到“你调用了toString函数”。

而对于数值,我们可以调用valueOf的时候直接可以获得数字进行计算,不必转化成字符串,所以不会调用toString。反言之,如果我们需要获得操作对象的字符串形式的时候就会调用其toString函数。
验证如下代码:

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

我的理解:valueOf的意思是返回最适合该对象类型的原始值,而toString则是将在该对象类型的原始值以字符串形式返回。

第一个

alert(bbb);// 10 toString

这里我们的alert函数需要是的字符串,所以获取的是字符串,而不是原始值,故而调用了toString

第二个

alert(+bbb); // 10 valueOf

同理,alert要的是字符串不是原始值,其实是+bbb这个东西被调用了toString,而bbb被调用了valueOf

为了验证我们这样写

var a = { 
  i: 1, 
  valueOf: function () { 
    alert("你调用了a的valueOf函数"); 
    return this.i; 
  }, 
  toString: function () { 
    alert("你调用了a的toString函数"); 
    return this.i; 
  } 
}; 
var c = { 
  i: +a, 
  valueOf: function () { 
    alert("你调用了c的valueOf函数"); 
    return this.i; 
  }, 
  toString: function () { 
    alert("你调用了c的toString函数"); 
    return this.i; 
  } 
}; 
alert(c);

其中让c=+a,那么即可知道结果,果然如此,调用了a的valueOf和c的toString

第三个

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

同理,我们可以把上一段我写的程序里面的c:+a改成c:''+a

第四个

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

String这个强制转换其实在其内部是调用了传入参数的toString函数……

第五个

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

这个是有区别的,因为bbb的i属性是数值类型的,如果i为11111xxxxx这样的字符串,我们就可以看到调用了bbb的toString了

代码例子:

var c = { 
  i: "11111xxxx", 
  valueOf: function () { 
    alert("你调用了c的valueOf函数"); 
    return this.i; 
  }, 
  toString: function () { 
    alert("你调用了c的toString函数"); 
    return this.i; 
  } 
}; 
alert(c);

第六个

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

这个里面的判等的顺序是,获取原始值,然后判断两边的原始值是否相等,所以调用valueOf

第七个也就是最后一个

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

===操作符不进行隐式转换,判全等的第一个步骤是判断类型,因为类型都不一样了,所以后面什么都不会调用

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

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

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

下面给大家简单说下valueof和tostring的区别。

valueOf():返回最适合该对象类型的原始值;

toString(): 将该对象的原始值以字符串形式返回。

这两个方法一般是交由JS去隐式调用,以满足不同的运算情况。

在数值运算里,会优先调用valueOf(),如a + b;

在字符串运算里,会优先调用toString(),如alert(c)。

以上所述是小编给大家介绍的Javascript中的valueOf与toString,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS异常处理的一个想法(sofish)
Mar 14 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
Apr 29 Javascript
js中定义一个变量并判断其是否为空的方法
May 13 Javascript
jQuery中:not选择器用法实例
Dec 30 Javascript
Bootstrap安装环境配置教程分享
May 27 Javascript
javascript 广告移动特效的实现代码
Jun 25 Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
Apr 26 Javascript
JS实现的贪吃蛇游戏案例详解
May 01 Javascript
移动端吸顶fixbar的解决方案详解
Jul 17 Javascript
javascript实现滚动条效果
Mar 24 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 #Javascript
js实现定时进度条完成后切换图片
Jan 04 #Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 #Javascript
深入理解JavaScript中的预解析
Jan 04 #Javascript
jQuery操作json常用方法示例
Jan 04 #Javascript
Bootstrap select下拉联动(jQuery cxselect)
Jan 04 #Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
Jan 04 #Javascript
You might like
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
keep-alive不能缓存多层级路由菜单问题解决
2020/03/10 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python连接Redis的基本配置方法
2018/09/13 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
入党自我评价优缺点
2014/01/25 职场文书
公司拓展活动方案
2014/02/13 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS