专栏首页coding个人笔记toString()和valueOf()函数调用和优先级

toString()和valueOf()函数调用和优先级

最近水群的时候看见了一个题目:

add(2)(3)(4);

简单了说就是链式调用,链式调用的方法有很多,jQuery的,underscore的和lodash这三个库采用了不同的方式。而上面这个就简单多了:

function add(x) { 
  var sum = x; 
  var tmp = function (y) { 
  sum = sum + y; 
    return tmp; 
  }; 
tmp.toString = function () { 
   return sum; 
}; 
   return tmp;
}

这边只是使用了输出或者是运算的时候类型的转换。

JavaScript中几乎所有的对象都继承了toString和valueOf这两个方法:

valueOf()会把数据类型转换成原始类型

toString()会把数据类型转换成string类型

需要注意的是,这两个方法在不同使用场景会有不同的优先级:

正常情况下,优先调用toString()

有运算操作符的情况下valueOf()的优先级高于toString()

当调用valueOf()方法无法运算后还是会再调用toString()方法

我们可以改写这两个方法测试优先级:

var n = { 
   toString: function () { 
       return 1 
   }, 
   valueOf: function () { 
      return 2 
   }
}
var obj = {1: 1, 2: 2};
console.log(+n);//1
console.log(obj[n]);//2

除了上面三个方法之外,还是有一些会比较特殊,比如Date,应该还有很多我还不知道的优先级:

var date=new Date();
date.valueOf = function(){ 
  return '1000'
}
console.log(+date);
大概知道这两个方法之后,回归这个函数:
function add(x) { 
  var sum = x; 
   var tmp = function (y) { 
    sum = sum + y; 
     return tmp; 
  };
  tmp.toString = function () { 
   return sum; 
 };
  return tmp;
}

调用:add(5)(3)(2)

其实add(5)是一个函数

console.log(typeof add(5));//function

是这个函数:

function (y) { 
  sum = sum + y; 
   return tmp;
};

因为闭包的原因,tmp和sum都被存起来了。所以我们可以链式调用。

add(5)(2)(3);

当我们执行完毕,想要运算或者是输出的时候,就会执行toString方法。

tmp.toString = function () { 
  console.log('toString') 
  return sum;
};

然后执行输出或者是运算:

add(5)(2) + add(5)(3);//toString  toString 

但是不同浏览器会有不同的结果,火狐上面:

console.log(add(5)(4));

不进行运算是不会调用toString的。

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 递归尾调用优化

    尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是return调用另一个函数。

    wade
  • Typeof的使用

    String类型就是字符串了,空字符串也会返回string,任何加了引号的都是字符串。

    wade
  • 了解一下这些资讯

    作为一个程序员,对于一些业界内的最新咨询应该要了解,这些咨询或许跟你所用的不是同一个语言,或许也不是你在使用的技术点,也没希望你真的去研究,只是拓展一下视野。

    wade
  • JavaScript设计模式学习(四)单件(Singleton Pattern)

    单件是JavaScript中最基本、最有用的设计模式,而你今后也会经常的使用这个模式。通过单件,我们可以把统一到一个逻辑单元中并且提供一个唯一的入口,这就保证你...

    大江小浪
  • lua

    数学库由算术函数的标准集合组成,比如三角函数库(sin, cos, tan, asin, acos, etc.), 幂指函数(exp, log, log10),...

    radaren
  • Chrome扩展程序之编码&时间戳小工具

    Chrome扩展程序之编码&时间戳小工具 作为一个前端小白,对于chrome扩展程序久闻大名,实际动手头一次;前天晚上到前端哪里串门看到小伙伴在搞这个,要了份...

    一灰灰blog
  • co 源码精读

    co 是著名的 TJ 于 2013 年推出的一个利用 ES6 的 Generator 函数来解决异步操作的开源项目,也是后来 JavaScript 异步操作的终...

    逆葵
  • AI 小抄表福利大放送,快来收藏吧

    推荐阅读时间:5min~8min 文章内容: AI 小抄表福利 Numpy ? Scipy ? Matplotlib ? Pandas ? ---- ? --...

    abs_zero
  • Laravel5.1 框架模型一对一关系实现与使用方法实例分析

    本文实例讲述了Laravel5.1 框架模型一对一关系实现与使用方法。分享给大家供大家参考,具体如下:

    砸漏
  • java学习之路:26.方法的重载,多态,抽象类与接口

    方法的重载就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或者类型不同即可。 代码演示:

    花狗Fdog

扫码关注云+社区

领取腾讯云代金券