Tetapkan nilai parameter default untuk fungsi JavaScript

2367

Saya ingin fungsi JavaScript memiliki argumen opsional yang saya atur defaultnya, yang digunakan jika nilainya tidak didefinisikan (dan diabaikan jika nilainya diteruskan). Di Ruby Anda bisa melakukannya seperti ini:

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

Apakah ini berfungsi dalam JavaScript?

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

Jawaban:

3298

Dari ES6 / ES2015 , parameter default ada dalam spesifikasi bahasa.

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

hanya bekerja.

Referensi: Parameter Default - MDN

Parameter fungsi default memungkinkan parameter formal diinisialisasi dengan nilai default jika tidak ada nilai atau tidak terdefinisi .

Anda juga dapat mensimulasikan parameter bernama default melalui penghancuran :

// 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
    ···
}

Sebelum ES2015 ,

Ada banyak cara, tetapi ini adalah metode yang saya sukai - ini memungkinkan Anda memasukkan apa pun yang Anda inginkan, termasuk false atau null. ( typeof null == "object")

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}
Tom Ritter
sumber
216
Anda juga dapat merangkumnya seperti itu: function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }dan kemudian Anda dapat menyebutnya sebagaia = defaultFor(a, 42);
Camilo Martin
6
@ SiPlus dan Anda mendapat kesalahan referensi tambahan secara gratis saat mencoba menggunakan undefinedobjek: p Bahkan ketika itu dapat bekerja dengan beberapa browser dan mungkin lebih cepat, nullmasih merupakan objek dan undefinedreferensi ke tipe primitif yang mencoba untuk mengatakan bahwa ada tidak ada apa-apa di sini, bahkan tidak null. Lihat di sini, kedua kasus singkatnya: JavaScript / Referensi / Global_Objects / tidak terdefinisi .
Sampo Sarrala - codidact.org
9
jika Anda memeriksa properti milik objek, maka typeofitu mubazir. function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }Ini tidak akan membuang kesalahan referensi dan singkat.
Dziamid
10
Saya tahu ini sangat kecil, tapi saya tidak suka bagaimana Anda menetapkan a = adan b = bketika parameter tersebut tidak ditentukan. Juga, operator ternary dengan kondisi yang agak rumit mungkin sulit dibaca untuk pengelola masa depan. Saya lebih suka sintaks berikut: if (typeof a == 'undefined') a = 42- tidak ada tugas yang tidak perlu ditambah sedikit lebih mudah dibaca.
Daddy32
12
Apakah ada alasan untuk menggunakannya typeof? Tampaknya lebih sederhana untuk dilakukan a === undefined. Selain itu, Anda akan mendapatkan kesalahan referensi jika Anda salah mengeja undefineddan memasukkannya ke dalam string.
Abe Voelker
599
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

Ini memberikan delete_afternilai delete_afterjika bukan nilai falsey jika tidak maka akan memberikan string "my default here". Untuk lebih detail, lihat survei bahasa Doug Crockford dan periksa bagian tentang Operator .

Pendekatan ini tidak bekerja jika Anda ingin lulus dalam falsey nilai yaitu false, null, undefined, 0atau "". Jika Anda memerlukan nilai falsey untuk diteruskan, Anda harus menggunakan metode dalam jawaban Tom Ritter .

Ketika berhadapan dengan sejumlah parameter ke suatu fungsi, sering kali berguna untuk memungkinkan konsumen untuk melewatkan argumen parameter dalam suatu objek dan kemudian menggabungkan nilai-nilai ini dengan objek yang berisi nilai default untuk fungsi tersebut.

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

menggunakan

// 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" }); 
Russ Cam
sumber
115
Saya menemukan ini tidak cukup, karena saya mungkin ingin menyampaikan yang salah.
Tom Ritter
52
Saya merasa cukup untuk sebagian besar situasi
Russ Cam
50
Karena tidak bekerja untuk nilai falsey, itu dapat membuat mimpi buruk pemeliharaan. Sedikit kode yang selalu melewati nilai-nilai kebenaran sebelumnya dan tiba-tiba gagal karena yang salah dilewatkan mungkin harus dihindari jika ada pendekatan yang lebih kuat.
jinglesthula
1
Kenapa, dalam hal ini, delete_aftertidak mendapatkan hasil boolean dari ekspresi delete_after || "my default value"?
xbonez
3
atau, Anda bisa saja default ke nilai falsey - yang umumnya merupakan default yang baik (mis., false untuk bools, string kosong untuk string, 0 untuk angka, dll.) - dalam hal ini tidak masalah apa pun lewat.
Mark Brackett
150

