Di PHP ada func_num_args
dan func_get_args
, adakah yang serupa dengan JavaScript?
Di PHP ada func_num_args
dan func_get_args
, adakah yang serupa dengan JavaScript?
Jawaban:
Gunakan arguments
. Anda dapat mengaksesnya seperti sebuah array. Gunakan arguments.length
untuk jumlah argumen.
The argumen adalah sebuah objek array-seperti (bukan array yang sebenarnya). Fungsi contoh ...
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>');
}
Cobalah ...
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]
Detail lengkap: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
ES6 memungkinkan konstruk di mana argumen fungsi ditentukan dengan notasi "..." seperti
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
a = () => {console.log(arguments);}; a('foo');
memberikan -- Uncaught ReferenceError: arguments is not defined
Namun a = (...args) => {console.log(args);}; a('foo');
memberi["foo"]
The arguments
objek adalah di mana argumen fungsi disimpan.
Objek argumen bertindak dan terlihat seperti array, pada dasarnya adalah, hanya saja tidak memiliki metode yang dilakukan array, misalnya:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.indexOf(searchElement[, fromIndex])
Saya pikir cara terbaik untuk mengubah arguments
objek menjadi Array nyata adalah seperti ini:
argumentsArray = [].slice.apply(arguments);
Itu akan membuatnya menjadi array;
dapat digunakan kembali:
function ArgumentsToArray(args) {
return [].slice.apply(args);
}
(function() {
args = ArgumentsToArray(arguments);
args.forEach(function(value) {
console.log('value ===', value);
});
})('name', 1, {}, 'two', 3)
hasil:
>
value === name
>value === 1
>value === Object {}
>value === two
>value === 3
[].slice.apply(arguments);
tidak bisa menjadi cara terbaik karena menyebabkan alokasi array kosong yang tidak perlu.
Anda juga dapat mengonversinya menjadi sebuah array jika Anda mau. Jika Array generics tersedia:
var args = Array.slice(arguments)
Jika tidak:
var args = Array.prototype.slice.call(arguments);
dari Mozilla MDN :
Anda tidak boleh mengiris argumen karena itu mencegah optimisasi dalam mesin JavaScript (V8 misalnya).
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
Jika pelestarian diperlukan alih-alih pengencangan, gunakan algoritma kloning terstruktur internal . Jika node DOM dilewatkan, gunakan XMLSerializer seperti dalam pertanyaan yang tidak terkait . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Seperti yang banyak ditunjukkan, arguments
berisi semua argumen yang diteruskan ke fungsi.
Jika Anda ingin memanggil fungsi lain dengan argumen yang sama, gunakan apply
Contoh:
var is_debug = true;
var debug = function() {
if (is_debug) {
console.log.apply(console, arguments);
}
}
debug("message", "another argument")
Jawaban yang mirip dengan Gunnar, dengan contoh yang lebih lengkap: Anda bahkan dapat mengembalikan semuanya secara transparan:
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 });
Keluaran:
foo
bar
true
42
["yes","no"]
{"banana":true}
Ya jika Anda tidak tahu bahwa berapa banyak argumen yang mungkin pada saat deklarasi fungsi maka Anda dapat mendeklarasikan fungsi tersebut tanpa parameter dan dapat mengakses semua variabel dengan array argumen yang diteruskan pada saat pemanggilan fungsi.
Di ES6 Anda dapat melakukan sesuatu seperti ini:
function foo(...args)
{
let [a,b,...c] = args;
console.log(a,b,c);
}
foo(1, null,"x",true, undefined);
Dalam ES6, gunakan 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"
Untuk kode non-ES6, gunakan JSON.stringify dan 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]
Jika pelestarian diperlukan alih-alih pengencangan, gunakan algoritma kloning terstruktur internal .
Jika node DOM dilewatkan, gunakan XMLSerializer seperti dalam pertanyaan yang tidak terkait .
with (new XMLSerializer()) {serializeToString(document.documentElement) }
Jika berjalan sebagai bookmarklet, Anda mungkin perlu membungkus masing-masing argumen data terstruktur dalam konstruktor Kesalahan JSON.stringify
agar berfungsi dengan benar.
Referensi
function
, bukan=>
fungsi panah gemuk ES2015 + . Bagi mereka, Anda akan ingin menggunakan...args
dalam definisi fungsi seperti:(...args) => console.log(args)
.