JavaScript 함수의 기본 매개 변수 값 설정


2366

JavaScript 함수에 기본값을 설정하는 선택적 인수를 사용하여 값이 정의되지 않은 경우 사용되며 값이 전달되면 무시됩니다. 루비에서는 다음과 같이 할 수 있습니다 :

def read_file(file, delete_after = false)
  # code
end

이것은 JavaScript에서 작동합니까?

function read_file(file, delete_after = false) {
  // Code
}

답변:


3296

ES6 / ES2015 부터 기본 매개 변수는 언어 사양에 있습니다.

function read_file(file, delete_after = false) {
  // Code
}

그냥 작동합니다.

참조 : 기본 매개 변수-MDN

기본 함수 매개 변수를 사용하면 값이 없거나 정의되지 않은 경우 공식 매개 변수를 기본값으로 초기화 할 수 있습니다 .

디스트 럭처링을 통해 기본 명명 된 매개 변수를 시뮬레이션 할 수도 있습니다 .

// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
    // Use the variables `start`, `end` and `step` here
    ···
}

사전 ES2015 ,

여러 가지 방법이 있지만 이것이 내가 선호하는 방법입니다. false 또는 null을 포함하여 원하는 것을 전달할 수 있습니다. ( typeof null == "object")

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}

216
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }다음과 같이 캡슐화 할 수도 있습니다.a = defaultFor(a, 42);
Camilo Martin

6
@SiPlus하고 사용하는 동안 당신은 무료로에 대한 추가 참조 오류를 가지고 undefined객체를 : P는 그것은 일부 브라우저에서 작동 할 수 있고 빠를 수도 동안에도 null여전히 객체이고 undefined있다는 것을 말하려고 프리미티브 유형을 참조입니다 여기에는 아무것도 없습니다 null. 간단히 말해서 JavaScript / Reference / Global_Objects / undefined의 두 경우를 모두 참조하십시오 .
Sampo Sarrala-codidact.org 1

9
객체의 속성을 검사하면 typeof중복됩니다. function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }이것은 참조 오류를 발생시키지 않으며 간결합니다.
Dziamid

10
나는 그것이 아주 작다는 것을 알고 있지만, 당신이 어떻게 할당 a = a하고 있는지 그리고 b = b그 매개 변수가 정의되지 않은 때를 좋아하지 않습니다. 또한 조금 복잡한 조건을 가진 삼항 연산자는 향후 관리자에게 읽기 어려울 수 있습니다. 나는 다음과 같은 구문을 선호합니다 : if (typeof a == 'undefined') a = 42-불필요한 할당이없고 조금 더 읽기 쉽습니다.
Daddy32

12
사용해야 할 이유가 typeof있습니까? 그냥하는 것이 더 간단 해 보일 것 a === undefined입니다. 또한 철자가 틀린 경우 undefined와 문자열에 넣는 경우 참조 오류가 발생 합니다.
Abe Voelker

599
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

이것은 false 값 이 아닌 경우 delete_after값에 할당하고 그렇지 않으면 문자열을 할당합니다 . 자세한 내용은 Doug Crockford의 언어 설문 조사를 확인하고 운영자 섹션을 확인하십시오 .delete_after"my default here"

당신이 전달하려는 경우이 방법은 작동하지 않습니다 falsey의 예 값 false, null, undefined, 0또는 "". 당신이 필요한 경우 falsey 당신에 전달 될 값의 방법을 사용해야합니다 톰 리터의 답변을 .

함수에 대한 많은 매개 변수를 처리 할 때 소비자가 개체의 매개 변수 인수를 전달한 다음 이 값을 함수의 기본값이 포함 된 개체와 병합 하는 것이 유용한 경우가 종종 있습니다.

function read_file(values) {
    values = merge({ 
        delete_after : "my default here"
    }, values || {});

    // rest of code
}

// simple implementation based on $.extend() from jQuery
function merge() {
    var obj, name, copy,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length;

    for (; i < length; i++) {
        if ((obj = arguments[i]) != null) {
            for (name in obj) {
                copy = obj[name];

                if (target === copy) {
                    continue;
                }
                else if (copy !== undefined) {
                    target[name] = copy;
                }
            }
        }
    }

    return target;
};

쓰다

