Nustatykite numatytąją parametrų reikšmę javascript funkcijai

Norėčiau, kad „JavaScript“ funkcija turėtų papildomus argumentus, dėl kurių nustatiau numatytąją vertę, kuri naudojama, jei reikšmė nėra apibrėžta. Ruby galite tai padaryti taip:

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

Ar ji veikia javascript?

 function read_file(file, delete_after = false) { // Code } 
2148
21 мая '09 в 23:07 2009-05-21 23:07 „Tilendor“ yra nustatytas gegužės 21 d ., 09:07 23:07 2009-05-21 23:07
@ 22 atsakymai

Iš ES6 / ES2015 numatytieji parametrai yra nurodyti kalbos specifikacijoje.

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

tiesiog veikia.

Nuoroda: Numatytieji nustatymai - MDN

Numatytosios funkcijos parametrai leidžia inicijuoti oficialius parametrus su numatytosiomis reikšmėmis, jei neperduodama jokia reikšmė ar nenustatyta .

Taip pat galite modeliuoti numatytus parametrus per restruktūrizavimą :

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

Išankstinis ES2015 ,

Yra daug būdų, tačiau tai yra mano pageidaujamas metodas - tai leidžia perkelti ką nors, įskaitant klaidingą ar nulinį. (tipo typeof null == "object" )

 function foo(a, b) { a = typeof a !== 'undefined' ? a : 42; b = typeof b !== 'undefined' ? b : 'default_b'; ... } 
3075
21 мая '09 в 23:10 2009-05-21 23:10 atsakė Tom Ritter gegužės 21, 09, 23:10 2009-05-21 23:10
 function read_file(file, delete_after) { delete_after = delete_after || "my default here"; //rest of code } 

Tai nustato delete_after į delete_after jei tai nėra melaginga vertė, kitaip ji priskiria eilutę "my default here" . Norėdami gauti daugiau informacijos, perskaitykite „ Doug Crockford“ kalbos apžvalgą ir skaitykite operatorių skyrių .

Šis metodas neveikia, jei norite perduoti klaidingą vertę, t.y. false , null , undefined , 0 arba "" . Jei jums reikalingos klaidingos vertės, kurias reikia perduoti, turėsite naudoti metodą Tom Ritter atsakyme .

Dirbant su keliais funkcijų parametrais, dažnai naudinga leisti vartotojui perduoti argumentus objekto parametrams ir tada sujungti šias reikšmes su objektu, kuriame yra numatytosios funkcijos vertės.

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

naudoti

 // 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" }); 
578
21 мая '09 в 23:09 2009-05-21 23:09 atsakymas pateikiamas Russ Cam'o gegužės 21 d., 09:09 2009-05-21 23:09

Aš kažką taip paprasta, kiek daug glaustesnė ir asmeniškai suprantama.

 function pick(arg, def) { return (typeof arg == 'undefined' ? def : arg); } function myFunc(x) { x = pick(x, 'my default'); } 
143
21 мая '09 в 23:18 2009-05-21 23:18 atsakymas duotas t1111 gegužės 21 d., 23:18, 2009-05-21 23:18

ECMAScript 6 galite faktiškai rašyti, ką turite:

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

Tai bus delete_after , jei ji nėra arba ji bus undefined . Galite naudoti ES6 funkcijas, pvz., Šiandien su transpileriais, pvz., „ Babel“ .

Daugiau informacijos rasite MDN straipsnyje .

58
29 мая '15 в 18:25 2015-05-29 18:25 atsakymą pateikė Felixas Klingas gegužės 29 d., 15 val. 15:25 2015-05-29 18:25

Numatytosios parametrų vertės

Su ES6 tikriausiai galite padaryti vieną iš dažniausiai naudojamų „ JavaScript idiomų, susijusių su numatytojo parametro reikšmės nustatymu. Tai, kaip mes tai darome daugelį metų, turėtų atrodyti gana pažįstami:

 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 

Šis šablonas yra dažniausiai naudojamas, tačiau, pavyzdžiui, perduodant vertes, tai yra pavojinga

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

Kodėl Kadangi 0 is falsy ir tt x || 11 results in 11 x || 11 results in 11 , o ne tiesiogiai perduodami į 0. Norėdami ištaisyti šią klaidą, kai kurie žmonės parašys išsamesnį čekį:

 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 

Dabar galime apsvarstyti gražią naudingą sintaksę, pridėtą kaip ES6 , kad galėtume užsakyti trūkstamų argumentų numatytąjį priskyrimą:

 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 funkcijos deklaracijoje yra daugiau kaip x !== undefined ? x : 11 x !== undefined ? x : 11 , nei daug labiau paplitusi idioma x || 11 x || 11

Numatytosios išraiškos

Function numatytosios vertės gali būti daugiau nei paprastos vertės, pvz., 31; jie gali būti bet kokia galiojanti išraiška, net 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 

Kaip matote, numatytosios išraiškos vertinamos tingiai, o tai reiškia, kad jie vykdomi tik tada, kai jie yra reikalingi, ty kai parametrų argumentas yra praleistas arba neapibrėžtas.

Numatytoji išraiška gali būti netgi (IIFE) įterptųjų funkcijų išraiška - paprastai vadinama išraiška su ryškia tiesiogine funkcija (IIFE) :

 function foo( x = (function(v){ return v + 11; })( 31 ) ) { console.log( x ); } foo(); // 42 
23
15 окт. Atsakyti atsižvelgiant į Thalaivar spalio 15 d 2016-10-15 20:58 '16 at 8:58 pm 2016-10-15 20:58

Šis sprendimas veikia man js:

 function read_file(file, delete_after) { delete_after = delete_after || false; // Code } 
10
16 нояб. atsakymas pateikiamas Takács Zsolt 16 nov. 2015-11-16 14:29 '15, 14:29 pm 2015-11-16 14:29

Tiesiog naudokite aiškų palyginimą su neapibrėžtais.

 function read_file(file, delete_after) { if(delete_after === undefined) { delete_after = false; } } 
9
16 нояб. Atsakymą pateikė Martin Wantke 16 lapkritis 2015-11-16 10:34 '15, 10:34, 2015-11-16 10:34

Kaip atnaujinimą ... su ECMAScript 6, galite visiškai nustatyti numatytasis reikšmes funkcijų parametrų deklaracijose taip:

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

Kaip minėta - http://es6-features.org/#DefaultParameterValues

7
06 окт. atsakymas, kurį pateikė zillaofthegods 06 spalis 2015-10-06 19:16 '15, 19:16, 2015-10-06 19:16

Labai rekomenduoju labai atsargiai, kai javascript naudojasi numatytomis parametro reikšmėmis. Jis dažnai sukelia klaidų, kai naudojamas kartu su aukštesnio lygio funkcijomis, pvz., „ forEach , map ir reduce . Pavyzdžiui, apsvarstykite šią kodo eilutę:

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

Pirmiau minėto fragmento vykdymas iliustruoja pavojus, susijusius su numatytųjų argumentų reikšmėmis nepanaudotiems parametrams.

7
16 окт. spalio 16 d. Doug Coburn atsakymas . 2017-10-16 01:36 '17 at 1:36 2017-10-16 01:36

buvęs C + + kūrėjas ilgą laiką (Rookie į interneto svetainių kūrimą :)), kai pirmą kartą susidūriau su šia situacija, parametrų priskyrimą funkcijai apibrėžti taip, kaip nurodyta klausime, taip.

 function myfunc(a,b=10) 

Tačiau būkite atsargūs, kad naršyklėse jis neveiktų nuosekliai. Mano darbalaukyje jis dirbo su chromu, tačiau „Android“ jis neveikė chromu. Saugesnis variantas, kaip daugelis pirmiau minėtų, yra

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

Šio atsakymo tikslas yra ne pakartoti tų pačių sprendimų, kaip minėta anksčiau, bet pranešti, kad parametrų priskyrimas funkcijos apibrėžimui gali veikti kai kuriose naršyklėse, bet ne pasikliauti.

7
19 мая '16 в 9:40 2016-05-19 09:40 atsakymas pateikiamas vivek 19 d., 16 val. 9:40 2016-05-19 09:40

Nesinaudodami „Microsoft Edge“ norinčiais dirbti su kodu, funkcijų parametruose nenaudokite numatytų verčių.

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

Šiame pavyzdyje „Edge“ sukurs klaidą „Laukia“) “

Norėdami naudotis šiuo naudojimu

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

2016 m. Rugpjūčio 8 d. Tai vis dar yra problema.

6
03 авг. Steven Johnston atsakymas 03 rug. 2016-08-03 17:49 '16 at 17:49 PM 2016-08-03 17:49

ES6: Kaip minėta daugelyje atsakymų, ES6 galite tiesiog inicijuoti parametrą kartu su verte.


ES5: Dauguma atsakymų man nepakanka, nes kartais gali tekti perduoti klaidingas vertes, pvz., 0 , null ir undefined funkciją. Norint nustatyti, ar parametras yra neapibrėžtas, nes tai, ką daviau vietoj neapibrėžtojo dėl to, kad jis visai nebuvo apibrėžtas, tai darau:

 function foo (param1, param2) { param1 = arguments.length >= 1 ? param1 : "default1"; param2 = arguments.length >= 2 ? param2 : "default2"; } 
3
12 авг. Angelo Polito atsakymas rugpjūčio 12 d 2018-08-12 08:26 '18 8:26 val. 2018-08-12 08:26
 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!!! 
3
08 июня '18 в 11:55 2018-06-08 11:55 atsakymas pateikiamas TinhNQ 08 birželio 18 d. 11:55 2018-06-08 11:55

Pagal sintaksę

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

Galite nustatyti numatytąją oficialių parametrų reikšmę. ir taip pat patikrinkite neapibrėžtą reikšmę naudojant tipo funkciją.

3
15 окт. atsakymas pateikiamas sachin kumar 15 oct. 2017-10-15 23:40 '17 at 11:40 2017-10-15 23:40

Šis pavyzdys buvo paimtas iš čia. 

2
01 июля '18 в 11:50 2018-07-01 11:50 atsakymas pateikiamas dutta 01 liepos 18 d. 11:50 2018-07-01 11:50

Jei naudojate ES6+ , galite nustatyti numatytuosius parametrus taip:

 function test(foo, bar) { foo = foo || 2; bar = bar || 0; console.log(foo, bar); } test(5); // foo gets overwritten, bar remains default parameter 

Pirmiau pateikta sintaksė naudojama OR operatoriui. OR operatorius visada grąžina pirmąją vertę, jei ji gali būti konvertuojama į true jei ji negrąžina dešinės pusės vertės. Kai funkcija vadinama be atitinkamo argumento, parametro kintamasis ( bar mūsų pavyzdyje) yra nustatytas kaip undefined JS mechanizmu. undefined tada konvertuojamas į klaidingą ir todėl OR operatorius grąžina vertę 0.

2
08 авг. Atsakymą pateikė Willem van der Veen 08 rug. 2018-08-08 18:48 '18, 18:48 pm 2018-08-08 18:48

Naudokite tai, jei norite naudoti naujausią ECMA6 sintaksę:

default function parameters .  Tai leidžia inicijuoti oficialius parametrus su numatytomis reikšmėmis, išskyrus atvejus, kai reikšmė perduodama arba neapibrėžta.  PASTABA .  Jis neveiks su „Internet Explorer“ ar senesnėmis naršyklėmis. 

Siekiant kuo geresnio suderinamumo, naudokite:

2
05 июля '18 в 14:54 2018-07-05 14:54 atsakymą pateikė „ BlackBeard“ liepos 5 d. 18 val. 14:54 2018-07-05 14:54

Jei dėl kokių nors priežasčių jūs nesate lodash čia naudojate „ lodash tai trumpas būdas numatyti funkcijų parametrus naudojant _.defaultTo metodą:

 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script> 

Kuri nustatys numatytąją vertę, jei dabartinė vertė yra NaN , nulinė arba neapibrėžta

1
10 окт. atsakymą pateikė Akrion spalio 10 d. 2018-10-10 10:04 '18, 10:04 am 2018-10-10 10:04

Taip, standartiniai parametrai yra visiškai palaikomi ES6 :

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

arba

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

bet prieš ES5 galite lengvai tai padaryti:

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

Tai reiškia, kad jei yra reikšmė, naudokite vertę, kitaip naudokite antrąją vertę po || operacija, kuri daro tą patį ...

Pastaba: taip pat yra didelis skirtumas tarp šių verčių, jei išlaikote vieną vertę ES6 , net jei ji yra klaidinga, kuri bus pakeista nauja verte, pvz., null arba "" bet tik viena ES5 bus pakeista, jei tik vertė bus perduota tiesa, nes kelias || darbe ...

1
18 янв. Atsakyti Alireza 18 Jan 2019-01-18 10:29 '19 , 10:29 val. 2019-01-18 10:29

Taip, tai vadinama numatytuoju nustatymu.

Numatytosios funkcijų parametrai leidžia inicijuoti oficialius parametrus su numatytomis reikšmėmis, jei reikšmė nėra apibrėžta arba neapibrėžta.

Sintaksė:

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

Aprašymas:

Funkciniai parametrai nėra apibrėžti pagal nutylėjimą. Tačiau situacijose gali būti naudinga nustatyti kitą numatytąją vertę. Tai gali padėti numatytuosius nustatymus.

Anksčiau bendra numatytų verčių nustatymo strategija buvo patikrinti funkcijų kūno parametrų reikšmes ir priskirti reikšmes, jei jos nėra apibrėžtos. Jei skambutyje nėra jokios vertės, jo vertė nebus nustatyta. Turėsite nustatyti sąlyginį patikrinimą, kad įsitikintumėte, jog parametras nėra apibrėžtas.

Esant numatytiesiems ES2015 parametrams, tikrinimas funkcijų korpuse nebėra reikalingas. Dabar galite paprasčiausiai įdėti numatytąją vertę į funkciją.

Skirtumų pavyzdys:

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

Įvairūs sintaksės pavyzdžiai:

Kitų netikrų verčių neapibrėžtų verčių užpildymas:

Net jei reikšmė yra aiškiai nurodyta, kai naudojama, num argumento reikšmė yra numatytoji vertė.

 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) 

