2009-09-15 16 views
19

Tôi đã một chức năng mà chấp nhận nhiều đối số (chỉ có một được xác định trong chức năng mặc dù)Tại sao kết nối của tôi trên mảng JavaScript bị lỗi?

var getSearchFields = function(method) { 

    console.log(arguments); // this prints them out nicely into the console 

    var args = arguments; 

    var argsString = args.join('/'); // I expect 'arg1/arg2/arg3', instead I get 'args.join is not a function' 
} 

Tôi chỉ muốn có một chuỗi của tất cả các đối số được gửi đến các chức năng. Tôi vẫn gặp phải lỗi này:

args.join is not a function

Ai đó có thể vui lòng cho tôi biết tôi đang làm gì sai?

Trả lời

42

arguments là mảng giả, không phải là mảng thực. Phương thức join có sẵn cho các mảng.

Bạn sẽ cần để lừa:

var convertedArray = []; 

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

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

Tương tự như bài viết khác, bạn có thể làm như sau là viết tắt:

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

Để chuyển đổi các đối số đối tượng đến một mảng, bạn có thể chỉ đơn giản là: 'var convertedArray = Array.prototype.slice.call (arguments);' – CMS

+0

bạn cũng có thể đơn giản hóa vòng lặp bằng cách sử dụng mối nối .... var args = [] .splice.call (đối số, 0); –

+3

@Russ: Ngắn hơn nhưng sẽ không hoạt động trên IE, bạn nên gọi trực tiếp hàm Array.prototype.slice. – CMS

0

arguments không phải là một mảng JavaScript; đó là một đối tượng đặc biệt không có phương thức join.

5

đối số không thực sự là một mảng.

thử điều này:

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

Như đã nói ở trên, các đối số đối tượng không phải là thực sự là một mảng, nhưng bạn có thể áp dụng chức năng mảng trực tiếp, bằng cách truy cập Array.prototype và thực hiện chúng với apply hoặc call để thay đổi bối cảnh:

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

'/' cần được bao quanh bởi dấu ngoặc đơn –

+4

Không, tôi đang sử dụng cuộc gọi, không áp dụng – CMS

+2

... chỉnh sửa, điều này có thể cần phải là trường hợp khi áp dụng được gọi. Bạn đang sử dụng cuộc gọi. Lỗi của tôi. –

7

Nếu bạn đang sử dụng jQuery 1.2+, bạn có thể sử dụng $.makeArray():

Convert an array-like object into a true JavaScript array.

Từ ví dụ trong câu hỏi, chỉ cần sử dụng dòng này

var args = $.makeArray(arguments); 
+0

Chỉ dành cho các bản ghi vì lợi ích này hoạt động cho tôi trong jQuery 1.11.0 – Celt

-1

Bạn phải làm nhiệm vụ cho một biến cho nó để làm việc.

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

var myVar1 = a.join(); 

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

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

var myVar4 = a.join(''); 
+1

Tuyên bố của bạn không chính xác và nó không trả lời câu hỏi. – alex

0

Nếu bạn nhận được trong khi đăng yêu cầu http trong angular4 người dùng HttpHeaders. Vui lòng kiểm tra bên dưới câu trả lời. Sau khi sử dụng HttpHeaders, vấn đề của tôi đã được giải quyết.

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

values.join is not a function in the file http.es5.js Angular 4

Các vấn đề liên quan