Saya menemukan sesuatu yang sederhana seperti ini menjadi jauh lebih ringkas dan dapat dibaca secara pribadi.

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

function myFunc(x) {
  x = pick(x, 'my default');
} 
TJ L
sumber
6
Pembaruan: Jika Anda menggunakan underscore.js, saya merasa lebih baik menggunakannya _.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});. Menggunakan namespace global seperti yang ditunjukkan dalam jawaban ini oleh banyak orang dianggap praktik buruk. Anda juga dapat mempertimbangkan untuk menggulir utilitas Anda sendiri untuk tugas umum ini (mis. util.default(arg, "defaul value")) Jika tidak ingin menggunakan garis bawah, tapi saya akhirnya menggunakan garis bawah cepat atau lambat bagaimanapun juga tidak ada gunanya menciptakan kembali roda.
andersand
2
Saya benar-benar merekomendasikan yang satu ini, saya menggunakannya dan menyebutnya "por" yang merupakan singkatan dari "parameter atau"
super
2
Jangan mengatakan typeof arg == 'undefined', sebaliknya katakan arg === undefined
OsamaBinLogin
3
@OsamaBinLogin apa yang Anda katakan benar untuk JS saat ini - tes yang lebih lama tetap ada karena pada beberapa browser dulu mungkin untuk menimpa undefineddengan beberapa nilai lain, menyebabkan tes gagal.
Alnitak
2
@Alnitak: Masih mungkin untuk menimpa undefined. Jadi, ini masih ide yang bagus untuk digunakan typeofdan 'undefined'.
LS
63

Dalam ECMAScript 6 Anda benar-benar dapat menulis apa yang Anda miliki:

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

Ini akan diatur delete_afterke falsejika tidak ada atau undefined. Anda dapat menggunakan fitur ES6 seperti ini hari ini dengan transpiler seperti Babel .

Lihat artikel MDN untuk informasi lebih lanjut .

Felix Kling
sumber
1
ECMAScript 6 Saya kira ... (Saya akan mengoreksi sendiri tetapi saya tidak dapat mengedit <6 karakter)
Zac
1
Menunggu peramban, dapatkan ECMAScript 6
Adriano Resende
1
Untuk apa Babel mengubah ini menjadi?
harryg
2
@harryg: babeljs.io/repl/…
Felix Kling
2
Berikut ini adalah tabel kompatibilitas untuk ES6 kangax.github.io/compat-table/es6/#default_function_parameters Sayangnya sintaks ini belum didukung .
freemanoid
27

Nilai Parameter Default

Dengan ES6, Anda dapat melakukan salah satu idiom paling umum dalam JavaScriptkaitannya dengan pengaturan nilai default untuk parameter fungsi. Cara kami melakukan ini selama bertahun-tahun akan terlihat cukup akrab:

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

Pola ini paling banyak digunakan, tetapi berbahaya ketika kita memberikan nilai seperti

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

Mengapa? Karena 0 is falsy, dan sebagainya x || 11 results in 11, bukan yang secara langsung disahkan dalam 0. Untuk memperbaiki gotcha ini, beberapa orang malah akan menulis cek dengan lebih jelas seperti ini:

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

kita sekarang dapat memeriksa sintaks yang bagus dan membantu ES6untuk merampingkan penetapan nilai default ke argumen yang hilang:

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 = 11dalam deklarasi fungsi lebih seperti x !== undefined ? x : 11daripada idiom yang jauh lebih umumx || 11

Ekspresi Nilai Default

Functionnilai default bisa lebih dari sekadar nilai sederhana seperti 31; mereka dapat berupa ekspresi yang valid, bahkan a 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

Seperti yang Anda lihat, ekspresi nilai default dievaluasi dengan malas, artinya hanya berjalan jika dan ketika dibutuhkan - yaitu, ketika argumen parameter dihilangkan atau tidak ditentukan.

Ekspresi nilai default bahkan bisa menjadi panggilan ekspresi fungsi sebaris - umumnya disebut sebagai Ekspresi Fungsi yang Segera Diminta (IIFE):

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

solusi itu bekerja untuk saya di js:

