목차
1. 인수란 무엇입니까
2. 인수 연산
2.1 인수 길이
웹 프론트엔드 JS 튜토리얼 JavaScript 인수 객체에 대한 자세한 설명

JavaScript 인수 객체에 대한 자세한 설명

Mar 03, 2017 pm 03:13 PM
javascript

1. 인수란 무엇입니까

MDN은 다음과 같이 설명합니다.

인수는 배열과 유사한 객체입니다. 함수에 전달된 매개변수 목록을 나타냅니다.

먼저 예시를 통해 JavaScript의 인수가 어떤 모습인지 직관적으로 이해해 보겠습니다.

function printArgs() {
    console.log(arguments);
}
printArgs("A", "a", 0, { foo: "Hello, arguments" });
로그인 후 복사

실행 결과는 다음과 같습니다.

["A", "a", 0, Object]
로그인 후 복사

얼핏 결과는 배열이지만 실제 배열은 아니므로 인수는 배열과 유사한 객체입니다. 실제 배열과 배열 유사 객체 객체의 차이점은 끝까지 뒤집을 수 있습니다).

함수가 실행될 때 함수에 전달되는 모든 매개변수를 나타내는 인수로 표시되는 내용을 살펴보세요. 위의 예에서는 printArgs 함수에 전달된 4개의 매개변수를 나타냅니다. arguments[0], arguments[1]...을 사용하여 단일 매개변수를 얻을 수 있습니다.

2. 인수 연산

2.1 인수 길이

arguments는 length 속성을 ​​포함하는 배열과 유사한 객체입니다. 함수에 전달된 매개변수입니다. arguments.length

function func() {
    console.log("The number of parameters is " + arguments.length);
}

func();
func(1, 2);
func(1, 2, 3);
로그인 후 복사

실행 결과는 다음과 같습니다.

The number of parameters is 0
The number of parameters is 2
The number of parameters is 3
로그인 후 복사

2.2 인수를 배열로 변환

일반적으로 인수를 배열로 변환하려면 다음 방법을 사용합니다.

Array.prototype.slice.call(arguments);
로그인 후 복사

또 다른 짧은 작성 방법이 있습니다:

[].slice.call(arguments);
로그인 후 복사

여기서는 Array의 프로토타입 수준에서 호출하지 않고 빈 배열의 슬라이스 메서드를 간단히 호출합니다.

위 두 메소드를 왜 변환할 수 있나요?

우선, 슬라이스 메소드로 얻은 결과는 배열이고, 매개변수는 인수입니다. 실제로 특정 조건을 만족하는 객체는 슬라이스 메소드를 통해 배열로 변환될 수 있습니다. 예를 들면:

const obj = { 0: "A", 1: "B", length: 2 };
const result = [].slice.call(obj);
console.log(Array.isArray(result), result);
로그인 후 복사

실행 결과는 다음과 같습니다.

true ["A", "B"]
로그인 후 복사

위의 예에서 볼 수 있듯이 조건은 다음과 같습니다. 1) 속성은 0, 1, 2...; 2) 길이 속성을 가집니다.

추가로 한 가지 주의할 점은 함수의 인수가 유출되거나 전달될 수 없다는 것입니다. 그것은 무엇을 의미합니까? 다음 인수 누출 예를 살펴보세요.

// Leaking arguments example1:
function getArgs() {
    return arguments;
}

// Leaking arguments example2:
function getArgs() {
    const args = [].slice.call(arguments);
    return args;
}

// Leaking arguments example3:
function getArgs() {
    const args = arguments;
    return function() {
        return args;
    };
}
로그인 후 복사

위 접근 방식은 함수의 인수 개체를 직접 누출합니다. 최종 결과는 V8 엔진이 최적화를 건너뛰어 상당한 성능 손실을 초래한다는 것입니다.

이렇게 할 수 있습니다:

function getArgs() {
    const args = new Array(arguments.length);
    for(let i = 0; i < args.length; ++i) {
        args[i] = arguments[i];
    }
    return args;
}
로그인 후 복사

아주 궁금합니다. 인수를 사용할 때마다 첫 번째 단계는 일반적으로 인수를 잘못 사용하면 성능이 저하될 수 있습니다. loss., 그렇다면 인수를 배열 객체로 직접 디자인하는 것은 어떨까요?

