Pertanyaan Setel nilai parameter default untuk fungsi JavaScript


Saya ingin fungsi JavaScript memiliki argumen opsional yang saya atur default, yang akan digunakan jika nilainya tidak ditentukan. Di Ruby Anda dapat melakukannya seperti ini:

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

Apakah ini berfungsi di JavaScript?

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

2017
2018-05-21 20:07


asal


Jawaban:


Dari ES6 / ES2015, parameter default dalam spesifikasi bahasa.

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

hanya berfungsi.

Referensi: Parameter Default - MDN

Parameter fungsi default memungkinkan parameter formal diinisialisasi dengan nilai default jika Tidak bernilai atau tidak terdefinisi dilewatkan.

Anda juga bisa mensimulasikan default bernama parameter melalui perusakan:

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

Pra ES2015,

Ada banyak cara, tetapi ini adalah metode yang saya sukai - ini memungkinkan Anda meneruskan 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';
  ...
}

2931
2018-05-21 20:10



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

Ini ditetapkan untuk delete_after nilai dari delete_after jika bukan falsey nilai sebaliknya itu memberikan string "my default here". Untuk detail lebih lanjut, periksa Survei Doug Crockford tentang bahasa dan periksa bagian tentang Operator.

Pendekatan ini tidak berfungsi jika Anda ingin lulus dalam falsey nilai i.e. false, null, undefined, 0 atau "". Jika Anda membutuhkan falsey nilai-nilai yang harus dilewatkan dalam Anda akan perlu menggunakan metode dalam Jawaban Tom Ritter.

Ketika berhadapan dengan sejumlah parameter ke fungsi, sering berguna untuk memungkinkan konsumen untuk melewati 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" }); 

559
2018-05-21 20:09



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

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

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

137
2018-05-21 20:18



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

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

Ini akan diatur delete_after untuk false jika tidak ada atau undefined. Anda dapat menggunakan fitur ES6 seperti sekarang ini dengan transpilers seperti Babel.

Lihat artikel MDN untuk informasi lebih lanjut.


54
2018-05-29 15:25



Nilai Parameter Default

Dengan ES6, Anda dapat melakukan mungkin salah satu idiom paling umum di JavaScript berkaitan dengan pengaturan nilai default untuk parameter fungsi. Cara yang telah kami lakukan selama bertahun-tahun ini seharusnya 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 sering digunakan, tetapi berbahaya ketika kita melewatkan nilai-nilai seperti

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

Mengapa? Karena 0 is falsy, dan begitu x || 11 results in 11, bukan langsung diteruskan ke 0. Untuk memperbaiki gotcha ini, beberapa orang malah akan menulis cek lebih verbosely 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 berguna bagus ditambahkan pada ES6 untuk merampingkan penugasan 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 = 11 dalam deklarasi fungsi lebih seperti x !== undefined ? x : 11 daripada idiom yang lebih umum x || 11

Ekspresi Nilai Default

Function nilai default dapat 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 saat dibutuhkan - yaitu, ketika argumen parameter diabaikan atau tidak terdefinisi.

Ekspresi nilai default bahkan dapat berupa panggilan ekspresi fungsi inline - umumnya disebut sebagai Ekspresi Fungsi yang Diaktifkan Segera (IIFE):

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

18
2017-10-15 17:58



solusi itu bekerja untuk saya di js:

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

8
2017-11-16 11:29



Cukup gunakan perbandingan eksplisit dengan tidak terdefinisi.

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

6
2017-11-16 07:34



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 tidak bekerja secara konsisten di seluruh browser. Bagi saya itu bekerja pada chrome di desktop saya, tetapi tidak berfungsi pada chrome di android. Pilihan yang lebih aman, karena banyak yang telah disebutkan di atas -

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

Niat untuk jawaban ini bukan untuk mengulang solusi yang sama, apa yang sudah disebutkan orang lain, tetapi untuk menginformasikan bahwa penugasan parameter dalam definisi fungsi dapat bekerja pada beberapa browser, tetapi jangan bergantung padanya.


5
2018-05-19 06:40