는 최상의 방법을 결정하는 경우에 인수가 전송되지 않습을 자바스크립트 함수

StackOverflow https://stackoverflow.com/questions/411352

  •  03-07-2019
  •  | 
  •  

문제

나는 지금 보는 2 가지 방법을 결정하는 경우에는 인수되었습을 통과하는 자바스크립트 함수.는지 궁금하네요한 경우 하나의 방법이 다른 것보다 더 나은 경우 또는 하나는 그냥 나쁜 사용할 수 있나요?

 function Test(argument1, argument2) {
      if (Test.arguments.length == 1) argument2 = 'blah';

      alert(argument2);
 }

 Test('test');

 function Test(argument1, argument2) {
      argument2 = argument2 || 'blah';

      alert(argument2);
 }

 Test('test');

로 내가 말할 수 있습니다,그들은 모두 결과 같은 일이지만 나만을 사용한 첫 번째 중 하나기 전에 생산.

또 다른 옵션으로 언급여 :

function Test(argument1, argument2) {
    if(argument2 === null) {
        argument2 = 'blah';
    }

    alert(argument2);
}

의안의 의견,그것은 더 나은 것을 변경하는 톰의 제안:

function Test(argument1, argument2) {
    if(argument2 === undefined) {
        argument2 = 'blah';
    }

    alert(argument2);
}
도움이 되었습니까?

해결책

인수가 함수에 전달되었는지 확인하는 몇 가지 방법이 있습니다. (원본) 질문에서 언급 한 두 가지 외에도 - 확인 arguments.length 또는 사용 || 기본값을 제공하는 연산자 - 인수를 명시 적으로 확인할 수도 있습니다. undefined ~을 통해 argument2 === undefined 또는 typeof argument2 === 'undefined' 편집증 인 경우 (주석 참조).

사용 || 운영자는 표준 관행이되었습니다 - 모든 멋진 아이들이 그렇게합니다. 그러나 조심하십시오 : 인수가 평가되면 기본값이 트리거됩니다. false, 그것은 실제로 그럴 수 있음을 의미합니다 undefined, null, false, 0, '' (또는 다른 것 Boolean(...) 보고 false).

따라서 문제는 어떤 점검을 사용 해야하는지입니다. 모두 약간 다른 결과를 얻습니다.

확인 중 arguments.length '가장 올바른'동작을 보여 주지만, 선택적인 인수가 둘 이상인 경우에는 불가능할 수 있습니다.

테스트 undefined 다음 '최고' - 함수가 명시 적으로 호출되면 '실패'만 undefined 가능성은 모든 가능성이 주장을 생략하는 것과 같은 방식으로 취급되어야합니다.

사용 || 유효한 인수가 제공 되더라도 운영자는 기본값 사용을 트리거 할 수 있습니다. 반면에, 그 행동은 실제로 바람직 할 수 있습니다.

요약: 당신이하고있는 일을 알고 있다면 사용하십시오!

내 생각에, 사용 || 또한 옵션 인수가 둘 이상이고 객체 문자 그럴을 명명 된 매개 변수의 해결 방법으로 전달하고 싶지 않은 경우에도 갈 수있는 방법입니다.

기본값을 사용하여 기본값을 제공하는 또 다른 좋은 방법 arguments.length 스위치 명령문의 레이블을 통해 떨어지면 가능합니다.

function test(requiredArg, optionalArg1, optionalArg2, optionalArg3) {
    switch(arguments.length) {
        case 1: optionalArg1 = 'default1';
        case 2: optionalArg2 = 'default2';
        case 3: optionalArg3 = 'default3';
        case 4: break;
        default: throw new Error('illegal argument count')
    }
    // do stuff
}

이것은 프로그래머의 의도가 (시각적으로) 명백하지 않으며 '마법 숫자'를 사용한다는 단점이 있습니다. 따라서 오류가 발생하기 쉽습니다.

다른 팁