// will use the default delete_after value
read_file({ file: "my file" }); 

// will override default delete_after value
read_file({ file: "my file", delete_after: "my value" }); 

115
나는 거짓으로 전달하고 싶을 수도 있기 때문에 이것이 불충분하다는 것을 알았습니다.
Tom Ritter

52
나는 대부분의 상황에 적합하다고 생각합니다
Russ Cam

50
잘못된 값에는 작동하지 않으므로 유지 관리의 악몽이 발생할 수 있습니다. 보다 확실한 접근 방법을 사용할 수있는 경우 잘못된 코드가 전달되기 때문에 항상 진실한 값으로 전달되고 갑자기 실패한 비트 코드는 피해야합니다.
jinglesthula

1
이 경우에 어떻게 delete_after표현의 부울 결과를 얻지 못 delete_after || "my default value"합니까?
xbonez

3
또는 일반적으로 어쨌든 좋은 기본값 인 잘못된 값으로 기본값을 설정할 수 있습니다 (예 : 부울의 경우 false, 문자열의 경우 빈 문자열, 숫자의 경우 0 등).이 경우 실제로 무엇이 중요하지 않은지 전달.
마크 Brackett

150

개인적으로 훨씬 간결하고 읽을 수있는 간단한 것이 있습니다.

function pick(arg, def) {
   return (typeof arg == 'undefined' ? def : arg);
}

function myFunc(x) {
  x = pick(x, 'my default');
} 

6
업데이트 : underscore.js를 이미 사용하고 있다면 사용 하는 것이 더 좋습니다 _.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});. 이 답변에 표시된 글로벌 네임 스페이스를 사용하는 것은 많은 사람들이 나쁜 습관으로 간주합니다. util.default(arg, "defaul value")밑줄을 사용하지 않으려 는 경우이 일반적인 작업 (예 :)에 대한 자체 유틸리티를 롤링하는 것을 고려할 수 있지만, 대부분 휠을 재발 명 할 시점이 아닌 조만간 밑줄을 사용하게됩니다.
andersand

2
나는 이것을 실제로 추천한다. 나는 그것을 사용하고 그것을“por”이라고 부른다.“parameter or”
super

2
typeof arg == 'undefined'라고 말하지 말고 arg === undefined라고 말하십시오.
OsamaBinLogin

3
@OsamaBinLogin 현재 JS에 대해 올바른 말-일부 브라우저 undefined에서는 다른 값 으로 덮어 쓸 수 있었기 때문에 오래된 테스트가 지속 되어 테스트가 실패합니다.
Alnitak

2
@Alnitak : 여전히 재정의가 가능합니다 undefined. 그래서, 그것은 여전히 좋은를 사용하는 아이디어 typeof'undefined'.
LS

63

ECMAScript 6에서는 실제로 가지고있는 것을 정확하게 작성할 수 있습니다.

function read_file(file, delete_after = false) {
  // Code
}

존재하지 않는 경우 또는로 설정 delete_after됩니다 . 오늘날 이와 같은 ES6 기능을 Babel 과 같은 변환기로 사용할 수 있습니다 .falseundefined

자세한 내용은 MDN 기사를 참조하십시오 .


1
ECMAScript를 내가 가정 (6)는 (나 자신으로 해결 한 것이다 그러나 나는 편집 <6 개 문자 수 없습니다)
자크

1
브라우저를 기다리는 것은 어떤 얻을 ECMAScript를 6
아드리아누 센드

1
바벨은 이것을 무엇으로 번역 할 것입니까?
harryg


2
ES6 kangax.github.io/compat-table/es6/#default_function_parameters 의 호환성 표는 다음과 같습니다. 불행히도이 구문 은 아직 지원되지 않습니다 .
freemanoid

27

기본 매개 변수 값

ES6 JavaScript을 사용하면 함수 매개 변수의 기본값 설정 과 관련 하여 가장 일반적인 관용구 중 하나를 수행 할 수 있습니다 . 몇 년 동안이 작업을 수행 한 방식은 매우 친숙하게 보일 것입니다.

function foo(x,y) {
 x = x || 11;
 y = y || 31;
 console.log( x + y );
}
foo(); // 42
foo( 5, 6 ); // 11
foo( 5 ); // 36
foo( null, 6 ); // 17

