valueOf与toString
valueOf与toString
valueOf
和toString
是Object.prototype
上的方法,在Js
几乎所有的对象都会继承自Object
,同样由于包装对象的原因,几乎所有的数据类型都能够调用这两个方法,无法调用的有例如null
、undefined
以及Object.create(null)
创建的对象等,通常我们一般不会主动调用这两个方法,而在代码执行的过程中这两个方法会经常被偷偷的调用,而且在不同的情况下会有选择的进行调用。
valueOf
JavaScript
通过调用valueOf
方法将对象转换为原始值,我们很少需要自己调用valueOf
方法,当遇到要预期的原始值的对象时,JavaScript
会自动调用它。默认情况下,valueOf
方法由Object
后面的每个对象继承。每个内置的核心对象都会覆盖此方法以返回适当的值,如果对象没有原始值,则valueOf
将返回对象本身。
JavaScript
的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此不同类型对象的valueOf
方法的返回值和返回值类型均可能不同。
对象 | 返回值 |
---|---|
Array |
返回数组对象本身。 |
Boolean |
布尔值。 |
Date |
存储的时间是从1970 年1 月1 日午夜开始计的毫秒数UTC 。 |
Function |
函数本身。 |
Number |
数字值。 |
Object |
默认情况下返回对象本身。 |
String |
字符串值。 |
var arr = [];
console.log(arr.valueOf() === arr); // true
var date = new Date();
console.log(date.valueOf()); // 1376838719230
var num = 1;
console.log(num.valueOf()); // 1
var bool = true;
console.log(bool.valueOf() === bool); // true
var newBool = new Boolean(true);
console.log(newBool.valueOf() === newBool); // false // 前者是bool 后者是object
function funct(){}
console.log(funct.valueOf() === funct); // true
var obj = {};
console.log(obj.valueOf() === obj); // true
var str = "";
console.log(str.valueOf() === str); // true
var newStr = new String("");
console.log(newStr.valueOf() === newStr); // false // 前者是bool 后者是object
前文提到过在JavaScript
运行的过程中valueOf
方法经常会被偷偷的调用,我们可以自行重写valueOf
方法,在def.js
中甚至相当灵活使用valueOf
等方式实现了Ruby
风格的类定义工厂,以Child << Parent
的风格实现了继承。
class ValueOfTest{
constructor(val){
this.val = val;
}
valueOf(){
return this.val;
}
}
var v = new ValueOfTest(10);
console.log(v + 1); // 11
toString
JavaScript
通过调用toString
方法返回一个表示该对象的字符串,每个对象都有一个toString
方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()
方法被每个Object
对象继承,如果此方法在自定义对象中未被覆盖,toString
返回[object type]
,其中type
是对象的类型。
JavaScript
的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此不同类型对象的toString
方法的返回值和返回值类型均可能不同。
对象 | 返回值 |
---|---|
Array |
以逗号分割的字符串,如[1,2] 的toString 返回值为1,2 。 |
Boolean |
布尔值的字符串形式。 |
Date |
可读的时间字符串,例如Tue Oct 27 2020 16:08:48 GMT+0800 (中国标准时间) |
Function |
声明函数的Js 源代码字符串。 |
Number |
数字值的字符串形式。 |
Object |
[object Object] 字符串。 |
String |
字符串。 |
var arr = [1, 2, 3];
console.log(arr.toString()); // 1,2,3
var date = new Date();
console.log(date.toString()); // Tue Oct 27 2020 16:12:35 GMT+0800 (中国标准时间)
var num = 1;
console.log(num.toString()); // 1
var bool = true;
console.log(bool.toString()); // true
function funct(){ var a = 1; }
console.log(funct.toString()); // function funct(){ var a = 1; }
var obj = {a: 1};
console.log(obj.toString()); // [object Object]
var str = "1";
console.log(str.toString()); // 1
对比
JavaScript
在不同情况下,会调用不同的方法去处理值,通常来说是会优先调用toString()
方法,而有运算操作符的情况下valueOf()
的优先级高于toString()
,当调用valueOf()
方法无法运算后还是会再调用toString()
方法。
var v = {
val: 10,
valueOf: function(){
console.log("valueOf");
return this.val;
},
toString: function(){
console.log("toString");
return this.val;
}
}
var obj = {"10": 1};
console.log(v); // {val: 10, valueOf: ƒ, toString: ƒ}
console.log(1+v); // valueOf // 11
console.log(obj[v]); // toString // 1
console.log("" + v); // valueOf // 10
console.log(String(v)); // toString // 10
console.log(Number(v)); // valueOf // 10
console.log(v == 10); // valueOf // true // 只有在==的情况下才有可能调用valueOf 在===的情况下object与number不可能相等
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://github.com/tobytailor/def.js
https://juejin.im/post/6844903812117839879
https://juejin.im/post/6844903967097356302
https://cloud.tencent.com/developer/article/1495536
https://www.cnblogs.com/rubylouvre/archive/2010/10/01/1839748.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
valueOf与toString的更多相关文章
- Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- valueOf和toString的区别
基本上所有的JavaScript数据类型都有valueOf(),toString()方法,null除外,这两个方法解决了JavaScript值运算和显示的问题 valueOf()会把数据类型转换成原始 ...
- valueOf和toString
有一道经典的题目: var add = function() {___}; console.log(add(3)(4)(5)); // 输出60 题目要求能无限相乘,请补充add函数. 首先很显然,a ...
- Javascript中valueOf与toString区别
前言 基本上,所有JS数据类型都拥有这两个方法,null除外.它们俩解决JavaScript值运算与显示的问题,重写会加大它们调用的优化. 测试分析 先看一例:var aaa = { i: 10, ...
- JavaScript的valueOf和toString
深度好文 http://www.cnblogs.com/coco1s/p/6509141.html 知识要点 不同对象调用valueOf和toString的顺序不一样 高阶函数的使用,替代for循环 ...
- JS类型转换之valueOf和toString详解
最近群里有人发了下面这题: 实现一个函数,运算结果可以满足如下预期结果: add(1)(2)// 3 add(1,2,3)(10)// 16 add(1)(2)(3)(4)(5)// 15 对于一个好 ...
- JavaScript中的valueOf与toString方法
基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题. JavaScript 的 valueOf() 方法 valu ...
- 深入理解Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- valueOf()、toString()
基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题. JavaScript 的 valueOf() 方法 valu ...
- String、String.valueOf、toString 它们三者的区别总结
今天在使用这个的时候发现,他们三者好像在某些场所都是可以用的,但是不免会让人想到那既然它们三者这么的相似,那么总有些什么区别吧.我也在网上找了一些资料看.自己也看了API文档,就将他们三的区别总结一下 ...
随机推荐
- IDEA:端口号被占用解决办法
idea遇到这样的问题:如下图 解决办法 步骤1:通过端口号找到pid打开dos命令行,输入netstat -ano | find "9009"得到下列内容,看到最后一行就是pid ...
- [转帖]一文快速入门 ClickHouse
https://zhuanlan.zhihu.com/p/621480049 什么是clickhouse ClickHouse是一种OLAP类型的列式数据库管理系统,这里有两个概念:OLAP.列式数据 ...
- [转帖]Linux三剑客之sed的初阶使用
https://www.jianshu.com/p/ceea435635a2 大多数情况下,对于文件内容的修改需要依赖交互式的软件来实现,例如vim修改文件的内容则是依赖光标的移动和修改操作来完成对文 ...
- 【转帖】8.JVM双亲委派机制(面试常问)
目录 1.什么是双亲委派机制? 2.双亲委派机制的优势 3.沙箱安全机制 1.什么是双亲委派机制? 双亲委派机制工作原理:(面试) 1.如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这 ...
- [转帖]nginx性能和软中断
https://plantegg.github.io/2022/11/04/nginx%E6%80%A7%E8%83%BD%E5%92%8C%E8%BD%AF%E4%B8%AD%E6%96%AD/ n ...
- [转帖]兆芯官方的CPU测试成绩,我复现不了
https://baijiahao.baidu.com/s?id=1734998483605483848 下图是兆芯网官上的公开测试成绩,测试对象是3.0GHz的KX-U6880A. 有几个问题: ...
- 你不知道的<input type="file">的小秘密
限制file上传类型 很多时候,我们都需要使用 <input type="file"> 进行文件上传. 在上传的时候,我们需要对文件类型进行限制. 如果上传图片的时候. ...
- 将字符串变成数组split
字符串变成数组,常用来获取数组中我们需要的值. var str="http://op/adfie/life.png"; let arr=str.split('.'); consol ...
- 【K哥爬虫普法】微信公众号爬虫构成不正当竞争,爬虫er面对金山,如何避免滥用爬虫?
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- python入门之后须掌握的知识点(excel文件处理+邮件发送+实战:批量化发工资条)【二】
相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...