PHP orada olup func_num_args
ve func_get_args
, JavaScript için benzer orada bir şeydir?
PHP orada olup func_num_args
ve func_get_args
, JavaScript için benzer orada bir şeydir?
Yanıtlar:
Kullanın arguments
. Bir dizi gibi erişebilirsiniz. arguments.length
Bağımsız değişken sayısı için kullanın .
Argümanlar olan bir dizi benzeri bir nesne (gerçek bir dizi). Örnek fonksiyon ...
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>');
}
Denemek...
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]
Tüm ayrıntılar: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
ES6, işlev bağımsız değişkeninin "..." gösterimi ile belirtildiği bir yapıya izin verir.
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
a = () => {console.log(arguments);}; a('foo');
verir -- Uncaught ReferenceError: arguments is not defined
Ancak a = (...args) => {console.log(args);}; a('foo');
verir["foo"]
arguments
Fonksiyonlar bağımsız değişkenler depolandığı bir amacıdır.
Arguments nesnesi bir dizi gibi davranır ve ona benzer, temel olarak, dizilerin yaptığı yöntemlere sahip değildir, örneğin:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.indexOf(searchElement[, fromIndex])
Bir arguments
nesneyi gerçek bir diziye dönüştürmenin en iyi yolunun şöyle olduğunu düşünüyorum :
argumentsArray = [].slice.apply(arguments);
Bu onu bir dizi yapar;
Yeniden kullanılabilir:
function ArgumentsToArray(args) {
return [].slice.apply(args);
}
(function() {
args = ArgumentsToArray(arguments);
args.forEach(function(value) {
console.log('value ===', value);
});
})('name', 1, {}, 'two', 3)
sonuç:
>
value === name
>value === 1
>value === Object {}
>value === two
>value === 3
[].slice.apply(arguments);
gereksiz bir boş dizi ayırmaya neden olduğu için en iyi yol olamaz.
İsterseniz diziye dönüştürebilirsiniz. Dizi jenerikleri varsa:
var args = Array.slice(arguments)
Aksi takdirde:
var args = Array.prototype.slice.call(arguments);
dan Mozilla MDN'yi :
JavaScript motorlarında (örneğin V8) optimizasyonları önlediğinden bağımsız değişkenleri dilimlememelisiniz.
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
yerine koruma gerekiyorsa, dahili yapılandırılmış klonlama algoritmasını kullanın . DOM düğümleri iletilirse, ilgisiz bir soruda olduğu gibi XMLSerializer'ı kullanın . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Diğer birçok kişinin belirttiği gibi, arguments
bir işleve iletilen tüm argümanları içerir.
Aynı bağımsız değişkenlere sahip başka bir işlevi çağırmak istiyorsanız, apply
Misal:
var is_debug = true;
var debug = function() {
if (is_debug) {
console.log.apply(console, arguments);
}
}
debug("message", "another argument")
Gunnar'a benzer bir cevap, daha eksiksiz bir örnekle: Her şeyi şeffaf bir şekilde bile iade edebilirsiniz:
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 });
Çıktı:
foo
bar
true
42
["yes","no"]
{"banana":true}
Evet, işlev bildirimi sırasında kaç bağımsız değişkenin mümkün olduğuna dair bir fikriniz yoksa, işlevi parametre olmadan bildirebilir ve işlev çağırma sırasında geçirilen argümanlar dizisiyle tüm değişkenlere erişebilirsiniz.
ES6'da böyle bir şey yapabilirsiniz:
function foo(...args)
{
let [a,b,...c] = args;
console.log(a,b,c);
}
foo(1, null,"x",true, undefined);
ES6'da şunları kullanın 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"
ES6 olmayan kodlar için JSON.stringify ve JSON.parse komutlarını kullanın:
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]
Dizgi oluşturma yerine koruma gerekiyorsa, dahili yapılandırılmış klonlama algoritmasını kullanın .
DOM düğümleri iletilirse, ilgisiz bir soruda olduğu gibi XMLSerializer'ı kullanın .
with (new XMLSerializer()) {serializeToString(document.documentElement) }
Bir yer işareti JSON.stringify
olarak çalışıyorsa, düzgün çalışması için her yapılandırılmış veri bağımsız değişkenini bir Hata yapıcısına sarmanız gerekebilir .
Referanslar
function
, ES2015 + yağ ok=>
işlevleri için geçerli değildir. Olanlar için, seni kullanmak istiyorum edeceğiz...args
şöyle fonksiyon tanımında:(...args) => console.log(args)
.