이 패턴이 가장 많이 사용되지만 다음과 같은 값을 전달하면 위험합니다

foo(0, 42)
foo( 0, 42 ); // 53 <-- Oops, not 42

왜? 때문에 0 is falsy, 그리고, 그래서 x || 11 results in 11, 직접이 잡았다 문제를 해결하려면 0에서 통과하지, 어떤 사람들은 대신 더 자세하게이 같은 수표를 작성합니다 :

function foo(x,y) {
 x = (x !== undefined) ? x : 11;
 y = (y !== undefined) ? y : 31;
 console.log( x + y );
}
foo( 0, 42 ); // 42
foo( undefined, 6 ); // 17

ES6누락 된 인수에 대한 기본값 할당을 간소화하기 위해 유용한 유용한 구문을 살펴볼 수 있습니다 .

function foo(x = 11, y = 31) {
 console.log( x + y );
}

foo(); // 42
foo( 5, 6 ); // 11
foo( 0, 42 ); // 42
foo( 5 ); // 36
foo( 5, undefined ); // 36 <-- `undefined` is missing
foo( 5, null ); // 5 <-- null coerces to `0`
foo( undefined, 6 ); // 17 <-- `undefined` is missing
foo( null, 6 ); // 6 <-- null coerces to `0`

x = 11함수 선언 x !== undefined ? x : 11에서 훨씬 더 일반적인 관용구보다 더x || 11

기본값 표현식

Function기본값은 31과 같은 단순한 값 이상일 수 있습니다. 유효한 표현 일 수 있습니다 function call.

function bar(val) {
 console.log( "bar called!" );
 return y + val;
}
function foo(x = y + 3, z = bar( x )) {
 console.log( x, z );
}
var y = 5;
foo(); // "bar called"
 // 8 13
foo( 10 ); // "bar called"
 // 10 15
y = 6;
foo( undefined, 10 ); // 9 10

보시다시피, 기본값 표현식은 느리게 평가됩니다. 즉, 필요한 경우 및 필요할 때, 즉 매개 변수의 인수가 생략되거나 정의되지 않은 경우에만 실행됩니다.

기본값 표현식은 인라인 함수 표현식 호출 일 수도 있습니다 (일반적으로 즉시 호출 된 함수 표현식이라고 함) (IIFE).

function foo( x =
 (function(v){ return v + 11; })( 31 )
) {
 console.log( x );
}
foo(); // 42

13

그 솔루션은 js에서 저에게 효과적입니다.

function read_file(file, delete_after) {
    delete_after = delete_after || false;
    // Code
}

4
하면 어떻게됩니까 delete_after입니다 0null? 이러한 경우에는 올바르게 작동하지 않습니다.
Dmitri Pavlutin

@StephanBijzitter 경우에 따라서 만 해당됩니다. 그러나 0 또는 null! === false이기 때문에 기본값 만 값을 설정 해제하려면 작동하지 않습니다.
Rutrus

@Rutrus : 방금 말한 것을 이해하지 못합니다.
Stephan Bijzitter

무엇에 대해 delete_after = delete_after === undefined ? false : delete_after?
aashah7

10

undefined와 명시 적 비교를 사용하십시오.

function read_file(file, delete_after)
{
    if(delete_after === undefined) { delete_after = false; }
}

10

자바 스크립트에서 기본 매개 변수 값을 사용할 때 매우주의해야합니다. 종종 같은 고차 함수와 함께 사용하면 버그를 생성 forEach, mapreduce. 예를 들어 다음 코드 줄을 고려하십시오.

['1', '2', '3'].map(parseInt); // [1, NaN, NaN]

parseInt에는 선택적 두 번째 매개 변수 function parseInt(s, [기수가=10]) 있지만 parseInt세 개의 인수 ( element , indexarray )로 맵 호출 이 있습니다.

선택적 / 기본 값 인수에서 필수 매개 변수를 분리하는 것이 좋습니다. 함수가 기본값이 의미가없는 1, 2 또는 3 개의 필수 매개 변수를 사용하는 경우 위치 매개 변수를 함수에 지정하면 선택적 매개 변수는 단일 오브젝트의 이름 지정된 속성을 따라야합니다. 함수에 4 이상이 필요한 경우 단일 객체 매개 변수의 속성을 통해 모든 인수를 제공하는 것이 더 합리적입니다.

