对象转原始值先toString再valueOf

var obj = {toString: function() {console.log('调用了 obj.toString');return {};},valueOf: function() {console.log('调用了 obj.valueOf')return '110';}
}alert(obj);
// 调用了 obj.toString
// 调用了 obj.valueOf
// 弹出110

从上面代码可看出输出obj时,先调用其toString方法,若toString返回原始值就直接返回,否则继续调用valueOf方法。

var obj = {toString: function() {console.log('调用了 obj.toString');return {};},valueOf: function() {console.log('调用了 obj.valueOf')return {};}
}alert(obj);
// 调用了 obj.toString
// 调用了 obj.valueOf
// Uncaught TypeError: Cannot convert object to primitive value

若toString和valueOf都返回对象则程序报错

对象与数值运算转原始值先valueOf再toString

var obj = {valueOf: function() {console.log('调用 valueOf');return 5;}
}console.log(obj + 1);
// 调用 valueOf
// 6var obj = {valueOf: function() {console.log('调用 valueOf');return {};},toString: function() {console.log('调用 toString');return 10;}
}console.log(obj + 1);
// 调用 valueOf
// 调用 toString
// 11var obj = {valueOf: function() {console.log('调用 valueOf');return {};},toString: function() {console.log('调用 toString');return {};}
}console.log(obj + 1);
// 调用 valueOf
// 调用 toString
// Uncaught TypeError: Cannot convert object to primitive value

输出函数名先valueOf,再toString

function test() {var a = 1;console.log(1);
}
test;
// 这里打印函数内容,即调用了test.valueOf()test.valueOf = function() {console.log('调用 valueOf 方法');return 2;
}test;
// 输出如下:
// 调用 valueOf 方法
// 2

添加toString方法并将valueOf返回对象


test.valueOf = function() {console.log('调用 valueOf 方法');return {};
}
test.toString= function() {console.log('调用 toString 方法');return 3;
}
test;
// 输出如下:
// 调用 valueOf 方法
// 调用 toString 方法
// 3

若将其valueOf和toString都返回对象,程序不会报错

test.valueOf = function() {console.log('调用 valueOf 方法');return {};
}
test.toString= function() {console.log('调用 toString 方法');return {};
}
test;
//调用 valueOf 方法
//调用 toString 方法
//ƒ #<Function>

题目

add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15

实现:

function add() {var args1 = Array.prototype.slice.call(arguments);var fn = function () {var args2 = Array.prototype.slice.call(arguments);return add.apply(null,args2.concat(args1));};fn.toString = function () {return  args1.reduce(function (a, b) {return a * b;});};<!-- fn.valueOf = function () {return  args1.reduce(function (a, b) {return a + b;});};-->return fn;
}

其中,valueOf和toString,哪个先被改写优先调用谁,同时出现,调用valueOf

JS重写函数valueOf方法实现连续调用求和相关推荐

  1. layui外部引入_layui use 定义js外部引用函数的方法

    layui.use 加载layui.define 定义的模块,当外部 js 或 onclick调用 use 内部函数时,需要在 use 中定义 window 函数供外部引用 ,如下: layui.us ...

  2. js中 函数和方法的区别:转载于黑泽君

    js中 函数和方法的区别 在javascript中的解释为: 函数(function)是可以执行的javascript代码块,由javascript程序定义或javascript实现预定义.函数可以带 ...

  3. js中函数、方法、对象的区别

    一.函数: 1.函数就是一个工具,通过一小段代码,完成某个功能: 2.函数的定义: function 函数名(){..... } 或者 : var 函数名 = function(){...... } ...

  4. JS中的valueOf方法

    彭老湿近期月报里提到了valueOf方法,兴致来了翻了下ECMA5里关于valueOf方法的介绍,如下: 15.2.4.4 Object.prototype.valueOf ( ) When the  ...

  5. Js日期函数-Date方法

    Ⅰ- 壹 - Date对象 一 Date对象简介 日期和时间,在Web应用中随处可见,也必不可少.JS脚本内置了Date对象,该对象为我们提供了一些列操作时间和日期的方法. 1 使用时必须使用new来 ...

  6. JS 匿名函数——几种不同的调用方式

    匿名函数声明和使用 匿名函数有两种用法: 赋值 自我执行 1.声明一个匿名函数,直接赋值给某一个事件 windon.onload = function(){alert('hello'); }; 2.使 ...

  7. html如何调用js的函数返回值,CDHtmlDialog实现调用html中js函数-江湖宵小-搜狐空间...

    2008-05-05 14:17 1.在APP的InitInstance()函数中加入AfxEnableControlContainer();以支持ole控件: 2.在CDHtmlDialog::On ...

  8. js动态函数(方法)

    一.动态函数构成  MethodName-----函数名称  Parameter-----入参 ToolClickFun(MethodName, Parameter) {this[`${MethodN ...

  9. 在Angular单元测试代码的it方法里连续调用两次detectChange方法,会触发两次ngAfterViewInit吗

    做一个测试: 测试结果:第67行执行完毕之后,ngOnChange和ngAfterViewInit均未触发. 即使手动修改Component的属性也没用了: 单元测试里修改的属性已经生效了: 还是解析 ...

最新文章

  1. sql针对某字段去重查询_sql针对某一字段去重,并且保留其他字段
  2. FPGA和NIOS2的关系
  3. Spring context:component-scan代替context:annotation-config
  4. [SDOI2005]动物园 匹配
  5. 哈啰出行回应单车违规投放:将尽快缴纳罚金 积极整改
  6. 疯狂Java实战演义
  7. Spark性能优化指南——基础篇【1】
  8. Arduino+SIM900A+继电器
  9. python当行刷新
  10. Linux系统引导过程及引导修复
  11. 九种常用输入法特殊符号功能大揭密
  12. 【Encoder-Decoder】
  13. 学习笔记——VMware网络桥接的几个问题(有配置问题的值得一看)
  14. 芯片制造良率分析系统YMS
  15. java实现福利彩票抽奖_【福利】快来参与抽奖获得《Java程序设计》
  16. 关于龙蜥社区20个问题 |龙蜥问答第1期
  17. [软件分享]Bandizip(有史以来最好的压缩软件)「v1.0」
  18. 自媒体人如何定位?自媒体大号应该怎么去运营和发展
  19. 计算机毕业设计ssm千益校园帮跑腿信息平台5e9ev系统+程序+源码+lw+远程部署
  20. talent-aio

热门文章

  1. 手机数控模拟器安卓版_数控机床模拟器手机版下载-数控机床模拟器最新版v1.1.4 安卓版 - 极光下载站...
  2. html5控件结构图,OrgChart组织架构图控件
  3. slurm 安装使用(centos7)
  4. 炼丹师入门修炼指南-深度学习入门资料推荐
  5. 经典书是必须要读吗?
  6. melogin宽带连接服务器无响应,melogin.cn打不开设置界面怎么办
  7. 在海外应用商店如何跟踪广告投放的效果
  8. CF 420 821B Okabe and Banana Trees
  9. 计算机数据的存储单位
  10. idea 查看单元测试覆盖率