Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';调用函数';谁的论点?_Javascript - Fatal编程技术网

Javascript 为什么可以';调用函数';谁的论点?

Javascript 为什么可以';调用函数';谁的论点?,javascript,Javascript,我有一个函数,可以接受任意数量的参数 const getSearchFields = () => { const joined = arguments.join('/'); }; 我想要一个字符串,其中包含传递给函数的所有参数,并使用/字符连接。我不断地发现这个错误: args.join不是函数 有人能告诉我我做错了什么吗?参数是一个伪数组,不是真实数组。join方法可用于数组 你需要作弊: var convertedArray = []; for(var i

我有一个函数,可以接受任意数量的参数

const getSearchFields = () => {        
    const joined = arguments.join('/'); 
};
我想要一个字符串,其中包含传递给函数的所有参数,并使用
/
字符连接。我不断地发现这个错误:

args.join不是函数


有人能告诉我我做错了什么吗?

参数
是一个伪数组,不是真实数组。
join
方法可用于数组

你需要作弊:

var convertedArray = [];

for(var i = 0; i < arguments.length; ++i)
{
 convertedArray.push(arguments[i]);
}

var argsString = convertedArray.join('/');

参数
不是JavaScript数组;它是一个特殊的对象,没有
join
方法。

参数实际上不是数组

试试这个:

var args = [].splice.call(arguments,0);
var argsString = args.join('/');

如上所述,arguments对象实际上不是一个数组,但是您可以通过访问array.prototype并使用或更改上下文来直接应用数组函数:

var argsString = Array.prototype.join.call(arguments, '/');
编辑:由于9年前提出的原始问题已更新为使用ES6语法,我觉得现在需要提供ES6答案,因为该语言提供了处理此类情况的本机结构

ES6标准引入了spread运算符,您可以轻松地使用它作为数组对象接收参数,例如:

函数和(…数字){
返回数字。减少((总和,值)=>总和+值);
}

console.log(总和(1,2,3,4));//10
如果您正在使用jQuery 1.2+,您可以使用:

将类似数组的对象转换为真正的JavaScript数组

根据问题中的例子,只需使用这一行

var args = $.makeArray(arguments);

您必须为变量赋值才能使其工作

var a = ['Wind', 'Rain', 'Fire'];

var myVar1 = a.join();

var myVar2 = a.join(', ');

var myVar3 = a.join(' + ');

var myVar4 = a.join('');

如果您在angular4用户HttpHeaders中发布http请求时获取。请检查下面的答案。使用HttpHeaders后,我的问题得到解决

this.headers  = new HttpHeaders({ 'Authorization': token1, 'X-IBM-Client-Id': 'ddddddd' });

问题在于
参数
是一个类似数组的对象(它具有映射到传递的参数的编号属性和
长度
属性),但实际上它不是数组

在过去,您可以使用
array.prototype.slice.call(参数)
(以及其他方法)将其生成一个真正的数组

然而,我们现在有点幸运(当然取决于您支持的平台)。你可以做

const getSearchFields = (...args) => {
   Array.isArray(args); // true
};
……或者

const getSearchFields = () => {
   const args = Array.from(arguments);
   Array.isArray(args); // true
};
首选第一个示例,因为

  • 在函数体中无需额外步骤即可创建正常数组
  • 参数
    是一个神奇的变量(它没有明确定义,那么它从何而来?)
  • 它有(请注意,您应该始终
    “使用严格的”
  • 第一个示例的意图更为明确(创建一个包含所有参数的数组是explicit)

“/”需要用括号括起来,我使用的是call,不是apply…更正,调用apply时可能需要这样做。你在用电话。我的错误。要将arguments对象转换为数组,只需:
var convertedArray=array.prototype.slice.call(参数)您还可以通过使用splice….简化循环。。。。var args=[].splice.call(参数,0)@Russ:Shorter但在IE上不起作用,你应该直接调用Array.prototype.slice函数。你的语句不正确,也不能回答问题。为了记录起见,这在jQuery 1.11.0中对我有用,为什么要编辑它以使用ES6语法?@TimDown在更新它时感觉不错。如果你是在暗示的话,我想有充分的理由反对这样做。我不知道,只是当2009年的答案出现在ES3中时,似乎有点奇怪。“我现在还不知道把老问题改成现代语法是好是坏。”TimDown AFAIK,我们鼓励你保持答案始终是最新的,即使问题变得陈旧。在这种情况下,现在问题看起来不那么过时了。@alex,我也更新了,提供了一种ES6方法来解决这个问题。谢谢
const getSearchFields = () => {
   const args = Array.from(arguments);
   Array.isArray(args); // true
};