Įvertintas pokalbio metu:

Numatytasis argumentas vertinamas pokalbio metu, todėl, skirtingai nuo kitų kalbų, kiekvieną kartą, kai vadinama funkcija, sukuriamas naujas objektas.

 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 

Numatytosios parinktys galimos vėlesnėms numatytoms parinktims:

Parametrai, kurie jau yra nustatyti, yra galimi vėliau.

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

Funkcijų korpuse apibrėžtos funkcijos:

Pateikta Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Funkcinėje įstaigoje deklaruotos funkcijos negali būti perduodamos numatytųjų parametrų viduje ir išmesti ReferenceError (šiuo metu „TypeError“ SpiderMonkey, žr. Klaidą 1022967). Numatytieji parametrai visada vykdomi pirmiausia, po to įvertinamos funkcijų deklaracijos funkcijos kūno viduje.

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

Parametrai be numatytųjų parametrų pagal nutylėjimą:

Prieš „Gecko 26“ („Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2“), sekantis kodas davė „SyntaxError“. Tai buvo nustatyta klaidoje 777060 ir veikia kaip tikėtasi vėlesnėse versijose. Parametrai vis dar paliekami į dešinę, perrašant numatytuosius parametrus, net jei yra naujesnių parametrų be numatytųjų reikšmių.

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

Nestruktūrizuotas parametras su numatytųjų reikšmių priskyrimu:

Numatytąjį reikšmės priskyrimą galite naudoti naudodami destrukcijos priskyrimo žymėjimą

 function f([x, y] = [1, 2], {z: z} = {z: 3}) { return x + y + z; } f(); // 6 
0
27 сент. esewalson atsakymas 27 sep . 2018-09-27 19:56 '18, 07:56 pm 2018-09-27 19:56
 def read_file(file, delete_after = false) # code end 

Tokiu atveju gali būti naudojamas šis kodas, įskaitant ECMAScript 6 (ES6) ir ankstesnes versijas.

Taip, jis veiks „javascript“. Taip pat galite tai padaryti:

 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 
-2
19 июля '16 в 14:59 2016-07-19 14:59 Atsakymą pateikė Muhammad Awais, liepos 16, 16, 14:59 2016-07-19 14:59