前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >toString()和valueOf()函数调用和优先级

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

作者头像
wade
发布2020-04-24 17:19:15
8590
发布2020-04-24 17:19:15
举报
文章被收录于专栏:coding个人笔记coding个人笔记

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

add(2)(3)(4);

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

代码语言:javascript
复制
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()方法

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

代码语言:javascript
复制
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,应该还有很多我还不知道的优先级:

代码语言:javascript
复制
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)是一个函数

代码语言:javascript
复制
console.log(typeof add(5));//function

是这个函数:

代码语言:javascript
复制
function (y) { 
  sum = sum + y; 
   return tmp;
};

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

代码语言:javascript
复制
add(5)(2)(3);

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

代码语言:javascript
复制
tmp.toString = function () { 
  console.log('toString') 
  return sum;
};

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

代码语言:javascript
复制
add(5)(2) + add(5)(3);//toString  toString 

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

代码语言:javascript
复制
console.log(add(5)(4));

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

(完)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档