为什么这个函数调用返回一个字符串而不是一个数字

Why this function invocation return a string and not a number

本文关键字:一个 数字 字符串 为什么 函数调用 返回      更新时间:2023-09-26

我想在一个对象中存储一个函数和它的参数,并通过这个对象调用它,如下所示:

var fn = function(x, y) {
  return x + y
};
var obj = {
  'args': [2, 3],
  'func': fn
};
console.log(obj.func(obj['args']));

为什么这段代码返回一个字符串"2,3undefined" ?如果它以字符串的形式接收参数,并且+将它们连接起来,它甚至不是'23'。我如何使它像预期的那样返回5 ?非常感谢!

尝试使用apply来调用函数:

var fn = function(x,y) {return x + y };
var obj = { 'args': [2, 3], 'func' : fn};
console.log(obj.func.apply(obj, obj['args']));

在你的例子中,你实际做的是传递整个数组作为'x'参数和一个未定义的y值。Apply将使用所提供的数组作为参数调用该函数。

将一个数组作为单个参数传递给函数

var fn = function(x,y) {return x + y };

你的呼叫看起来像fn([2, 3])

所以在运行时,x等于数组,y等于undefined。你什么也没通过。

[2, 3] + undefined

被求值为字符串,因为[2, 3]的标量值是2,3string + undefined表达式也将第二个操作数强制转换为string,因此2,3undefined

要"修复"它-使用Function.prototype.apply:

fn.apply(null, [2, 3])

或者

console.log(obj.func.apply(null, obj['args']));

引用:

  • Function.prototype.apply
  • 加法运算符-运行时语义:求值