function read_file(file, delete_after) {
    delete_after = delete_after || false;
    // Code
}
Takács Zsolt
sumber
4
Apa yang terjadi jika delete_afteryang 0atau null? Ini tidak akan berfungsi dengan benar untuk kasus ini.
Dmitri Pavlutin
@StephanBijzitter itu hanya akan benar dalam beberapa kasus. Tetapi jika Anda hanya ingin nilai default untuk menghapus nilai ini tidak bekerja, karena 0 atau null! === salah.
Rutrus
@ Rutrus: Saya tidak mengerti apa yang baru saja Anda katakan.
Stephan Bijzitter
Bagaimana dengan delete_after = delete_after === undefined ? false : delete_after?
aashah7
10

Cukup gunakan perbandingan eksplisit dengan undefined.

function read_file(file, delete_after)
{
    if(delete_after === undefined) { delete_after = false; }
}
Martin Wantke
sumber
10

Saya akan sangat menyarankan hati-hati ketika menggunakan nilai parameter default di javascript. Ini sering menimbulkan bug ketika digunakan bersama dengan fungsi yang lebih tinggi seperti forEach, map, dan reduce. Sebagai contoh, pertimbangkan baris kode ini:

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

parseInt memiliki parameter kedua function parseInt(s, [radix opsional =10])tetapi memetakan panggilan parseIntdengan tiga argumen: ( elemen , indeks , dan array ).

Saya sarankan Anda memisahkan parameter yang diperlukan dari argumen opsional / standar Anda. Jika fungsi Anda mengambil 1,2, atau 3 parameter yang diperlukan yang tidak ada nilai default yang masuk akal, menjadikannya parameter posisional untuk fungsi tersebut, setiap parameter opsional harus mengikuti atribut yang dinamai objek tunggal. Jika fungsi Anda membutuhkan 4 atau lebih, mungkin lebih masuk akal untuk memasok semua argumen melalui atribut parameter objek tunggal.

Dalam kasus Anda, saya akan menyarankan Anda menulis fungsi DeleteFile seperti ini: ( diedit per instead 's komentar ) ...

// 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);

Menjalankan cuplikan di atas menggambarkan bahaya yang bersembunyi di balik nilai argumen default untuk parameter yang tidak digunakan.

Doug Coburn
sumber
1
"Solusi yang lebih baik" ini sangat tidak dapat dibaca. Saya lebih suka merekomendasikan untuk memeriksa tipe variabel like typeof deleteAfter === 'bool'dan throw Exception sebaliknya. Plus jika menggunakan metode seperti map / foreach dll. Gunakan saja dengan hati-hati dan bungkus fungsi yang disebut dengan fungsi anonim. ['1', '2', '3'].map((value) => {read_file(value);})
sebagai gantinya
Itu poin yang bagus. Saya mencoba menghindari menggunakan pustaka dalam cuplikan kode saya, tetapi idiom ini cukup berantakan dalam javascript murni. Secara pribadi, saya akan menggunakan getmetode lodash untuk mengambil deleteAfter. Melempar pengecualian jika typeof 'deleteAfter' !== 'bool'juga bisa menjadi langkah bijaksana yang baik. Saya tidak suka merancang metode yang mengharuskan penelepon untuk "menggunakan hati-hati". Perhatian adalah tanggung jawab fungsi, bukan penelepon. Perilaku akhir harus mengikuti prinsip paling tidak mengejutkan.
Doug Coburn
Saya setuju, metode itu tidak boleh ditulis dengan cara seperti itu, yang menyebutnya, dapat merusak perilakunya. Tetapi perlu diingat bahwa fungsi itu seperti model, dan pemanggil seperti pengontrol. Model harus menangani pemrosesan data. Fungsi (metode) harus mengharapkan data itu, dapat dilewati dengan cara yang salah dan menanganinya. Itu sebabnya memeriksa jenis parameter plus melempar Pengecualian, adalah cara terbaik. Meskipun lebih kompleks. Tapi tetap saja itu bisa menyelamatkan Anda dari menggaruk-garuk kepala dan terus bertanya ... MENGAPA TIDAK BEKERJA ?! dan kemudian ... MENGAPA INI BEKERJA ?!
sebagai gantinya
9

Sebagai pembaruan ... dengan ECMAScript 6 Anda AKHIRNYA dapat menetapkan nilai default dalam deklarasi parameter fungsi seperti:

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

f(1) === 50

Seperti yang dirujuk oleh - http://es6-features.org/#DefaultParameterValues

zillaofthegods
sumber
11
Jawaban ini tidak berguna karena ini adalah duplikat
pengguna
8

menjadi pengembang C ++ yang lama (Rookie to web development :)), ketika saya pertama kali menemukan situasi ini, saya melakukan penugasan parameter dalam definisi fungsi, seperti yang disebutkan dalam pertanyaan, sebagai berikut.

