ใช่สิ่งนี้เรียกว่าพารามิเตอร์เริ่มต้น
พารามิเตอร์ฟังก์ชั่นเริ่มต้นอนุญาตให้พารามิเตอร์อย่างเป็นทางการที่จะเริ่มต้นด้วยค่าเริ่มต้นหากไม่มีค่าหรือไม่ได้กำหนดจะถูกส่งผ่าน
ไวยากรณ์:
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 (ปัจจุบัน TypeError ใน SpiderMonkey ดูข้อผิดพลาด 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
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }
จากนั้นคุณสามารถเรียกมันว่าa = defaultFor(a, 42);