jQuery를 사용하는 경우 (특히 복잡한 상황에서는 좋은 옵션 중 하나입니다. jQuery의 확장 방법.

function foo(options) {

    default_options = {
        timeout : 1000,
        callback : function(){},
        some_number : 50,
        some_text : "hello world"
    };

    options = $.extend({}, default_options, options);
}

기능을 호출하면 다음과 같이 다음과 같이합니다.

foo({timeout : 500});

그런 다음 옵션 변수는 다음과 같습니다.

{
    timeout : 500,
    callback : function(){},
    some_number : 50,
    some_text : "hello world"
};

이것은 테스트를 찾는 몇 가지 사례 중 하나입니다.

if(! argument2) {  

}

아주 멋지게 작동하며 올바른 의미를 구문 적으로 수행합니다.

(합법적 인 널 가치를 허용하지 않는 동시에 제한 argument2 다른 의미가 있습니다. 그러나 그것은 될 것입니다 진짜 혼란.)

편집하다:

이것은 느슨하게 유형 된 언어와 강한 언어 사이의 문체 차이의 정말 좋은 예입니다. 그리고 JavaScript가 스페이드에서 제공하는 문체 옵션.

저의 개인적인 취향 (다른 선호에 대한 비판은 없음)은 미니멀리즘입니다. 코드가 일관되고 간결한 한 코드가 더 적을수록 다른 사람이 내 의미를 올바르게 추론하기 위해 이해해야합니다.

그 선호도의 한 가지 의미는 내가 원하지 않는다는 것입니다. 대신, 나는 코드가 그것이 의미하는 것처럼 보이는 것을 의미하도록 노력한다. 그리고 내가 실제로 테스트해야 할 것에 대해서만 테스트하십시오.

다른 사람들의 코드에서 찾은 악화 중 하나는 더 큰 맥락에서 실제로 테스트중인 사례에 들어가기를 기대하는지 여부를 알아낼 필요가 있습니다. 또는 그들이 가능한 모든 것을 테스트하려고한다면 상황을 충분히 기대하지 않을 가능성이 있습니다. 즉, 자신있게 리팩터를 리팩터링하거나 수정하기 전에 양방향으로 철저하게 추적해야합니다. 나는 그들이 필요한 상황을 예측하기 때문에 다양한 시험을 마련했을 가능성이 높다고 생각합니다 (일반적으로 나에게는 분명하지 않습니다).

(나는이 사람들이 역동적 인 언어를 사용하는 방식에서 심각한 단점이라고 생각합니다. 너무 자주 사람들은 모든 정적 테스트를 포기하고 가짜를 원하지 않습니다.)

포괄적 인 Actionscript 3 코드를 우아한 JavaScript 코드와 비교하는 데 가장 눈부신 것을 보았습니다. AS3는 JS의 대부분의 3 ~ 4 배일 수 있으며, 코딩 결정의 수 (3-4x)로 인해 적어도 더 나은 신뢰성이 없다고 생각합니다.

당신이 말했듯이, shog9, ymmv. :디

상당한 차이가 있습니다. 몇 가지 테스트 사례를 설정하겠습니다.

var unused; // value will be undefined
Test("test1", "some value");
Test("test2");
Test("test3", unused);
Test("test4", null);
Test("test5", 0);
Test("test6", "");

첫 번째 방법을 설명하면 두 번째 테스트 만 기본값을 사용합니다. 두 번째 방법은 기본값을 모두 제외한 모든 방법입니다 (JS가 변환하므로 undefined, null, 0, 그리고 "" 부울 속으로 false. 그리고 Tom의 방법을 사용하려면 네 번째 테스트 만 기본값을 사용합니다!

선택한 방법은 실제로 의도 한 동작에 따라 다릅니다. 다른 값이 아닌 경우 undefined 허용됩니다 argument2, 당신은 아마도 첫 번째에 약간의 변화를 원할 것입니다; 0이 아닌, 널, 비어 있지 않은 값이 필요하다면, 두 번째 방법은 이상적입니다. 실제로는 종종 이러한 광범위한 값을 고려하여 이러한 광범위한 값을 빠르게 제거하는 데 사용됩니다.

url = url === undefined ? location.href : url;

ES6 (ES2015)에서는 사용할 수 있습니다 기본 매개 변수

function Test(arg1 = 'Hello', arg2 = 'World!'){
  alert(arg1 + ' ' +arg2);
}

Test('Hello', 'World!'); // Hello World!
Test('Hello'); // Hello World!
Test(); // Hello World!

죄송합니다. 아직 언급 할 수 없습니다. Tom의 답변에 대답하기 위해 ... JavaScript (undefined! = null) == false는 실제로 "NULL"과 작동하지 않으면 "정의되지 않은"을 사용해야합니다.

할 수 있게 편리한 접근 방식 인수를 검출하여 불러 일으키는 함수 개체의 선택적인 속성:

function foo(options) {
    var config = { // defaults
        list: 'string value',
        of: [a, b, c],
        optional: {x: y},
        objects: function(param){
           // do stuff here
        }
    }; 
    if(options !== undefined){
        for (i in config) {
            if (config.hasOwnProperty(i)){
                if (options[i] !== undefined) { config[i] = options[i]; }
            }
        }
    }
}

사용하지 않는 이유는 무엇입니까? !! 운영자? 변수 앞에 배치 된이 연산자는 부울로 돌립니다 (잘 이해 한 경우). !!undefined 그리고 !!null (심지어도 !!NaN, 그것은 매우 흥미로울 수 있습니다) 돌아올 것입니다 false.

여기에 예전이 있습니다.

function foo(bar){
    console.log(!!bar);
}

foo("hey") //=> will log true

foo() //=> will log false

때로는 기능을 Getter 및 Setter로 사용하는 경우 유형을 확인하고 싶을 수도 있습니다. 다음 코드는 ES6입니다 (ECMAScript에서 5 이상으로 실행되지 않음) :

class PrivateTest {
    constructor(aNumber) {
        let _aNumber = aNumber;

        //Privileged setter/getter with access to private _number:
        this.aNumber = function(value) {
            if (value !== undefined && (typeof value === typeof _aNumber)) {
                _aNumber = value;
            }
            else {
                return _aNumber;
            }
        }
    }
}

이있다 매개 변수가 함수로 전달되는지 여부를 찾는 까다로운 방법. 아래 예를 살펴보십시오.

this.setCurrent = function(value) {
  this.current = value || 0;
};

이것은 필요한 경우 필요한 경우를 의미합니다 value 존재하지 않거나 전달되지 않습니다 - 0으로 설정하십시오.

꽤 멋진 응!

fncalledfunction (param1, param2, window.youroptionalParameter)

위의 함수가 여러 곳에서 호출되고 첫 번째 매개 변수가 모든 위치에서 전달되지만 세 번째 매개 변수에 대해서는 확실하지 않은 경우 창을 사용할 수 있습니다.

window.param3은 발신자 메소드에서 정의되지 않은 경우 처리됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top