一、抛题
实现一个函数,运算结果可以满足如下预期结果:
1 | add(1)(2) // 3 |
二、破题
难点:如何既返回一个值又返回一个函数以供后续继续调用?
1 | function add () { |
三、解题
1、Object.prototype.valueOf()
JavaScript 调用 valueOf() 方法用来把对象转换成原始类型的值(数值、字符串和布尔值)。但是我们很少需要自己调用此函数,valueOf 方法一般都会被 JavaScript 自动调用。
2、Object.prototype.toString()
每个对象都有一个 toString() 方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用。
3、类型的转换规则
(1)String 类型转换
转换规则:
- 如果 toString 方法存在并且返回原始类型,返回 toString 的结果
- 如果 toString 方法不存在或者返回的不是原始类型,调用 valueOf 方法
- 如果 valueOf 方法存在,并且返回原始类型数据,返回 valueOf 的结果
- 其他情况,抛出错误
1 | var obj = { |
(2)Number 类型转换
转换规则:
- 如果 valueOf 存在,且返回原始类型数据,返回 valueOf 的结果。
- 如果 toString 存在,且返回原始类型数据,返回 toString 的结果。
- 其他情况,抛出错误。
1 | var obj = { |
(3)Boolean 类型转换
转换规则
- 除了下述 6 个值转换结果为 false,其他全部为 true:
- undefined
- null
- -0
- 0或+0
- NaN
- ”(空字符串)
(4)Function类型转换
规则转换
- 如果 valueOf 存在,且返回原始类型数据,返回 valueOf 的结果。
- 如果 toString 存在,且返回原始类型数据,返回 toString 的结果。
- 其他情况,抛出错误。
1 | test.valueOf = function() { |