关于JavaScript函数的valueOf \的toString和 '咖喱' 功能在Chrome,Firefox的不同表现和节点环境

关于JavaScript函数的valueOf \的toString和 '咖喱' 功能在Chrome,Firefox的不同表现和节点环境

问题描述:

我写了一个函数:关于JavaScript函数的valueOf 的toString和 '咖喱' 功能在Chrome,Firefox的不同表现和节点环境

function add(){ 
    let arr = []; 
    arr = arr.concat(Array.prototype.slice.apply(arguments)) 
    let fun = function(){ 
     arr = arr.concat(Array.prototype.slice.apply(arguments)) 
     return fun 
    } 
    fun.toString = function(){ 
     console.log(222) 
     return arr.reduce(function(total, num){ 
      return total+num 
     }, 0) 
    } 
    return fun 
} 
console.log(add(1,2)(2,3)(3)) 

这是在Chrome: enter image description here

两个问题:

  1. 在第一行,为什么是'f 11'而不是'11'

  2. 为什么首先输出'f 11',而不是'222',我认为应该先执行类型转换,然后在控制台上输出计算结果。

另一种奇怪的东西,它是与相同的代码,结果在Firefox: enter image description here

而导致节点环境: enter image description here

我不明白为什么,似乎在FF和节点,还没有执行计算的操作。

请帮助我...非常感谢!

+0

* f *的意思是*功能*这是正确的 –

+0

这是什么意思?为什么你必须调用'toString'来获取值?这完全违反直觉。尝试有一个同时具有可变性和咖喱味的“添加”功能是很奇怪的。 –

+0

@JonasW。正确的功能? – DaXiong1

起初,你可以美化整个代码位:

function add(..arr){ 
    function fun(...args){ 
    arr.push(...args); 
    return fun 
    } 

    fun.toString = function(){ 
    return arr.reduce((total, num) => total + num) 
    }; 
    return fun; 
} 

而当你正确地注意到,记录的功能完全取决于环境。 Firefox和节点返回函数的代码,而Chrome并某物像:

out("f" + add.toString()) 

所以我们的ToString函数被调用和一些记录。有不同的环境之间的一致的行为,我们可以明确地调用toString:

console.log(add(1)(2)(3).toString()); 

这可以推断:

console.log("" + add(1)(2)); 
+0

是的,对,这可能是一个很好的解决方案。但我想知道为什么一个函数输出,而不是一个值,并在FF或节点,'console.log(222)'似乎没有执行... – DaXiong1

+0

@daXiong'火狐和节点返回函数的代码,而Chrome则是这样做的:' –

如果你想要的是add既可变参数和咖喱(我仍然认为是奇怪的),只是这样做:

const add = (...args) => { 
    let accum = args; 
    let f = (...fargs) => { 
    if (!fargs.length) { 
     return accum.reduce((a, b) => { return a + b; }, 0); 
    } else { 
     accum = accum.concat(fargs); 
     return f; 
    } 
    }; 
    return f; 
}; 

add(1,2,3)(); // 6 
add(1)(2,3)(); // 6 
add()(); // 0 

现在你只是调用没有参数的返回函数来获取值。你可以玩弄它,使其更具性能(例如,通过在循环中使用.push而不是.concat),但这应该起作用。

+1

...或'accum.push(... fargs)' –

+0

谢谢你,我明白了。这真是个好主意! – DaXiong1