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()重写的区别相关推荐

  1. toString与valueOf区别

    对应视频分享:点击进入 基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null和undefined除外.它们俩解决javascript值运算与显示的问题, ...

  2. 彻底了解toString和valueOf区别

    toSring和valueof 两者都是对象的方法!前者返回对象的字符串,后者返回对象的原始值,如果没有原始值则返回对象本身! 1.toSring() 直接看代码 console.log((1).to ...

  3. 26.JavaScript对象和基础类型之间的转换、hint、Symbol.toPrimitive、toString、valueOf

    文章目录 对象-基础类型转换 写在前面 对象类型转换规则 对象类型转换的结果 Hint String Number Default 转换需要的三个对象方法 Symbol.toPrimitive() t ...

  4. 通过char[]获得字符串new String(chars) || chars.toString() || String.valueOf(chars)对比

    今天刷Leecode49. 字母异位词分组,遇到一个通过char[]获得字符串的问题,记录一下new String(chars) || chars.toString() || String.value ...

  5. 一文看懂JS里隐式转换、toString() 和 valueOf()

    js-看懂隐式转换toString 和 valueOf js隐式类型转换 数值类型和布尔类型的相加 字符串和数字相加 隐式类型转换隐藏一些错误 isNaN() 对象的隐式转换 强制类型转换 - &qu ...

  6. toString()与new String ()用法区别

    toString()与new String ()用法区别 TestString.java package com.atguigu;import com.sun.org.apache.xerces.in ...

  7. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

  8. 二十三、Java类中重载和重写的区别

    @Author:Runsen @Date:2020/5/31 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排 ...

  9. C++中重载与重写函数区别及虚函数(转载)

    C++中重载与重写函数区别及虚函数 C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的 ...

  10. java 可以重载等于号码_Java面试之Java基础4——重载与重写的区别

    目录 重载与重写的概念 重载与重写的区别 重载与重写的总结 构造器是否能被重写override 为什么函数不能根据返回类型来区分重载 重载与重写的概念 重载:同样一个方法可以根据输入参数列表的不同,做 ...

最新文章

  1. Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)
  2. Python学习心得(二) 字典Dictionary
  3. c语言的适当大小的子集,编译原理上机实验报告
  4. python开发好学吗-Python的前景和Python好不好学呢?
  5. 《linux内核完全剖析:基于0.12内核》读书笔记一
  6. SAP Fiori smart template技术里CDS view的注解和UI元素对应关系
  7. python读取文档中有很多指标的数据 写成矩阵_图像处理与特征提取 —— 从 MATLAB 到 Python(一)图像、矩阵与数据的读写...
  8. 【编程帮助】python中字符串前的 r、b、u、f 的含义及用法
  9. Apache Tika 内容抽取工具集合
  10. sklearn计算准确率,召回率,精确率,F1函数
  11. centos7下mongoDB安装和配置
  12. 机器学习算法工程师--实习面经
  13. 二维码推动了“智慧边境管理”建设
  14. C-V2X仿真测试之虚拟场景设计
  15. 利用Python脚本来使用Google自动翻译Excel表格文件
  16. base64,base32bit加密解密
  17. 如何用python写一个答题程序_如何使用Python写一个百万英雄的答题辅助程序 (0) 简介...
  18. 【Chips】VLSI Final Project:小型卷积核单元设计 项目总结
  19. 大数据行业就业指南:三大方向 十大职位
  20. web python template injection_[Day 2] Template Injection:欸不是,你真的懂 Python 嗎?

热门文章

  1. 日历获取当前月份的月数与当前月份第一天离第一个格子的位置。
  2. 【LeetCode 231】Power of Two
  3. 常见前端开发的题目,可能对你有用
  4. sqlserver 查找某个字符在字符串中第N次出现的位置
  5. php Output Control 深入理解 ob_flush 和 flush 的区别
  6. 121 Python程序中的线程操作-线程定时器
  7. 082 typing模块
  8. vue package.json 解析
  9. 使用IronPython集成Python和.NET
  10. 用ASP.NET刷新页面的几种有效方法