function myfunc(a,b=10)

Tetapi berhati-hatilah karena itu tidak bekerja secara konsisten di seluruh browser. Bagi saya itu berfungsi di chrome di desktop saya, tetapi tidak bekerja di chrome di android. Opsi yang lebih aman, karena banyak yang telah disebutkan di atas adalah -

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

Niat untuk jawaban ini bukan untuk mengulangi solusi yang sama, apa yang telah disebutkan orang lain, tetapi untuk menginformasikan bahwa penetapan parameter dalam definisi fungsi dapat berfungsi pada beberapa browser, tetapi jangan bergantung padanya.

vivek
sumber
3
Tugas dalam definisi fungsi juga tidak berfungsi di IE 11, yang merupakan versi IE terbaru untuk Windows 8.1.
DiMono
1
Jika ada yang bertanya-tanya, function myfunc(a,b=10)adalah sintaks ES6, ada tautan ke tabel kompatibilitas di jawaban lain.
gcampbell
7

Bagi siapa pun yang tertarik memiliki kode yang berfungsi di Microsoft Edge, jangan gunakan standar dalam parameter fungsi.

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

Dalam contoh itu, Edge akan menampilkan kesalahan "Mengharapkan ')'"

Untuk menyiasati penggunaan ini

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

Sampai 08 Agustus 2016 ini masih menjadi masalah

Steven Johnston
sumber
4

Sesuai sintaks

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

Anda dapat menentukan nilai default dari parameter formal. dan juga memeriksa nilai yang tidak ditentukan dengan menggunakan fungsi typeof .

Sachin Kumar
sumber
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!!!
Tính Ngô Quang
sumber
4

Gunakan ini jika Anda ingin menggunakan ECMA6sintaks terbaru :

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

Ini disebut default function parameters. Ini memungkinkan parameter formal diinisialisasi dengan nilai default jika tidak ada nilai atau tidak terdefinisi. CATATAN : Ini tidak akan berfungsi dengan Internet Explorer atau browser yang lebih lama.

Untuk kompatibilitas maksimum yang mungkin, gunakan ini:

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

Kedua fungsi memiliki perilaku yang sama persis karena masing-masing contoh ini bergantung pada fakta bahwa variabel parameter akan menjadi undefinedjika tidak ada nilai parameter yang dilewati ketika memanggil fungsi itu.

BlackBeard
sumber
CATATAN: seperti yang dikatakan @BlackBeard, fungsi (param = nilai) WONT bekerja dengan IE. Gunakan versi yang kompatibel.
MagicLAMP
4

ES6: Seperti yang sudah disebutkan di sebagian besar jawaban, di ES6, Anda cukup menginisialisasi parameter bersama dengan nilai.


ES5: Sebagian besar jawaban yang diberikan tidak cukup baik bagi saya karena ada beberapa kesempatan di mana saya mungkin harus memberikan nilai falsey seperti 0, nulldan undefinedke suatu fungsi. Untuk menentukan apakah suatu parameter tidak terdefinisi karena itulah nilai yang saya berikan alih-alih tidak terdefinisi karena tidak didefinisikan sama sekali, saya melakukan ini:

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

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

Here foo () adalah fungsi yang memiliki parameter bernama argValue. Jika kita tidak melewatkan apa pun dalam pemanggilan fungsi di sini, maka fungsi throwIfNoValue () akan dipanggil dan hasil yang dikembalikan akan ditugaskan ke argumen hanya ArgValue. Ini adalah bagaimana panggilan fungsi dapat digunakan sebagai parameter default. Yang membuat kode lebih disederhanakan dan dibaca.

Contoh ini diambil dari sini

duta
sumber
3

Jika Anda menggunakan, ES6+Anda dapat mengatur parameter default dengan cara berikut:

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

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

Jika Anda membutuhkan ES5sintaks, Anda dapat melakukannya dengan cara berikut:

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

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

Dalam sintaks di atas ORoperator digunakan. The OROperator selalu mengembalikan nilai pertama jika ini dapat dikonversi ke truejika tidak mengembalikan nilai righthandside. Ketika fungsi dipanggil tanpa argumen yang sesuai, variabel parameter ( bardalam contoh kami) diatur undefinedoleh mesin JS. undefinedKemudian dikonversi ke false dan dengan demikian ORoperator mengembalikan nilai 0.

