柯理化 & 重写 fn.toString

2021-09-16

1、重写 fn.toString

function bar(){
  return 2;
}
bar.toString = function(){ return 1 }

alert(bar) // 1
bar + 1 // 2

bar()

重写了一个方法的 toString 方法,然后如果这个 方法当字符串 用,那么就会执用方法上的 toString 方法,并返回结果,然后再作处理...

当然,如果执行这个函数,还是能执行的,这时与 toString 就没啥关系了。

2、相关面试题:

请编写一个函数使得其被以下任一方式调用都可得到预期结果。

console.log(+sum(2,3));   // Outputs 5
console.log(+sum(2)(3));  // Outputs 5
console.log(+sum(2,3,4);  // Outputs 9
console.log(+sum(2)(3)(4);  // Outputs 9

解题:

function  add() {
  let args = [...arguments]; // 类数组切换为数组

  let inner = function() {
    args.push(...arguments);
    return inner; // 递归(函数自己调用自己),有几个括号,就执行几次 args.push
  }

  // 关键:巧用 toString 隐式转换,在 add 执行后,依旧能返回重写 to String 的返回结果
  inner.toString = function() {
    return args.reduce((a, b) => a + b);
  }
  
  return inner; // 返回内部函数,如果不去重写 toString,此时返回的是方法的字符串形式
}

你可能感兴趣的:(柯理化 & 重写 fn.toString)