簡體   English   中英

為什么我不能在函數的參數上調用數組方法?

[英]Why can't I call an array method on a function's arguments?

我有一個可以接受任意數量參數的函數......

const getSearchFields = () => {        
    const joined = arguments.join('/'); 
};

我想要一個所有參數的字符串傳遞給與/字符連接的函數。 我一直收到這個錯誤:

args.join不是一個函數

有人可以告訴我我做錯了什么嗎?

arguments是一個偽數組,而不是一個真實數組。 join方法可用於數組。

你需要作弊:

var convertedArray = [];

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

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

與其他帖子類似,您可以做以下簡寫:

var argsString = Array.prototype.join.call(arguments, "/");

如上所述,arguments對象實際上不是一個數組,但您可以直接應用數組函數,方法是訪問Array.prototype並使用applycall來執行它們來更改上下文:

var argsString = Array.prototype.join.call(arguments, '/');

編輯 :由於大約9年前提出的原始問題被更新為使用ES6語法,我覺得現在需要提供ES6答案,語言提供本機構造來處理這種情況。

ES6標准引入了擴展運算符 ,您可以輕松地將其作為數組對象接收參數,例如:

 function sum(...numbers) { return numbers.reduce((sum, value) => sum + value); } console.log(sum(1,2,3,4)); // 10 

適用於您的示例:

const getSearchFields = (...fields) => {        
  const joined = fields.join('/'); 
};

您也可以使用spread運算符來執行函數調用,假設您有一個數組,並且您想要調用一個函數,將數組的每個元素作為函數調用的參數傳遞,現在您可以簡單地:

 function sum(a, b, c, d) { return a + b + c + d; } var array = [1, 2, 3, 4]; console.log(sum(...array)); // 10 

您還可以期待一些參數,並將其余參數作為最后一個參數定義:

function processList(first, ...rest) {
  // ...
}

並且擴展運算符的更多用途超出了這個問題的范圍,例如對象復制,在數組中擴展數組等等......

如果您使用的是jQuery 1.2+ ,則可以使用$.makeArray()

將類似數組的對象轉換為真正的JavaScript數組。

從問題中的示例,只需使用此行

var args = $.makeArray(arguments);

參數實際上不是一個數組。

試試這個:

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

問題是arguments是一個類似數組的對象 (它有編號的屬性映射到傳遞的參數和length屬性),但它實際上不是一個數組。

在過去,你可以使用Array.prototype.slice.call(arguments) (以及其他方法)將它變成一個真正的數組。

但是,這些天我們有點幸運(當然取決於您支持的平台)。 你可以做......

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

...要么...

const getSearchFields = () => {
   const args = Array.from(arguments);
   Array.isArray(args); // true
};

第一個例子是首選,因為......

  • 你可以在函數體中沒有額外的步驟而獲得正常的數組創建
  • arguments是一個神奇的變量(它沒有明確定義,所以它來自哪里?)
  • 在非嚴格模式下具有命名args的有趣行為 (注意你應該總是'use strict'
  • 第一個例子有更清晰的意圖(所有參數的數組的創建都是explcit)。

arguments不是JavaScript數組; 它是一個沒有join方法的特殊對象。

如果你在angular4用戶HttpHeaders中發布http請求時得到了。 請檢查以下答案。 在使用HttpHeaders后,我的問題得到了解決。

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

values.join不是http.es5.js Angular 4文件中的函數

您必須為變量賦值才能使其正常工作。

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

var myVar1 = a.join();

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

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

var myVar4 = a.join('');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM