답변:
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';
...
}
undefined
객체를 : P는 그것은 일부 브라우저에서 작동 할 수 있고 빠를 수도 동안에도 null
여전히 객체이고 undefined
있다는 것을 말하려고 프리미티브 유형을 참조입니다 여기에는 아무것도 없습니다 null
. 간단히 말해서 JavaScript / Reference / Global_Objects / undefined의 두 경우를 모두 참조하십시오 .
typeof
중복됩니다. function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
이것은 참조 오류를 발생시키지 않으며 간결합니다.
a = a
하고 있는지 그리고 b = b
그 매개 변수가 정의되지 않은 때를 좋아하지 않습니다. 또한 조금 복잡한 조건을 가진 삼항 연산자는 향후 관리자에게 읽기 어려울 수 있습니다. 나는 다음과 같은 구문을 선호합니다 : if (typeof a == 'undefined') a = 42
-불필요한 할당이없고 조금 더 읽기 쉽습니다.
typeof
있습니까? 그냥하는 것이 더 간단 해 보일 것 a === undefined
입니다. 또한 철자가 틀린 경우 undefined
와 문자열에 넣는 경우 참조 오류가 발생 합니다.
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" });
delete_after
표현의 부울 결과를 얻지 못 delete_after || "my default value"
합니까?
개인적으로 훨씬 간결하고 읽을 수있는 간단한 것이 있습니다.
function pick(arg, def) {
return (typeof arg == 'undefined' ? def : arg);
}
function myFunc(x) {
x = pick(x, 'my default');
}
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. 이 답변에 표시된 글로벌 네임 스페이스를 사용하는 것은 많은 사람들이 나쁜 습관으로 간주합니다. util.default(arg, "defaul value")
밑줄을 사용하지 않으려 는 경우이 일반적인 작업 (예 :)에 대한 자체 유틸리티를 롤링하는 것을 고려할 수 있지만, 대부분 휠을 재발 명 할 시점이 아닌 조만간 밑줄을 사용하게됩니다.
undefined
에서는 다른 값 으로 덮어 쓸 수 있었기 때문에 오래된 테스트가 지속 되어 테스트가 실패합니다.
undefined
. 그래서, 그것은 여전히 좋은를 사용하는 아이디어 typeof
와 'undefined'
.
ECMAScript 6에서는 실제로 가지고있는 것을 정확하게 작성할 수 있습니다.
function read_file(file, delete_after = false) {
// Code
}
존재하지 않는 경우 또는로 설정 delete_after
됩니다 . 오늘날 이와 같은 ES6 기능을 Babel 과 같은 변환기로 사용할 수 있습니다 .false
undefined
기본 매개 변수 값
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
}
delete_after
입니다 0
나 null
? 이러한 경우에는 올바르게 작동하지 않습니다.
delete_after = delete_after === undefined ? false : delete_after
?
자바 스크립트에서 기본 매개 변수 값을 사용할 때 매우주의해야합니다. 종종 같은 고차 함수와 함께 사용하면 버그를 생성 forEach
, map
및 reduce
. 예를 들어 다음 코드 줄을 고려하십시오.
['1', '2', '3'].map(parseInt); // [1, NaN, NaN]
parseInt에는 선택적 두 번째 매개 변수 function parseInt(s, [
기수가=10])
있지만 parseInt
세 개의 인수 ( element , index 및 array )로 맵 호출 이 있습니다.
선택적 / 기본 값 인수에서 필수 매개 변수를 분리하는 것이 좋습니다. 함수가 기본값이 의미가없는 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);
위의 스 니펫을 실행하면 사용되지 않은 매개 변수의 기본 인수 값 뒤에 숨어있는 위험을 보여줍니다.
typeof deleteAfter === 'bool'
하고 그렇지 않으면 예외를 throw 하는 것이 좋습니다 . 또한 map / foreach 등과 같은 메소드를 사용하는 경우주의해서 사용하고 익명 함수로 함수를 랩하십시오. ['1', '2', '3'].map((value) => {read_file(value);})
get
메소드를 사용하여 deleteAfter 를 검색합니다. typeof 'deleteAfter' !== 'bool'
신중한 조치가 될 수 있다면 예외를 던지기 . 나는 호출자가 "주의"를 요구하는 방법을 설계하는 것을 좋아하지 않는다. 주의는 호출자가 아닌 기능의 책임입니다. 최종 행동은 최소한의 놀라움의 원칙을 따라야합니다.
갱신으로 ... ECMAScript를 6으로 수행 할 수 있습니다 드디어 함수 매개 변수 선언에서 설정된 기본 값은 너무 좋아한다 :
function f (x, y = 7, z = 42) {
return x + y + z
}
f(1) === 50
오랜 시간 동안 C ++ 개발자 (Rookie to web development :)),이 상황을 처음 접했을 때 나는 다음과 같이 질문에서 언급 한 것처럼 함수 정의에서 매개 변수 할당을 수행했습니다.
function myfunc(a,b=10)
그러나 브라우저에서 일관되게 작동하지 않습니다. 나를 위해 그것은 내 바탕 화면의 크롬에서 작동했지만 안드로이드의 크롬에서는 작동하지 않았습니다. 위에서 언급했듯이 더 안전한 옵션은-
function myfunc(a,b)
{
if (typeof(b)==='undefined') b = 10;
......
}
이 답변의 목적은 다른 사람들이 이미 언급 한 것과 동일한 솔루션을 반복하는 것이 아니라 함수 정의의 매개 변수 할당이 일부 브라우저에서 작동 할 수 있음을 알리는 것이지만 의존하지는 않습니다.
function myfunc(a,b=10)
ES6 구문이 궁금 하다면 다른 답변에 호환성 테이블에 대한 링크가 있습니다.
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 일 현재 이것은 여전히 문제입니다
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!!!
최신 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
해당 함수를 호출 할 때 매개 변수 값이 전달되지 않으면 매개 변수 변수가 사용된다는 사실에 의존 합니다.
ES6 : 대부분의 답변에서 이미 언급했듯이 ES6에서는 매개 변수를 값과 함께 초기화 할 수 있습니다.
ES5 : 주어진 답변의 대부분은 내가 같은 falsey 값을 전달 할 수 있습니다 경우가 있기 때문에 저를 위해 좋지 충분히 0
, null
그리고 undefined
기능에. 전혀 정의되지 않았기 때문에 undefined 대신 전달한 값이므로 매개 변수가 정의되어 있지 않은지 확인하려면 다음과 같이하십시오.
function foo (param1, param2) {
param1 = arguments.length >= 1 ? param1 : "default1";
param2 = arguments.length >= 2 ? param2 : "default2";
}
function throwIfNoValue() {
throw new Error('Missing argument');
}
function foo(argValue = throwIfNoValue()) {
return argValue ;
}
여기에서 foo ()는 argValue라는 매개 변수를 가진 함수입니다. 함수 호출에 아무것도 전달하지 않으면 throwIfNoValue () 함수가 호출되고 반환 된 결과는 유일한 인수 argValue에 지정됩니다. 이것이 함수 호출을 기본 매개 변수로 사용하는 방법입니다. 코드를 더 간단하고 읽기 쉽게 만듭니다.
사용중인 경우 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
이 예에서는)가 undefined
JS 엔진 에 의해 설정됩니다 . undefined
그런 다음 false로 변환되므로 OR
연산자는 값 0을 리턴합니다.
예, 기본 매개 변수 사용은 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 는 전달 된 값만 대체됩니다. 진실합니다. 왜냐하면 그것이 ||
작동 하는 방식 때문입니다 .
어떤 이유로 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 인 경우 기본값을 설정합니다.
앞으로는 한 객체를 다른 객체로 "확산"할 수있을 것입니다 (현재 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
}
function(opt){ const opt = /*some merging*/; }
? 변수 가 선언되기 전에 변수 를 사용하기 때문에 확실히 작동하지 않습니다.const
– 조정해야합니다. –function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
내 기술을 보여주기 위해 (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';
...
}
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에 할당됩니다 . 이 방법은 프로그래밍 방식으로는 매력적으로 보이지 않지만 이전 버전과의 호환성이 있습니다.
예, 이것을 기본 매개 변수라고합니다
기본 함수 매개 변수를 사용하면 값이 없거나 정의되지 않은 경우 공식 매개 변수를 기본값으로 초기화 할 수 있습니다.
통사론:
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
기본 매개 변수를 설정하는 다른 방법은 인수 대신 직접 인수의 객체 맵을 사용하는 것입니다. 예를 들어
const defaultConfig = {
category: 'Animals',
legs: 4
};
function checkOrganism(props) {
const category = props.category || defaultConfig.category;
const legs = props.legs || defaultConfig.legs;
}
이런 식으로 인수를 쉽게 확장 할 수 있으며 인수 길이 불일치에 대해 걱정하지 않아도됩니다.
대답은 '예'입니다. 실제로 기본 매개 변수를 지원하는 언어가 많이 있습니다. 파이썬은 그중 하나입니다.
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에서는 기본 매개 변수가 작동하지 않습니다.
예, 자바 스크립트로 작동합니다. 당신은 또한 할 수 있습니다 :
function func(a=10,b=20)
{
alert (a+' and '+b);
}
func(); // Result: 10 and 20
func(12); // Result: 12 and 20
func(22,25); // Result: 22 and 25
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }
다음과 같이 캡슐화 할 수도 있습니다.a = defaultFor(a, 42);