มีสองวิธี ณ ES2015
วัตถุนี้ถูกสร้างขึ้นในฟังก์ชั่นและมันหมายถึงข้อโต้แย้งของฟังก์ชั่นที่เหมาะสม มันไม่ได้เป็นอาเรย์ในทางเทคนิคดังนั้นการทำงานของอาเรย์ทั่วไปจึงไม่สามารถใช้งานได้ วิธีที่แนะนำคือการใช้Array.from
หรือผู้ประกอบการแพร่กระจายเพื่อสร้างอาร์เรย์จากมัน
ผมเคยเห็นคำตอบอื่น ๆ slice
พูดถึงการใช้ อย่าทำอย่างนั้น จะป้องกันการเพิ่มประสิทธิภาพ (ที่มา: MDN )
Array.from(arguments)
[...arguments]
อย่างไรก็ตามฉันจะเถียงว่าarguments
เป็นปัญหาเพราะมันซ่อนสิ่งที่ฟังก์ชั่นยอมรับว่าเป็นอินพุต arguments
ฟังก์ชั่นมักจะเขียนเช่นนี้
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
บางครั้งส่วนหัวของฟังก์ชั่นจะถูกเขียนเหมือนดังต่อไปนี้เพื่อบันทึกอาร์กิวเมนต์ในรูปแบบ C-like
function mean(/* ... */){ ... }
แต่นั่นหายาก
สำหรับสาเหตุที่เป็นปัญหาให้ยกตัวอย่างเช่น C C ย้อนหลังเข้ากันได้กับภาษา pre-ANSI โบราณของภาษาที่รู้จักกันในชื่อ K&R C. K&R C ช่วยให้ต้นแบบฟังก์ชั่นมีรายการอาร์กิวเมนต์ที่ว่างเปล่า
int myFunction();
/* This function accepts unspecified parameters */
ANSI C จัดให้มีสิ่งอำนวยความสะดวกสำหรับvarargs
( ...
) และvoid
เพื่อระบุรายการอาร์กิวเมนต์ว่าง
int myFunction(void);
/* This function accepts no parameters */
หลายคนประกาศฟังก์ชั่นโดยไม่ตั้งใจด้วยunspecified
รายการอาร์กิวเมนต์ ( int myfunction();
) เมื่อพวกเขาคาดหวังว่าฟังก์ชั่นจะใช้อาร์กิวเมนต์เป็นศูนย์ นี่เป็นข้อผิดพลาดทางเทคนิคเพราะฟังก์ชันจะยอมรับอาร์กิวเมนต์ ไม่ จำกัด จำนวน
varargs
ฟังก์ชั่นที่เหมาะสมใน C ใช้แบบฟอร์ม:
int myFunction(int nargs, ...);
และจาวาสคริปต์ก็มีบางสิ่งที่คล้ายกันกับเรื่องนี้
ฉันได้แสดงโอเปอเรเตอร์การแพร่กระจายให้คุณแล้ว
...name
มันค่อนข้างหลากหลายและยังสามารถใช้ในรายการอาร์กิวเมนต์ของฟังก์ชัน ("พารามิเตอร์ที่เหลือ") เพื่อระบุ varargs ในรูปแบบที่บันทึกไว้เป็นอย่างดี:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
หรือเป็นการแสดงออกของแลมบ์ดา:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
ฉันชอบผู้ดำเนินการแพร่กระจายมาก มันสะอาดและจัดทำเอกสารด้วยตนเอง
for - in
วนซ้ำกับarguments
วัตถุ -length
ควรใช้'การวนซ้ำ' แบบวนซ้ำทั่วคุณสมบัติแทน