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

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

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

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

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



답변

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';
  ...
}


답변

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" }); 


답변

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

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

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


답변

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

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

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

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


답변

기본 매개 변수 값

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


답변

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

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


답변

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

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