귀하의 경우에는 다음과 같이 deleteFile 함수를 작성하는 것이 좋습니다 (( 의 댓글 마다 편집 됨 ) ...instead

// unsafe
function read_file(fileName, deleteAfter=false) {
    if (deleteAfter) {
        console.log(`Reading and then deleting ${fileName}`);
    } else {
        console.log(`Just reading ${fileName}`);
    }
}

// better
function readFile(fileName, options) {
  const deleteAfter = !!(options && options.deleteAfter === true);
  read_file(fileName, deleteAfter);
}

console.log('unsafe...');
['log1.txt', 'log2.txt', 'log3.txt'].map(read_file);

console.log('better...');
['log1.txt', 'log2.txt', 'log3.txt'].map(readFile);

위의 스 니펫을 실행하면 사용되지 않은 매개 변수의 기본 인수 값 뒤에 숨어있는 위험을 보여줍니다.


1
이 "더 나은 솔루션"은 읽을 수 없습니다. 오히려 변수 유형을 확인 typeof deleteAfter === 'bool'하고 그렇지 않으면 예외를 throw 하는 것이 좋습니다 . 또한 map / foreach 등과 같은 메소드를 사용하는 경우주의해서 사용하고 익명 함수로 함수를 랩하십시오. ['1', '2', '3'].map((value) => {read_file(value);})
대신

그건 좋은 지적이야. 내 코드 스 니펫에서 라이브러리를 사용하지 않으려 고했지만이 관용구는 순수한 자바 스크립트에서 상당히 지저분합니다. 개인적으로 lodash의 get메소드를 사용하여 deleteAfter 를 검색합니다. typeof 'deleteAfter' !== 'bool'신중한 조치가 될 수 있다면 예외를 던지기 . 나는 호출자가 "주의"를 요구하는 방법을 설계하는 것을 좋아하지 않는다. 주의는 호출자가 아닌 기능의 책임입니다. 최종 행동은 최소한의 놀라움의 원칙을 따라야합니다.
Doug Coburn

나는 그 방법을 써서는 안된다는 것에 동의한다. 그러나 함수는 모델과 같으며 호출자는 컨트롤러와 같습니다. 모델은 데이터 처리를 처리해야합니다. 함수 (메소드)는 데이터가 잘못된 방식으로 전달되어 처리 될 수 있어야합니다. 그렇기 때문에 매개 변수 유형을 확인하고 예외를 던지는 것이 가장 좋은 방법입니다. 더 복잡하지만. 그러나 여전히 머리를 긁지 않고 계속 물어볼 수 있습니다 ... 왜 작동하지 않습니까?! 그리고 왜 ... 작동 하는가?!
대신

9

갱신으로 ... ECMAScript를 6으로 수행 할 수 있습니다 드디어 함수 매개 변수 선언에서 설정된 기본 값은 너무 좋아한다 :

function f (x, y = 7, z = 42) {
  return x + y + z
}

f(1) === 50

참조 : http://es6-features.org/#DefaultParameterValues


11
이 답변은 중복이므로 유용하지 않습니다
사용자

8

오랜 시간 동안 C ++ 개발자 (Rookie to web development :)),이 상황을 처음 접했을 때 나는 다음과 같이 질문에서 언급 한 것처럼 함수 정의에서 매개 변수 할당을 수행했습니다.

function myfunc(a,b=10)

그러나 브라우저에서 일관되게 작동하지 않습니다. 나를 위해 그것은 내 바탕 화면의 크롬에서 작동했지만 안드로이드의 크롬에서는 작동하지 않았습니다. 위에서 언급했듯이 더 안전한 옵션은-

    function myfunc(a,b)
    {
    if (typeof(b)==='undefined') b = 10;
......
    }

이 답변의 목적은 다른 사람들이 이미 언급 한 것과 동일한 솔루션을 반복하는 것이 아니라 함수 정의의 매개 변수 할당이 일부 브라우저에서 작동 할 수 있음을 알리는 것이지만 의존하지는 않습니다.


3
함수 정의 내의 할당은 Windows 8.1 용 IE의 최신 버전 인 IE 11에서도 작동하지 않습니다.
DiMono