Willem van der Veen
sumber
3

Ya, menggunakan parameter default didukung sepenuhnya di ES6 :

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

atau

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

tetapi sebelumnya di ES5 Anda dapat dengan mudah melakukan ini:

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

Yang berarti jika nilainya ada di sana, gunakan nilainya, jika tidak, gunakan nilai kedua setelah ||operasi yang melakukan hal yang sama ...

Catatan: juga ada perbedaan besar di antara mereka jika Anda memberikan nilai ke ES6 satu bahkan nilainya falsy, yang akan diganti dengan nilai baru, sesuatu seperti nullatau ""... tetapi ES5 satu hanya akan diganti jika hanya nilai yang diteruskan benar, itu karena cara ||kerjanya ...

Alireza
sumber
2

Jika karena alasan tertentu Anda tidak di ES6 dan yang menggunakan lodashdi sini adalah cara ringkas untuk default parameter fungsi melalui _.defaultTometode:

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>

Yang akan mengatur default jika nilai saat ini adalah NaN , null , atau tidak terdefinisi

Akrion
sumber
1

Sounds of Future

Di masa depan, Anda akan dapat "menyebar" satu objek ke objek lain (saat ini pada 2019 TIDAK didukung oleh Edge !) - menunjukkan cara menggunakannya untuk opsi default yang bagus terlepas dari urutan:

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

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

... sementara itu yang didukung Edge DOES adalah Object.assign () (IE tidak, tapi saya sangat berharap kita dapat meninggalkan IE di belakang :))

Demikian pula yang bisa Anda lakukan

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

EDIT: Karena komentar tentang constopsi - masalah dengan menggunakan opsi konstan di sisa fungsi sebenarnya bukan karena Anda tidak bisa melakukan itu, hanya saja Anda tidak dapat menggunakan variabel konstan dalam deklarasi sendiri - Anda akan memiliki untuk menyesuaikan penamaan input ke sesuatu seperti

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
}
jave.web
sumber
Masalahnya adalah bahwa Anda biasanya tidak ingin melakukan itu karena ini akan menetapkan kembali opsi yang sudah ditentukan tetapi Anda dapat menggunakannya dengan var lain yang akan sah.
frank-dspeed
tes fungsi (opsi) {/ * Opsi didefinisikan akan menimbulkan kesalahan jika Anda menggunakan opsi const = {} sekarang * /}
frank-dspeed
tidak ada global ketika Anda membuat fungsi dan Anda masuk sebagai opsi nama argumen maka di dalam opsi fungsi didefinisikan di dalam fungsi (opt) {} opt didefinisikan Anda tidak dapat menggunakan const opt ​​di dalam fungsi itu maka ini buruk karena Anda melakukan
pengalihan tugas
@ google-frank-dspeed ah, maksud Anda tidak bisa function(opt){ const opt = /*some merging*/; }? Itu pasti tidak akan berhasil karena Anda akan menggunakan constvariabel sebelum dideklarasikan - Anda harus menyesuaikan -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
jave.web
@ google-frank-dspeed tetap lebih banyak orang baru mungkin akan bertanya-tanya tentang hal ini, jadi saya telah menambahkan kode cara untuk mengedit :) jadi terima kasih telah menunjukkannya untuk orang lain :)
jave.web
1

Sekadar memamerkan keahlian saya juga (lol), fungsi di atas dapat ditulis bahkan tanpa menyebutkan argumen seperti di bawah:

ES5 dan di atasnya

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

ES6 ke atas

function foo(...rest) {
    a = typeof rest[0] !== 'undefined' ? a : 42;
    b = typeof rest[1] !== 'undefined' ? b : 'default_b';
    ...
}
Shivang Gupta
sumber
0
def read_file(file, delete_after = false)
  # code
end

Kode berikut dapat berfungsi dalam situasi ini termasuk ECMAScript 6 (ES6) serta versi sebelumnya.

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');

karena nilai default dalam bahasa berfungsi saat nilai parameter fungsi dilewati saat memanggil, dalam JavaScript fungsi tersebut ditetapkan untuk tidak terdefinisi . Pendekatan ini tidak terlihat menarik secara pemrograman tetapi memiliki kompatibilitas ke belakang .

Muhammad Rizwan
sumber
0

Ya ini disebut sebagai parameter default

Parameter fungsi default memungkinkan parameter formal diinisialisasi dengan nilai default jika tidak ada nilai atau tidak terdefinisi.

