PHP에는 func_num_args
및 func_get_args
이 있으며 JavaScript와 비슷한 것이 있습니까?
PHP에는 func_num_args
및 func_get_args
이 있으며 JavaScript와 비슷한 것이 있습니까?
답변:
인자 인 배열과 같은 객체 (아닌 실제 배열). 기능 예 ...
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>');
}
사용해보십시오 ...
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]
전체 세부 사항 : https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
ES6은 함수 인자가 다음과 같은 "..."표기법으로 지정된 구문을 허용합니다.
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
a = () => {console.log(arguments);}; a('foo');
제공 -- Uncaught ReferenceError: arguments is not defined
하지만 a = (...args) => {console.log(args);}; a('foo');
부여합니다["foo"]
arguments
함수의 인수가 저장되는 개체입니다.
arguments 객체는 배열처럼 작동하고 배열됩니다. 기본적으로 배열에는 수행하는 메서드가 없습니다. 예를 들면 다음과 같습니다.
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.indexOf(searchElement[, fromIndex])
arguments
객체를 실제 배열 로 변환하는 가장 좋은 방법 은 다음과 같습니다.
argumentsArray = [].slice.apply(arguments);
그러면 배열이됩니다.
재사용 가능 :
function ArgumentsToArray(args) {
return [].slice.apply(args);
}
(function() {
args = ArgumentsToArray(arguments);
args.forEach(function(value) {
console.log('value ===', value);
});
})('name', 1, {}, 'two', 3)
결과:
>
value === name
>value === 1
>value === Object {}
>value === two
>value === 3
[].slice.apply(arguments);
빈 배열 할당이 불필요하기 때문에 가장 좋은 방법은 아닙니다.
원하는 경우 배열로 변환 할 수도 있습니다. 배열 제네릭을 사용할 수있는 경우 :
var args = Array.slice(arguments)
그렇지 않으면:
var args = Array.prototype.slice.call(arguments);
에서 모질라 MDN :
JavaScript 엔진 (예 : V8)에서 최적화를 방해하므로 인수를 분리해서는 안됩니다.
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
화 대신 보존이 필요한 경우 내부 구조화 된 복제 알고리즘을 사용하십시오 . DOM 노드가 전달되면 관련이없는 질문 에서처럼 XMLSerializer를 사용하십시오 . with (new XMLSerializer()) {serializeToString(document.documentElement) }
다른 많은 사람들이 지적했듯이 arguments
함수에 전달 된 모든 인수를 포함합니다.
동일한 인수로 다른 함수를 호출하려면 apply
예:
var is_debug = true;
var debug = function() {
if (is_debug) {
console.log.apply(console, arguments);
}
}
debug("message", "another argument")
더 완벽한 예를 들어 Gunnar와 비슷한 대답 : 모든 것을 투명하게 반환 할 수도 있습니다.
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 });
산출:
foo
bar
true
42
["yes","no"]
{"banana":true}
ES6에서는 다음을 사용하십시오 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 코드가 아닌 경우 JSON.stringify 및 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]
스트링 화 대신 보존이 필요한 경우 내부 구조화 된 복제 알고리즘을 사용하십시오 .
DOM 노드가 전달되면 관련이없는 질문 에서처럼 XMLSerializer를 사용하십시오 .
with (new XMLSerializer()) {serializeToString(document.documentElement) }
북마크릿으로 실행중인 경우 JSON.stringify
제대로 작동하려면 오류 생성자에서 각 구조화 된 데이터 인수를 래핑해야 할 수 있습니다 .
참고 문헌
function
ES2015 + 지방 화살표=>
함수가 아닌 기존 JavaScript에서만 작동 합니다. 이를 위해...args
함수 정의에 다음과 같이 사용 하고 싶습니다(...args) => console.log(args)
.