1
function myfunc(a,b=10)ES6 구문이 궁금 하다면 다른 답변에 호환성 테이블에 대한 링크가 있습니다.
gcampbell

7

Microsoft Edge에서 코드 작업에 관심이있는 사람은 함수 매개 변수에 기본값을 사용하지 마십시오.

function read_file(file, delete_after = false) {
    #code
}

이 예에서 Edge는 "예상 ')'"오류를 발생시킵니다.

이 사용을 피하려면

function read_file(file, delete_after) {
  if(delete_after == undefined)
  {
    delete_after = false;
  }
  #code
}

2016 년 8 월 8 일 현재 이것은 여전히 ​​문제입니다


4

구문에 따라

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

공식 매개 변수의 기본값을 정의 할 수 있습니다. typeof 함수 를 사용하여 정의되지 않은 값을 확인하십시오 .


4
function helloWorld(name, symbol = '!!!') {
    name = name || 'worlds';
    console.log('hello ' + name + symbol);
}

helloWorld(); // hello worlds!!!

helloWorld('john'); // hello john!!!

helloWorld('john', '(>.<)'); // hello john(>.<)

helloWorld('john', undefined); // hello john!!!

helloWorld(undefined, undefined); // hello worlds!!!

4

최신 ECMA6구문 을 사용하려면 다음을 사용하십시오 .

