Trong PHP có func_num_args
và func_get_args
, có một cái gì đó tương tự cho JavaScript?
Trong PHP có func_num_args
và func_get_args
, có một cái gì đó tương tự cho JavaScript?
Câu trả lời:
Sử dụng arguments
. Bạn có thể truy cập nó như một mảng. Sử dụng arguments.length
cho số lượng đối số.
Các đối số là một đối tượng giống như mảng (không phải là một mảng thực tế). Hàm ví dụ ...
function testArguments () // <-- notice no arguments specified
{
console.log(arguments); // outputs the arguments to the console
var htmlOutput = "";
for (var i=0; i < arguments.length; i++) {
htmlOutput += '<li>' + arguments[i] + '</li>';
}
document.write('<ul>' + htmlOutput + '</ul>');
}
Hãy dùng thử ...
testArguments("This", "is", "a", "test"); // outputs ["This","is","a","test"]
testArguments(1,2,3,4,5,6,7,8,9); // outputs [1,2,3,4,5,6,7,8,9]
Chi tiết đầy đủ: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Fiances_and_feft_scope/argument
ES6 cho phép một cấu trúc trong đó một đối số chức năng được chỉ định bằng ký hiệu "...", chẳng hạn như
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
a = () => {console.log(arguments);}; a('foo');
cho -- Uncaught ReferenceError: arguments is not defined
Tuy nhiên a = (...args) => {console.log(args);}; a('foo');
cho["foo"]
Đối arguments
tượng là nơi các đối số chức năng được lưu trữ.
Đối tượng đối tượng hoạt động và trông giống như một mảng, về cơ bản là, nó chỉ không có các phương thức mà mảng thực hiện, ví dụ:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.indexOf(searchElement[, fromIndex])
Tôi nghĩ rằng cách tốt nhất để chuyển đổi một arguments
đối tượng thành một mảng thực là như vậy:
argumentsArray = [].slice.apply(arguments);
Điều đó sẽ làm cho nó một mảng;
tái sử dụng:
function ArgumentsToArray(args) {
return [].slice.apply(args);
}
(function() {
args = ArgumentsToArray(arguments);
args.forEach(function(value) {
console.log('value ===', value);
});
})('name', 1, {}, 'two', 3)
kết quả:
>
value === name
>value === 1
>value === Object {}
>value === two
>value === 3
[].slice.apply(arguments);
Không thể là cách tốt nhất vì nó gây ra sự phân bổ mảng trống không cần thiết.
Bạn cũng có thể chuyển đổi nó thành một mảng nếu bạn thích. Nếu thuốc generic Array có sẵn:
var args = Array.slice(arguments)
Nếu không thì:
var args = Array.prototype.slice.call(arguments);
từ Mozilla MDN :
Bạn không nên cắt các đối số vì nó ngăn chặn tối ưu hóa trong các công cụ JavaScript (ví dụ V8).
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
Nếu cần bảo quản thay vì xâu chuỗi , hãy sử dụng thuật toán nhân bản có cấu trúc bên trong . Nếu các nút DOM được thông qua, hãy sử dụng XMLSerializer như trong một câu hỏi không liên quan . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Như nhiều người khác đã chỉ ra, arguments
chứa tất cả các đối số được truyền cho một hàm.
Nếu bạn muốn gọi một hàm khác có cùng đối số, hãy sử dụng apply
Thí dụ:
var is_debug = true;
var debug = function() {
if (is_debug) {
console.log.apply(console, arguments);
}
}
debug("message", "another argument")
Câu trả lời tương tự với Gunnar, với ví dụ đầy đủ hơn: Bạn thậm chí có thể trả lại toàn bộ nội dung:
function dumpArguments(...args) {
for (var i = 0; i < args.length; i++)
console.log(args[i]);
return args;
}
dumpArguments("foo", "bar", true, 42, ["yes", "no"], { 'banana': true });
Đầu ra:
foo
bar
true
42
["yes","no"]
{"banana":true}
Trong ES6, bạn có thể làm một cái gì đó như thế này:
function foo(...args)
{
let [a,b,...c] = args;
console.log(a,b,c);
}
foo(1, null,"x",true, undefined);
Trong ES6, sử dụng Array.from
:
function foo()
{
foo.bar = Array.from(arguments);
foo.baz = foo.bar.join();
}
foo(1,2,3,4,5,6,7);
foo.bar // Array [1, 2, 3, 4, 5, 6, 7]
foo.baz // "1,2,3,4,5,6,7"
Đối với mã không phải ES6, hãy sử dụng JSON.opesify và JSON.parse:
function foo()
{
foo.bar = JSON.stringify(arguments);
foo.baz = JSON.parse(foo.bar);
}
/* Atomic Data */
foo(1,2,3,4,5,6,7);
foo.bar // "{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7}"
foo.baz // [object Object]
/* Structured Data */
foo({1:2},[3,4],/5,6/,Date())
foo.bar //"{"0":{"1":2},"1":[3,4],"2":{},"3":"Tue Dec 17 2013 16:25:44 GMT-0800 (Pacific Standard Time)"}"
foo.baz // [object Object]
Nếu cần bảo quản thay vì xâu chuỗi , hãy sử dụng thuật toán nhân bản có cấu trúc bên trong .
Nếu các nút DOM được thông qua, hãy sử dụng XMLSerializer như trong một câu hỏi không liên quan .
with (new XMLSerializer()) {serializeToString(document.documentElement) }
Nếu chạy dưới dạng bookmarklet, bạn có thể cần phải bọc từng đối số dữ liệu có cấu trúc trong hàm tạo Lỗi JSON.stringify
để hoạt động chính xác.
Người giới thiệu
function
, không phải=>
chức năng mũi tên béo ES2015 + . Đối với những người đó, bạn sẽ muốn sử dụng...args
trong định nghĩa hàm như vậy :(...args) => console.log(args)
.