[英]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並使用apply或call來執行它們來更改上下文:
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
是一個神奇的變量(它沒有明確定義,所以它來自哪里?) 'use strict'
) arguments
不是JavaScript數組; 它是一個沒有join
方法的特殊對象。
如果你在angular4用戶HttpHeaders中發布http請求時得到了。 請檢查以下答案。 在使用HttpHeaders后,我的問題得到了解決。
this.headers = new HttpHeaders({ 'Authorization': token1, 'X-IBM-Client-Id': 'ddddddd' });
您必須為變量賦值才能使其正常工作。
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.