toString()和valueOf()重写的区别
2019独角兽企业重金招聘Python工程师标准>>>
基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。
看过朋友的笔试题,我觉得有必要记录一下这两者的区别,理解这两个方法对日后javascript值运算与显示的问题有很大帮助。
问题:实现add(1)(2)(3)(4)的打印结果为10,并且要求可以随意调用,如add(1)(2)(3)(4)(5)的打印结果为15。
答案:
function add(x) {var sum = x;var tmp = function (y) {sum = sum + y;return tmp;};tmp.toString = function () {return sum;};return tmp;
}
console.log(add(1)(2)(3)); //6
console.log(add(1)(2)(3)(4)); //10
--------------------------
Javascript中valueOf函数方法是返回指定对象的原始值。使用方法:
object.valueOf( )object是必选项参数是任意固有 Jscript 对象。
每个Javascript固有对象的 valueOf 方法定义不同。
对象 | 返回值 |
Array | 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。 |
Boolean | Boolean 值。 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 |
Function | 函数本身。 |
Number | 数字值。 |
Object | 对象本身。这是默认情况。 |
String | 字符串值。 |
Math 和 Error 对象没有 valueOf 方法。
-----------
Javascript 的 toString() 方法
toString() 方法可把一个逻辑值转换为字符串,并返回结果。
用法 booleanObject.toString(),返回值根据原始布尔值或者 booleanObject 对象的值返回字符串 "true" 或 "false"。如果调用该方法的对象不是 Boolean,则抛出异常 TypeError。
-----------
当这两者单独重写的时候不会出现问题,会根据他们重写后返回的类型进行输出对应的值,但当两者同时存在的时候,两者的区别就出来了
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方法,但最终却调用valueOf方法。
结论
如果只重写了toString,对象转换时会无视valueOf的存在来进行转换。但是,如果只重写了valueOf方法,在要转换为字符串的时候会优先考虑valueOf方法。在不能调用toString的情况下,只能让valueOf上阵了。对于那个奇怪的字符串拼接问题,可能是出于操作符上,翻开ECMA262-5 发现都有一个getValue操作。嗯,那么谜底应该是揭开了。重写会加大它们调用的优化高,而在有操作符的情况下,valueOf的优先级本来就比toString的高。
别人的答案分析:https://segmentfault.com/q/1010000004342477?_ea=576728
两者区别:http://www.jb51.net/article/32327.htm
转载于:https://my.oschina.net/u/2949632/blog/875540
toString()和valueOf()重写的区别相关推荐
- toString与valueOf区别
对应视频分享:点击进入 基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null和undefined除外.它们俩解决javascript值运算与显示的问题, ...
- 彻底了解toString和valueOf区别
toSring和valueof 两者都是对象的方法!前者返回对象的字符串,后者返回对象的原始值,如果没有原始值则返回对象本身! 1.toSring() 直接看代码 console.log((1).to ...
- 26.JavaScript对象和基础类型之间的转换、hint、Symbol.toPrimitive、toString、valueOf
文章目录 对象-基础类型转换 写在前面 对象类型转换规则 对象类型转换的结果 Hint String Number Default 转换需要的三个对象方法 Symbol.toPrimitive() t ...
- 通过char[]获得字符串new String(chars) || chars.toString() || String.valueOf(chars)对比
今天刷Leecode49. 字母异位词分组,遇到一个通过char[]获得字符串的问题,记录一下new String(chars) || chars.toString() || String.value ...
- 一文看懂JS里隐式转换、toString() 和 valueOf()
js-看懂隐式转换toString 和 valueOf js隐式类型转换 数值类型和布尔类型的相加 字符串和数字相加 隐式类型转换隐藏一些错误 isNaN() 对象的隐式转换 强制类型转换 - &qu ...
- toString()与new String ()用法区别
toString()与new String ()用法区别 TestString.java package com.atguigu;import com.sun.org.apache.xerces.in ...
- Java中方法重载和方法重写的区别
文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...
- 二十三、Java类中重载和重写的区别
@Author:Runsen @Date:2020/5/31 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排 ...
- C++中重载与重写函数区别及虚函数(转载)
C++中重载与重写函数区别及虚函数 C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的 ...
- java 可以重载等于号码_Java面试之Java基础4——重载与重写的区别
目录 重载与重写的概念 重载与重写的区别 重载与重写的总结 构造器是否能被重写override 为什么函数不能根据返回类型来区分重载 重载与重写的概念 重载:同样一个方法可以根据输入参数列表的不同,做 ...
最新文章
- Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)
- Python学习心得(二) 字典Dictionary
- c语言的适当大小的子集,编译原理上机实验报告
- python开发好学吗-Python的前景和Python好不好学呢?
- 《linux内核完全剖析:基于0.12内核》读书笔记一
- SAP Fiori smart template技术里CDS view的注解和UI元素对应关系
- python读取文档中有很多指标的数据 写成矩阵_图像处理与特征提取 —— 从 MATLAB 到 Python(一)图像、矩阵与数据的读写...
- 【编程帮助】python中字符串前的 r、b、u、f 的含义及用法
- Apache Tika 内容抽取工具集合
- sklearn计算准确率,召回率,精确率,F1函数
- centos7下mongoDB安装和配置
- 机器学习算法工程师--实习面经
- 二维码推动了“智慧边境管理”建设
- C-V2X仿真测试之虚拟场景设计
- 利用Python脚本来使用Google自动翻译Excel表格文件
- base64,base32bit加密解密
- 如何用python写一个答题程序_如何使用Python写一个百万英雄的答题辅助程序 (0) 简介...
- 【Chips】VLSI Final Project:小型卷积核单元设计 项目总结
- 大数据行业就业指南:三大方向 十大职位
- web python template injection_[Day 2] Template Injection:欸不是,你真的懂 Python 嗎?