이것은 이 언어의 처음부터 시작해야 합니다. Array 객체에 toString, Join, reverse 및 sort의 네 가지 메서드가 있었던 언어 초기에 인수가 도입되었습니다. 인수가 Object에서 상속되는 가장 큰 이유는 이 네 가지 메서드가 필요하지 않기 때문입니다. 이제 Array에는 forEach, map, filter 등과 같은 강력한 메서드가 많이 추가되었습니다. 그렇다면 새 버전에서는 인수가 Array에서 다시 상속되도록 하는 것이 어떨까요? 실제로 이는 ES5 초안에 포함됐지만 향후 호환성을 위해 위원회에서 최종적으로 거부됐다.

2.3 인수 값 수정

엄격 모드와 비엄격 모드에서는 함수 매개 변수 값을 수정한 결과가 다릅니다. 다음 두 가지 예를 살펴보십시오.

function foo(a) {
    "use strict";
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);
로그인 후 복사

출력:

1 1
10 1
10 20
로그인 후 복사

또 다른 비엄격 모드 예:

function foo(a) {
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);
로그인 후 복사

출력은 다음과 같습니다.

1 1
10 10
20 20
로그인 후 복사

From As 위의 두 예제에서 볼 수 있듯이 엄격 모드에서는 함수의 매개변수가 인수 객체와 관련이 없으며 한 값을 수정해도 다른 값은 변경되지 않습니다. 비엄격 모드에서는 둘이 서로 영향을 미칩니다.

2.4 한 함수에서 다른 함수로 매개변수 전달

다음은 한 함수에서 다른 함수로 매개변수를 전달할 때 권장되는 방법입니다.

function foo() {
    bar.apply(this, arguments);
}
function bar(a, b, c) {
    // logic
}
로그인 후 복사

2.5개 인수 및 오버로딩

오버로딩은 여러 언어에서 사용할 수 있지만 JavaScript에서는 사용할 수 없습니다. 먼저 예를 살펴보겠습니다.

function add(num1, num2) {
    console.log("Method one");
    return num1 + num2;
}

function add(num1, num2, num3) {
    console.log("Method two");
    return num1 + num2 + num3;
}

add(1, 2);
add(1, 2, 3);
로그인 후 복사

실행 결과는 다음과 같습니다.

Method two
Method two
로그인 후 복사

따라서 JavaScript에서는 함수가 서로 다른 매개변수를 기반으로 서로 다른 호출을 하지 않습니다.

자바스크립트에는 오버로딩이 없나요? 아니요, 인수를 사용하여 오버로드를 시뮬레이션할 수 있습니다. 여전히 위의 예입니다.

function add(num1, num2, num3) {
    if (arguments.length === 2) {
        console.log("Result is " + (num1 + num2));
    }
    else if (arguments.length === 3) {
        console.log("Result is " + (num1 + num2 + num3));
    }
}

add(1, 2);
add(1, 2, 3)
로그인 후 복사

의 실행 결과는 다음과 같습니다.

Result is 3
Result is 6
로그인 후 복사

3. ES6의 인수

3.1 확장 연산자

는 밤나무로 바로 이동합니다.

function func() {
    console.log(...arguments);
}

func(1, 2, 3);
로그인 후 복사

실행 결과는 다음과 같습니다.

1 2 3
로그인 후 복사

간단히 말하면 확장 연산자는 인수를 독립 매개변수로 확장할 수 있습니다.

3.2 Rest 매개변수

아직도 가장 좋은 예:

function func(firstArg, ...restArgs) {
    console.log(Array.isArray(restArgs));
    console.log(firstArg, restArgs);
}

func(1, 2, 3);
로그인 후 복사

실행 결과:

true
1 [2, 3]
로그인 후 복사

위 결과에서 볼 수 있듯이 나머지 매개변수는 나머지 매개변수 세트 지정을 지우는 것 외에 유형이 배열임을 나타냅니다.

3.3 기본 매개변수

Chestnut:

function func(firstArg = 0, secondArg = 1) {
    console.log(arguments[0], arguments[1]);
    console.log(firstArg, secondArg);
}

func(99);
로그인 후 복사

실행 결과는

99 undefined
99 1
로그인 후 복사

기본 매개변수는 인수에 아무런 영향을 미치지 않음을 알 수 있습니다. , 인수는 여전히 전달된 모든 매개변수를 호출하는 함수만 나타냅니다.

3.4 인수를 배열로 변환

은 배열과 유사한 모든 객체를 배열로 변환할 수 있는 매우 권장되는 방법입니다. Array.from()

4. 배열 및 배열 유사 객체

배열에는 인덱스라는 하나의 기본 기능이 있습니다. 이는 일반 물체에는 없는 것입니다.