function myFunction(someValue = "This is DEFAULT!") {
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

이라고 default function parameters합니다. 값이 없거나 정의되지 않은 경우 공식 매개 변수를 기본값으로 초기화 할 수 있습니다. 참고 : Internet Explorer 또는 이전 버전의 브라우저에서는 작동하지 않습니다.

가능한 최대 호환성을 위해 다음을 사용하십시오.

function myFunction(someValue) {
  someValue = (someValue === undefined) ? "This is DEFAULT!" : someValue;
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

두 함수 모두이 예제 각각과 동일한 동작을하며, undefined해당 함수를 호출 할 때 매개 변수 값이 전달되지 않으면 매개 변수 변수가 사용된다는 사실에 의존 합니다.


참고 : @BlackBeard가 말했듯이 function (param = value) WONT는 IE와 함께 작동합니다. 호환되는 버전을 사용하십시오.
MagicLAMP

4

ES6 : 대부분의 답변에서 이미 언급했듯이 ES6에서는 매개 변수를 값과 함께 초기화 할 수 있습니다.


ES5 : 주어진 답변의 대부분은 내가 같은 falsey 값을 전달 할 수 있습니다 경우가 있기 때문에 저를 위해 좋지 충분히 0, null그리고 undefined기능에. 전혀 정의되지 않았기 때문에 undefined 대신 전달한 값이므로 매개 변수가 정의되어 있지 않은지 확인하려면 다음과 같이하십시오.

function foo (param1, param2) {
   param1 = arguments.length >= 1 ? param1 : "default1";
   param2 = arguments.length >= 2 ? param2 : "default2";
}

3

function throwIfNoValue() {
throw new Error('Missing argument');
}
function foo(argValue = throwIfNoValue()) {
return argValue ;
}

여기에서 foo ()는 argValue라는 매개 변수를 가진 함수입니다. 함수 호출에 아무것도 전달하지 않으면 throwIfNoValue () 함수가 호출되고 반환 된 결과는 유일한 인수 argValue에 지정됩니다. 이것이 함수 호출을 기본 매개 변수로 사용하는 방법입니다. 코드를 더 간단하고 읽기 쉽게 만듭니다.

이 예제는 여기에서 가져 왔습니다


3

사용중인 경우 ES6+다음 방식으로 기본 매개 변수를 설정할 수 있습니다.

function test (foo = 1, bar = 2) {
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

ES5구문 이 필요한 경우 다음과 같은 방식으로 구문을 수행 할 수 있습니다.

function test(foo, bar) {
  foo = foo || 2;
  bar = bar || 0;
  
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

위 구문에서 OR연산자가 사용됩니다. OR이가로 변환 될 수 있으면 운전자는 항상 첫 번째 값을 반환 true는 righthandside 값을 반환하지 않을 경우. 함수가 해당 인수없이 호출되면 매개 변수 변수 ( bar이 예에서는)가 undefinedJS 엔진 에 의해 설정됩니다 . undefined그런 다음 false로 변환되므로 OR연산자는 값 0을 리턴합니다.


3

예, 기본 매개 변수 사용은 ES6 에서 완전히 지원됩니다 .

function read_file(file, delete_after = false) {
  // Code
}

또는

const read_file = (file, delete_after = false) => {
    // Code
}

그러나 ES5 이전에는 다음과 같이 쉽게 할 수 있습니다.

function read_file(file, delete_after) {
  var df = delete_after || false;
  // Code
}

즉, 값이 있으면 값을 사용하고 그렇지 않으면 ||동일한 작업을 수행하는 작업 후 두 번째 값을 사용하십시오 .

참고 : ES6에 값을 전달 하면 값이 잘못되어도 값이 틀리 null거나 새로운 값으로 대체 되거나 ""...와 같지만 ES5 는 전달 된 값만 대체됩니다. 진실합니다. 왜냐하면 그것이 ||작동 하는 방식 때문입니다 .


2

어떤 이유로 ES6 사용 하지 않고 여기에서 사용중인 경우 메소드 를 통해 기본 기능 매개 변수를 간결하게 사용할 수 있습니다 .lodash_.defaultTo

var fn = function(a, b) {
  a = _.defaultTo(a, 'Hi')
  b = _.defaultTo(b, 'Mom!')

  console.log(a, b)
}

fn()                 // Hi Mom!
fn(undefined, null)  // Hi Mom!
fn(NaN, NaN)         // Hi Mom!
fn(1)                // 1 "Mom!"
fn(null, 2)          // Hi 2
fn(false, false)     // false false
fn(0, 2)             // 0 2
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

현재 값이 NaN , null 또는 undefined 인 경우 기본값을 설정합니다.


1

미래의 소리

앞으로는 한 객체를 다른 객체로 "확산"할 수있을 것입니다 (현재 2019 년 현재 Edge에서 지원하지 않습니다 !)-순서에 관계없이 멋진 기본 옵션으로 사용하는 방법을 보여줍니다.

function test(options) {
    var options = {
       // defaults
       url: 'defaultURL',
       some: 'somethingDefault',
       // override with input options
       ...options
    };
    
    var body = document.getElementsByTagName('body')[0];
    body.innerHTML += '<br>' + options.url + ' : ' + options.some;
}
test();
test({});
test({url:'myURL'});
test({some:'somethingOfMine'});
test({url:'overrideURL', some:'andSomething'});
test({url:'overrideURL', some:'andSomething', extra:'noProblem'});

MDN 참조 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

... Edge DOES가 지원하는 것은 Object.assign ()입니다 (IE는 그렇지 않지만 IE를 뒤에 남겨 둘 수 있기를 바랍니다 :))

마찬가지로 당신은 할 수 있습니다

    function test(options) {
        var options = Object.assign({
           // defaults
           url: 'defaultURL',
           some: 'somethingDefault',
        }, options); // override with input options
        
        var body = document.getElementsByTagName('body')[0];
        body.innerHTML += '<br>' + options.url + ' : ' + options.some;
    }
    test();
    test({});
    test({url:'myURL'});
    test({some:'somethingOfMine'});
    test({url:'overrideURL', some:'andSomething'});
    test({url:'overrideURL', some:'andSomething', extra:'noProblem'});

편집 : 인해에 대한 의견을 const옵션 - 함수의 나머지 일정 옵션을 사용에 문제가 실제로 없는 당신이 할 수 없어, 당신은 자신의 선언에서 상수 변수를 사용할 수 없습니다 단지이다 - 당신은 할 것 입력 이름을 다음과 같이 조정하십시오.

function test(input_options){
   const options = {
     // defaults
     someKey:    'someDefaultValue',
     anotherKey: 'anotherDefaultValue',

     // merge-in input options
     ...input_options
   };

   // from now on use options with no problem
}

문제는 이미 정의 된 옵션을 다시 할당하지만 합법적 인 다른 var와 함께 사용할 수 있으므로 일반적으로 그렇게하고 싶지 않다는 것입니다.
frank-dspeed

function test (options) {/ * 옵션이 정의되어 있는데 const 옵션 = {} now * /}를 사용하면 오류가 발생합니다.
frank-dspeed

함수를 만들 때 인수 이름 옵션으로 전달할 때 전역이 아니고 함수 옵션 내부에 함수 (opt) 내부에 정의됩니다. {} opt가 정의되어 있으면 해당 함수 내부에서 const opt를 사용할 수 없습니다. 당신이 자주 그렇게하고 일반적인 패턴처럼 보이는 경우 변수 재 할당 이것은 문제입니다
frank-dspeed

@ google-frank-dspeed 아, 당신은 할 수 없다는 것을 의미합니까 function(opt){ const opt = /*some merging*/; }? 변수 가 선언되기 전에 변수 사용하기 때문에 확실히 작동하지 않습니다.const – 조정해야합니다. –function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
jave.web

@ google-frank-dspeed 어쨌든 더 많은 새로운 사람들이 이것에 대해 궁금해 할 것이므로 편집하는 방법 코드를 추가했습니다 :) 그래서 다른 사람들을 지적 해 주셔서 감사합니다 :)
jave.web

1

내 기술을 보여주기 위해 (lol) 위의 함수는 아래와 같이 명명 된 인수가 없어도 작성할 수 있습니다.

ES5 이상

function foo() {
    a = typeof arguments[0] !== 'undefined' ? a : 42;
    b = typeof arguments[1] !== 'undefined' ? b : 'default_b';
    ...
}

ES6 이상

function foo(...rest) {
    a = typeof rest[0] !== 'undefined' ? a : 42;
    b = typeof rest[1] !== 'undefined' ? b : 'default_b';
    ...
}

0
def read_file(file, delete_after = false)
  # code
end

ECMAScript 6 (ES6) 및 이전 버전을 포함하여이 상황에서 다음 코드가 작동 할 수 있습니다.

function read_file(file, delete_after) {
    if(delete_after == undefined)
        delete_after = false;//default value

    console.log('delete_after =',delete_after);
}
read_file('text1.txt',true);
read_file('text2.txt');

언어의 기본값은 호출 할 때 함수의 매개 변수 값을 건너 뛰면 작동하며 JavaScript에서는 undefined에 할당됩니다 . 이 방법은 프로그래밍 방식으로는 매력적으로 보이지 않지만 이전 버전과의 호환성이 있습니다.


0

예, 이것을 기본 매개 변수라고합니다

기본 함수 매개 변수를 사용하면 값이 없거나 정의되지 않은 경우 공식 매개 변수를 기본값으로 초기화 할 수 있습니다.

통사론:

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

기술:

함수의 매개 변수는 기본적으로 정의되지 않음이지만 상황에 따라 다른 기본값을 설정하는 것이 유용 할 수 있습니다. 기본 매개 변수가 도움이 될 수 있습니다.

과거에는 기본값을 설정하는 일반적인 전략이 함수 본문에서 매개 변수 값을 테스트하고 정의되지 않은 경우 값을 할당하는 것이 었습니다. 호출에 값이 제공되지 않으면 값이 정의되지 않습니다. 매개 변수가 정의되지 않았는지 확인하기 위해 조건부 검사를 설정해야합니다.

ES2015의 기본 매개 변수를 사용하면 기능 본문을 더 이상 검사 할 필요가 없습니다. 이제 단순히 함수 헤드에 기본값을 넣을 수 있습니다.

차이점의 예 :

// OLD METHOD
function multiply(a, b) {
  b = (typeof b !== 'undefined') ?  b : 1;
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5


// NEW METHOD
function multiply(a, b = 1) {
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5

다른 구문 예 :

패딩 정의되지 않은 대 다른 잘못된 값 :

호출 할 때 값이 명시 적으로 설정 되더라도 num 인수의 값이 기본값입니다.

function test(num = 1) {
  console.log(typeof num);
}

test();          // 'number' (num is set to 1)
test(undefined); // 'number' (num is set to 1 too)

// test with other falsy values:
test('');        // 'string' (num is set to '')
test(null);      // 'object' (num is set to null)

통화 시간에 평가 :

기본 인수는 호출시 평가되므로 다른 언어와 달리 함수가 호출 될 때마다 새 객체가 작성됩니다.

function append(value, array = []) {
  array.push(value);
  return array;
}

append(1); //[1]
append(2); //[2], not [1, 2]


// This even applies to functions and variables
function callSomething(thing = something()) {
 return thing;
}

function something() {
  return 'sth';
}

callSomething();  //sth

기본 매개 변수는 나중에 기본 매개 변수에 사용 가능합니다.

이미 발생한 매개 변수는 나중에 기본 매개 변수에 사용 가능

function singularAutoPlural(singular, plural = singular + 's',
                        rallyingCry = plural + ' ATTACK!!!') {
  return [singular, plural, rallyingCry];
}

//["Gecko","Geckos", "Geckos ATTACK!!!"]
singularAutoPlural('Gecko');

//["Fox","Foxes", "Foxes ATTACK!!!"]
singularAutoPlural('Fox', 'Foxes');

//["Deer", "Deer", "Deer ... change."]
singularAutoPlural('Deer', 'Deer', 'Deer peaceably and respectfully \ petition the government for positive change.')

함수 본문 내에 정의 된 함수 :

Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30)에 도입되었습니다. 함수 본문에 선언 된 함수는 기본 매개 변수 내에서 참조 할 수 없으며 ReferenceError를 발생시킵니다 (현재 SpiderMonkey의 TypeError, 버그 1022967 참조). 기본 매개 변수는 항상 먼저 실행되고 함수 본문 내부의 함수 선언은 나중에 평가됩니다.

// Doesn't work! Throws ReferenceError.
function f(a = go()) {
  function go() { return ':P'; }
}

기본 매개 변수 다음에 기본값이없는 매개 변수 :

Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2) 이전에는 다음 코드에서 SyntaxError가 발생했습니다. 이것은 버그 777060에서 수정되었으며 이후 버전에서 예상대로 작동합니다. 기본값이없는 이후의 매개 변수가 있어도 매개 변수는 여전히 왼쪽에서 오른쪽으로 설정되어 기본 매개 변수를 겹쳐 씁니다.

function f(x = 1, y) {
  return [x, y];
}

f(); // [1, undefined]
f(2); // [2, undefined]

기본값이 할당 된 구조화 된 매개 변수 :

파괴 할당 표기법으로 기본값 할당을 사용할 수 있습니다

function f([x, y] = [1, 2], {z: z} = {z: 3}) {
  return x + y + z;
}

f(); // 6

0

기본 매개 변수를 설정하는 다른 방법은 인수 대신 직접 인수의 객체 맵을 사용하는 것입니다. 예를 들어

const defaultConfig = {
 category: 'Animals',
 legs: 4
};

function checkOrganism(props) {
 const category = props.category || defaultConfig.category;
 const legs = props.legs || defaultConfig.legs;
}

이런 식으로 인수를 쉽게 확장 할 수 있으며 인수 길이 불일치에 대해 걱정하지 않아도됩니다.


-1

대답은 '예'입니다. 실제로 기본 매개 변수를 지원하는 언어가 많이 있습니다. 파이썬은 그중 하나입니다.

def(a, enter="Hello"):
   print(a+enter)

이것은 괄호로 인해 Python 3 코드이지만 함수의 기본 매개 변수는 JS에서도 작동합니다.

예를 들어 귀하의 경우 :

function read_file(file, deleteAfter=false){
  console.log(deleteAfter);
}

read_file("test.txt");

그러나 때로는 기본 매개 변수가 필요하지 않은 경우가 있습니다.

함수가 시작된 직후 다음과 같이 변수를 정의 할 수 있습니다.

function read_file(file){
  var deleteAfter = false;
  console.log(deleteAfter);
}

read_file("test.txt");

두 예제 모두에서 동일한 것을 반환합니다. 그러나 때로는 고급 프로젝트와 같이 실제로 유용 할 수 있습니다.

결론적으로 기본 매개 변수 값은 JS에서 사용될 수 있습니다. 그러나 함수 시작 직후 변수를 정의하는 것과 거의 같습니다. 그러나 때로는 여전히 매우 유용합니다. 알다시피, 기본 매개 변수 값은 함수 시작 직후 매개 변수를 정의하는 표준 방법보다 코드 줄이 1 줄입니다.

편집 : 그리고 이것은 매우 중요합니다! 이것은IE에서 작동 하지 않습니다 . 설명서를 참조하십시오. 따라서 IE에서는 "기능 상단에 변수 정의"방법을 사용해야합니다. IE에서는 기본 매개 변수가 작동하지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.