ในระหว่างกระบวนการเขียนโปรแกรม JavaScript JS จะแปลงวัตถุเป็นหมายเลขหรือสตริงโดยอัตโนมัติแล้วประมวลผลตามบริบทที่แตกต่างกัน กฎสำหรับการแปลงอัตโนมัตินี้มีดังนี้:
กฎสำหรับการแปลงวัตถุเป็นสตริงโดยอัตโนมัติ:
1. หากวัตถุเป็นของชั้นเรียนแทนที่วิธี ToString () วิธีการจะเรียกว่า หากผลการส่งคืนของการโทร TOSTRING () เป็นแบบดั้งเดิม (สตริง, ตัวเลข, บูลีน, ไม่ได้กำหนด, โมฆะ) ค่าดั้งเดิมจะถูกแปลงเป็นสตริงและส่งคืน
2. หากวิธี ToString () ไม่ได้ถูกแทนที่ด้วยคลาส toString () ผลการส่งคืนของการเรียก toString () คือ "[วัตถุวัตถุ]"; หรือวิธี ToString () ถูกแทนที่ แต่วิธีการส่งคืนผลลัพธ์เป็นวัตถุ จากนั้น JS จะเรียกวิธีการของวัตถุ () หากผลการส่งคืนของค่าของการเรียกค่า () เป็นแบบดั้งเดิม (สตริง, ตัวเลข, บูลีน, ไม่ได้กำหนด, null) จากนั้นแปลงค่าดั้งเดิมเป็นสตริงและผลตอบแทน
3. หากไม่ตรงกับคะแนนข้างต้นและไม่สามารถรับค่าดั้งเดิมได้โดยการเรียกวิธีการ toString () ของวัตถุหรือค่าของค่า () แล้ว JS จะโยนข้อผิดพลาด typeError
กฎสำหรับการแปลงวัตถุโดยอัตโนมัติเป็นหมายเลข:
1. เรียกใช้วิธีการ () ของวัตถุ หากได้รับค่าดั้งเดิมให้แปลงค่าดั้งเดิมเป็นจำนวนและส่งคืน
2. หากไม่สามารถรับค่าดั้งเดิมได้จากวิธีการ Valueof () ให้เรียกใช้วิธี ToString () ของวัตถุ หาก toString () ส่งคืนค่าดั้งเดิมให้แปลงค่าดั้งเดิมเป็นจำนวนและส่งคืน
3. หากไม่สามารถพบจุดสองจุดข้างต้นได้ JS จะโยนข้อผิดพลาด typeerror
จะเห็นได้ว่ากฎสำหรับการแปลงวัตถุโดยอัตโนมัติเป็นสตริงและวัตถุเป็นหมายเลขจริง ความแตกต่างคือลำดับของวิธีการโทร TOSTRING () และวิธีการ ()
ตามกฎข้างต้นผลการแปลงบางอย่างสามารถเข้าใจได้ดี:
1. สำหรับอาร์เรย์ที่ว่างเปล่าเมื่อแปลงเป็นหมายเลขผลลัพธ์คือ 0 นี่เป็นเพราะวิธีการของค่าอาร์เรย์ () จะถูกเรียกก่อน เนื่องจาก ValueOf () ส่งคืนวัตถุอาร์เรย์เอง JS จะเรียกใช้วิธี TOSTRING () ของอาร์เรย์ว่างเปล่า เนื่องจากผลลัพธ์ของอาร์เรย์ที่ว่างเปล่า toString () กลับไปที่สตริงว่างสตริงที่ว่างเปล่าในที่สุดจะถูกแปลงเป็นหมายเลข 0 และส่งคืน
2. สำหรับอาร์เรย์ที่มีสมาชิกหมายเลขหนึ่งใช้กฎเดียวกันเพื่อแปลงเป็นตัวเลขและผลลัพธ์สุดท้ายคือหมายเลข
3. สำหรับอาร์เรย์ที่มีสมาชิกตัวเลขหลายตัวเนื่องจากสตริงไม่สามารถแปลงเป็นตัวเลขได้ผลลัพธ์สุดท้ายคือ NAN
เมื่อใดที่จะแปลงเป็นสตริง? เมื่อใดที่จะแปลงเป็นหมายเลข?
เมื่อทำการแปลงประเภทอัตโนมัติบนวัตถุ JS จะเลือกที่จะแปลงเป็นสตริงหรือตัวเลขขึ้นอยู่กับประเภทของวัตถุและตัวดำเนินการ กฎเฉพาะมีดังนี้:
1. หากวัตถุปรากฏขึ้นทั้งสองด้านของตัวดำเนินการ + ให้แปลงวัตถุเป็นสตริง
2. วัตถุทั้งหมด (ยกเว้นวัตถุวันที่) จะถูกแปลงเป็นหมายเลขก่อน
3. สำหรับวัตถุวันที่ลำดับความสำคัญจะถูกแปลงเป็นสตริง
เป็นที่น่าสังเกตว่าสำหรับตัวดำเนินการ + ยกเว้นกรณีที่วัตถุหรือสตริงปรากฏขึ้นทั้งสองด้านของผู้ปฏิบัติงานการดำเนินการของ "แปลงเป็นหมายเลข" จะดำเนินการในกรณีอื่น ๆ ในเวลาเดียวกันการดำเนินการนี้ยังเกี่ยวข้องกับลำดับระหว่างค่า
การทดลอง
การคัดลอกรหัสมีดังนี้:
console.log (3 * []); // 0
console.log (3 * [2]); // 6
console.log (3 * [1,2]); // nan
console.log (3 + [2]); // 32
var now = new Date ();
console.log (ตอนนี้ + 1); // แต่งงาน 26 มี.ค. 2014 10:51:39 GMT + 0800 (CST) 1
console.log (ตอนนี้ - 1); // 1395802299223
console.log (ตอนนี้ * 2); // 2791604598448
console.log (true + true); // 2
console.log (2 + null); // 2, null ถูกแปลงเป็น 0
console.log (2 + undefined); // nan, undefined จะถูกแปลงเป็น nan
console.log (1 + 2 + "แมว"); // 3 แมว
console.log (1 + (2 + "แมว")); // 12 แมว