Javascript มี "เทคนิค" มากมายเกี่ยวกับประเภทและประเภทการแปลงดังนั้นฉันจึงสงสัยว่า 2 วิธีนี้เหมือนกันหรือมีบางกรณีที่ทำให้แตกต่างกันหรือไม่?
Javascript มี "เทคนิค" มากมายเกี่ยวกับประเภทและประเภทการแปลงดังนั้นฉันจึงสงสัยว่า 2 วิธีนี้เหมือนกันหรือมีบางกรณีที่ทำให้แตกต่างกันหรือไม่?
คำตอบ:
พวกเขาไม่เหมือนกันโดยสิ้นเชิงและจริงๆแล้วตัวสร้างสตริงที่เรียกว่าเป็นฟังก์ชัน (ตัวอย่างแรกของคุณ) จะเรียกใช้toStringเมธอดของวัตถุที่ส่งผ่านในตอนท้ายเช่น:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
ในทางกลับกันหากตัวระบุอ้างถึงnullหรือundefinedคุณไม่สามารถใช้toStringวิธีนี้ได้จะให้TypeErrorข้อยกเว้นแก่คุณ:
var value = null;
String(null); // "null"
value.toString(); // TypeError
ตัวStringสร้างที่เรียกว่าเป็นฟังก์ชันจะเทียบเท่ากับ:
value + '';
กฎการแปลงประเภทจากObject -to- Primitiveมีรายละเอียดอธิบายไว้ในข้อกำหนดการ[[DefaultValue]]ดำเนินการภายใน
สรุปโดยย่อเมื่อทำการแปลงจากObject -to- Stringให้ทำตามขั้นตอนต่อไปนี้:
toStringวิธีการ
resultเป็นแบบดั้งเดิมให้กลับresultไปที่ขั้นตอนที่ 2valueOfวิธีการ
resultเป็นแบบดั้งเดิมให้กลับresultไปที่ขั้นตอนที่ 3TypeErrorโยนด้วยกฎข้างต้นเราสามารถสร้างตัวอย่างของความหมายที่เกี่ยวข้อง:
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับกลไกนี้ฉันขอแนะนำให้ดูToPrimitiveและการToStringทำงานภายใน
ฉันขอแนะนำให้อ่านบทความนี้:
new String({toString: null})พ่นกTypeError.
String()และ+ ''ตอนนี้มีความแตกต่างที่สำคัญพอสมควร String(Symbol())จะทำงาน แต่Symbol() + ''จะเกิดข้อผิดพลาด (และ Symbol () จะส่งผ่านตัวป้องกันที่ผิดพลาดซึ่งแตกต่างจาก null และไม่ได้กำหนดดังนั้นx && (x + '')ตอนนี้สามารถโยนได้)
value.toString()จะทำให้เกิดข้อผิดพลาดหากvalueเป็นโมฆะหรือไม่ได้กำหนด String(value)ไม่ควร.
ตัวอย่างเช่น:
var value = null;
alert(value.toString());
value == nullจะล้มเหลวเนื่องจาก
var value = null;
alert(String(value));
ควรแสดงข้อความที่อ่านว่า "null" (หรือคล้ายกัน) แต่จะไม่ผิดพลาด
String(value)ควรจะมีผลเช่นเดียวกับvalue.toString()ในทุกกรณียกเว้นค่าโดยไม่ต้องคุณสมบัติเหมือนหรือnull จะให้ผลลัพธ์เดียวกันundefined''+value
String () [การเรียกตัวสร้าง ] โดยทั่วไปเรียก. toString ()
.toString ()และString ()สามารถเรียกใช้กับค่าดั้งเดิม (จำนวนบูลีนสตริง) และโดยทั่วไปจะไม่ทำอะไรเป็นพิเศษ:
true => 'จริง'
เท็จ => 'เท็จ'
17 => '17'
'hello' => 'สวัสดี'
แต่การเรียกใช้ฟังก์ชันเหล่านี้บนวัตถุคือสิ่งที่น่าสนใจ:
หากวัตถุมีฟังก์ชัน. toString () เป็นของตัวเองมันจะถูกเรียกใช้เมื่อคุณต้องการให้วัตถุนี้ถือว่าเป็นสตริง (อย่างชัดเจน / โดยปริยาย)
let obj = {
myName:"some object",
toString:function(){ return this.myName; }
}
//implicitly treating this obj as a string
"hello " + obj; //"hello some object"
//OR (explicitly)
"hello " + String(obj) //calling the existent toString function
//OR
"hello " + obj.toString(); //calling toString directly
อย่างไรก็ตามหากคุณต้องการให้วัตถุนี้เป็นตัวเลขก็ควรมีฟังก์ชัน. valueOf () ที่กำหนดไว้
จะเป็นอย่างไรถ้าเรามีทั้งสองอย่างในวัตถุเดียว?
ถ้าเราต้องการรักษาวัตถุนี้เป็นสตริง => ใช้. toString ()
ถ้าเราต้องการรักษาวัตถุนี้เป็นตัวเลข => ใช้. valueOf ()
จะเกิดอะไรขึ้นถ้าเรามีเพียง . valueOf ()กำหนดไว้?
.valueOf () ที่กำหนดไว้ภายในวัตถุจะถูกเรียกว่าเราต้องการจัดการวัตถุเป็นสตริงหรือเป็นตัวเลข
new String(value)ในค่าใด ๆ ค่านั้นจะส่งคืนวัตถุสตริง