javascript - es6是什麼 - js import




設置JavaScript函數的默認參數值 (14)

ES6:正如大多數答案中已經提到的,在ES6中,您可以簡單地初始化參數和值。

ES5:大多數給定的答案對我來說都不夠好,因為在某些情況下我可能需要將0nullundefined等假值傳遞給函數。 要確定參數是否未定義,因為這是我傳遞的值而不是未定義的,因為根本沒有定義,我這樣做:

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

我希望JavaScript函數具有可選參數,我將其設置為默認值,如果未定義該值,則使用該參數。 在Ruby中你可以這樣做:

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

這適用於JavaScript嗎?

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

默認參數值

使用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 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 !== undefined ? x : 11比更常見的成語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

作為更新...使用ECMAScript 6,您可以在函數參數聲明中最終設置默認值,如下所示:

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

f(1) === 50

正如 - http://es6-features.org/#DefaultParameterValues所引用的那樣


只需使用與undefined的顯式比較。

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

在javascript中使用默認參數值時,我強烈建議極其謹慎。 當與高階函數(如forEachmapreduce結合使用時,它通常會產生錯誤。 例如,考慮以下代碼行:

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

parseInt有一個可選的第二個參數function parseInt(s, [ radix =10])但map調用parseInt有三個參數:( elementindexarray )。

我建議您將所需參數從可選/默認值參數中分離出來。 如果您的函數需要1,2或3個必需參數,其默認值沒有意義,請將它們作為函數的位置參數,任何可選參數都應該作為單個對象的命名屬性。 如果你的函數需要4個或更多,或許通過單個對象參數的屬性提供所有參數更有意義。

在你的情況下,我建議你寫這樣的deleteFile函數:

// 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 = false } = options || {}; // if null
  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);

運行上面的代碼片段說明了未使用參數的默認參數值背後隱藏的危險。


如果您使用的是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如果它不返回righthandide值。 在沒有相應參數的情況下調用函數時,JS引擎將參數變量(在我們的示例中為bar )設置為undefinedundefined然後轉換為false,因此OR運算符返回值0。


如果要使用最新的ECMA6語法,請使用此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


對於有興趣在Microsoft Edge中使用代碼工作的任何人,請不要在函數參數中使用默認值。

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

在該示例中,Edge將拋出錯誤“Expecting”)'“

繞過這個用途

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

截至2016年8月8日,這仍然是一個問題


我發現像這樣簡單的東西更加簡潔和個性化。

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

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

是的,這將在Javascript中工作。 你也可以這樣做:

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 [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

您可以定義形式參數的默認值。 並使用typeof函數檢查未定義的值。


該解決方案適用於js:

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

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






default-parameters