Sintaksis:

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

Deskripsi:

Parameter fungsi default ke undefined Namun, dalam situasi mungkin berguna untuk menetapkan nilai default yang berbeda. Di sinilah parameter default dapat membantu.

Di masa lalu, strategi umum untuk menetapkan standar adalah dengan menguji nilai parameter di badan fungsi dan menetapkan nilai jika tidak ditentukan. Jika tidak ada nilai yang diberikan dalam panggilan, nilainya akan tidak ditentukan. Anda harus menetapkan pemeriksaan bersyarat untuk memastikan parameter tidak terdefinisi

Dengan parameter default di ES2015, pemeriksaan di badan fungsi tidak lagi diperlukan. Sekarang Anda cukup meletakkan nilai default di kepala fungsi.

Contoh perbedaan:

// 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

Contoh Sintaks yang berbeda:

Padding tidak terdefinisi vs nilai-nilai palsu lainnya:

Bahkan jika nilainya diatur secara eksplisit saat memanggil, nilai argumen num adalah yang default.

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)

Dievaluasi pada waktu panggilan:

Argumen default dievaluasi pada waktu panggilan, jadi tidak seperti beberapa bahasa lain, objek baru dibuat setiap kali fungsi dipanggil.

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

Parameter default tersedia untuk parameter default nanti:

Params sudah ditemui tersedia untuk parameter default nanti

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.')

Fungsi yang didefinisikan di dalam tubuh fungsi:

Diperkenalkan di Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Fungsi yang dideklarasikan di badan fungsi tidak dapat dirujuk di dalam parameter default dan melempar ReferenceError (saat ini TypeError di SpiderMonkey, lihat bug 1022967). Parameter default selalu dijalankan terlebih dahulu, deklarasi fungsi di dalam tubuh fungsi mengevaluasi sesudahnya.

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

Parameter tanpa default setelah parameter default:

Sebelum Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), kode berikut menghasilkan SyntaxError. Ini telah diperbaiki di bug 777060 dan berfungsi seperti yang diharapkan di versi yang lebih baru. Parameter masih diatur kiri-ke-kanan, menimpa parameter default bahkan jika ada parameter selanjutnya tanpa default.

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

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

Parameter yang dirusak dengan penetapan nilai default:

Anda dapat menggunakan penetapan nilai default dengan notasi penetapan merusak

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

f(); // 6
esewalson
sumber
0

Hanya pendekatan yang berbeda untuk mengatur params default adalah dengan menggunakan objek peta argumen, bukan argumen secara langsung. Sebagai contoh,

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

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

Dengan cara ini, mudah untuk memperluas argumen dan tidak khawatir tentang panjang ketidakcocokan argumen.

Aman Pandey
sumber
-1

Jawabannya iya. Bahkan, ada banyak bahasa yang mendukung parameter default. Python adalah salah satunya:

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

Meskipun ini adalah kode Python 3 karena tanda kurung, parameter default dalam fungsi juga berfungsi di JS.

Misalnya, dan dalam kasus Anda:

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

read_file("test.txt");

Tetapi terkadang Anda tidak benar-benar membutuhkan parameter default.

Anda bisa mendefinisikan variabel tepat setelah dimulainya fungsi, seperti ini:

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

read_file("test.txt");

Dalam kedua contoh saya, ini mengembalikan hal yang sama. Tetapi kadang-kadang mereka sebenarnya bisa bermanfaat, seperti dalam proyek yang sangat maju

Jadi, sebagai kesimpulan, nilai parameter default dapat digunakan di JS. Tapi itu hampir sama dengan mendefinisikan variabel tepat setelah dimulainya fungsi. Namun, terkadang mereka masih sangat bermanfaat. Seperti yang Anda perhatikan, nilai parameter default mengambil 1 baris kode lebih sedikit daripada cara standar yang mendefinisikan parameter tepat setelah dimulainya fungsi.

EDIT: Dan ini sangat penting! Ini tidak akanberfungsi di IE. Lihat dokumentasi . Jadi dengan IE Anda harus menggunakan metode "define variable at top of function". Parameter default tidak akan berfungsi di IE.

zixuan
sumber
-3

Ya, ini akan berfungsi dalam Javascript. Anda juga dapat melakukannya:

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
Muhammad Awais
sumber
2
Saat ini tidak portabel ... IE ... developer.mozilla.org/en/docs/Web/JavaScript/Reference/… (Dan itu adalah jawaban rangkap ...)
Gert van den Berg