const obj = { 0: "a", 1: "b" };
const arr = [ "a", "b" ];
로그인 후 복사

我们利用 obj[0]arr[0] 都能取得自己想要的数据,但取得数据的方式确实不同的。obj[0] 是利用对象的键值对存取数据,而arr[0] 却是利用数组的索引。事实上,Object 与 Array 的唯一区别就是 Object 的属性是 string,而 Array 的索引是 number。

下面看看类数组对象。

伪数组的特性就是长得像数组,包含一组数据以及拥有一个 length 属性,但是没有任何 Array 的方法。再具体的说,length 属性是个非负整数,上限是 JavaScript 中能精确表达的最大数字;另外,类数组对象的 length 值无法自动改变。

如何自己创建一个类数组对象?

function Foo() {}
Foo.prototype = Object.create(Array.prototype);

const foo = new Foo();
foo.push(&#39;A&#39;);
console.log(foo, foo.length);
console.log("foo is an array? " + Array.isArray(foo));
로그인 후 복사

执行结果是:

["A"] 1
foo is an array? false
로그인 후 복사

也就是说 Foo 的示例拥有 Array 的所有方法,但类型不是 Array。

如果不需要 Array 的所有方法,只需要部分怎么办呢?

function Bar() {}
Bar.prototype.push = Array.prototype.push;

const bar = new Bar();
bar.push(&#39;A&#39;);
bar.push(&#39;B&#39;);
console.log(bar);
로그인 후 복사

执行结果是:

Bar {0: "A", 1: "B", length: 2}
로그인 후 복사

 以上就是JavaScript arguments 对象详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

MySQL 쿼리 결과 배열을 객체로 변환하는 방법은 무엇입니까? MySQL 쿼리 결과 배열을 객체로 변환하는 방법은 무엇입니까? Apr 29, 2024 pm 01:09 PM

MySQL 쿼리 결과 배열을 객체로 변환하는 방법은 다음과 같습니다. 빈 객체 배열을 만듭니다. 결과 배열을 반복하고 각 행에 대해 새 개체를 만듭니다. foreach 루프를 사용하여 각 행의 키-값 쌍을 새 개체의 해당 속성에 할당합니다. 개체 배열에 새 개체를 추가합니다. 데이터베이스 연결을 닫습니다.

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

PHP에서 배열과 객체의 차이점은 무엇입니까? PHP에서 배열과 객체의 차이점은 무엇입니까? Apr 29, 2024 pm 02:39 PM

PHP에서 배열은 순서가 지정된 시퀀스이며 요소는 인덱스로 액세스됩니다. 객체는 new 키워드를 통해 생성된 속성과 메서드가 있는 엔터티입니다. 배열 액세스는 인덱스를 통해 이루어지며, 객체 액세스는 속성/메서드를 통해 이루어집니다. 배열 값이 전달되고 객체 참조가 전달됩니다.

PHP의 요청 객체란 무엇입니까? PHP의 요청 객체란 무엇입니까? Feb 27, 2024 pm 09:06 PM

PHP의 요청 객체는 클라이언트가 서버로 보낸 HTTP 요청을 처리하는 데 사용되는 객체입니다. Request 객체를 통해 요청 메소드, 요청 헤더 정보, 요청 매개변수 등과 같은 클라이언트의 요청 정보를 얻어 요청을 처리하고 응답할 수 있습니다. PHP에서는 $_REQUEST, $_GET, $_POST 등과 같은 전역 변수를 사용하여 요청된 정보를 얻을 수 있지만 이러한 변수는 객체가 아니라 배열입니다. 요청사항을 보다 유연하고 편리하게 처리하기 위해

JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 Jan 05, 2024 pm 01:37 PM

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

C++ 함수가 객체를 반환할 때 무엇에 주의해야 합니까? C++ 함수가 객체를 반환할 때 무엇에 주의해야 합니까? Apr 19, 2024 pm 12:15 PM

C++에서는 함수가 객체를 반환할 때 주의해야 할 세 가지 사항이 있습니다. 객체의 수명 주기는 메모리 누수를 방지하기 위해 호출자가 관리합니다. 매달린 포인터를 피하고 메모리를 동적으로 할당하거나 개체 자체를 반환하여 함수가 반환된 후에도 개체가 유효한지 확인하세요. 컴파일러는 성능을 향상시키기 위해 반환된 개체의 복사 생성을 최적화할 수 있지만 개체가 값 의미 체계에 따라 전달되는 경우 복사 생성이 필요하지 않습니다.

See all articles