ข้อมูลพื้นฐานเกี่ยวกับ
คุณอาจไม่รู้ แต่ใน JavaScript เมื่อใดก็ตามที่เราโต้ตอบกับสตริงตัวเลขหรือบูลีนดั้งเดิมเราจะเข้าสู่โลกที่ซ่อนอยู่ของเงาวัตถุและการบีบบังคับ
สตริงตัวเลขบูลีนโมฆะไม่ได้กำหนดและสัญลักษณ์
ใน JavaScript มี 7 ชนิดดั้งเดิม: undefined
, null
, boolean
, string
, number
, และbigint
symbol
ทุกสิ่งทุกอย่างเป็นวัตถุ ประเภทดั้งเดิมboolean
, string
และnumber
สามารถห่อโดยคู่ของวัตถุของพวกเขา วัตถุเหล่านี้เป็นกรณีของBoolean
, String
และNumber
ก่อสร้างตามลำดับ
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
ถ้า primitives ไม่มีคุณสมบัติเหตุใดจึง"this is a string".length
ส่งคืนค่า
เนื่องจาก JavaScript จะบังคับระหว่างสิ่งดั้งเดิมและวัตถุได้อย่างง่ายดาย ในกรณีนี้ค่าสตริงจะถูกบังคับให้กับอ็อบเจ็กต์สตริงเพื่อเข้าถึงความยาวคุณสมบัติ สตริงออบเจ็กต์ใช้เพียงเสี้ยววินาทีหลังจากนั้นจะถูกสังเวยให้กับเทพเจ้าแห่งการเก็บขยะ - แต่ด้วยจิตวิญญาณของรายการค้นพบทางทีวีเราจะดักจับสิ่งมีชีวิตที่เข้าใจยากและเก็บรักษาไว้เพื่อการวิเคราะห์ต่อไป ...
เพื่อสาธิตสิ่งนี้เพิ่มเติมให้พิจารณาตัวอย่างต่อไปนี้ซึ่งเรากำลังเพิ่มคุณสมบัติใหม่ให้กับต้นแบบตัวสร้างสตริง
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
โดยวิธีนี้ดั้งเดิมสามารถเข้าถึงคุณสมบัติทั้งหมด (รวมถึงวิธีการ) ที่กำหนดโดยตัวสร้างอ็อบเจ็กต์ตามลำดับ
ดังนั้นเราจึงเห็นว่าประเภทดั้งเดิมจะบังคับให้เข้ากับ Object ตามลำดับได้อย่างเหมาะสมเมื่อจำเป็น
การวิเคราะห์toString()
วิธีการ
พิจารณารหัสต่อไปนี้
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
ดังที่ได้กล่าวไว้ข้างต้นสิ่งที่เกิดขึ้นจริง ๆ คือเมื่อเราเรียกtoString()
method ในประเภทดั้งเดิมมันจะต้องถูกบีบบังคับให้อยู่ในวัตถุคู่กันก่อนจึงจะสามารถเรียกใช้เมธอดได้
นั่นmyNumber.toString()
คือเทียบเท่าNumber.prototype.toString.call(myNumber)
และในทำนองเดียวกันสำหรับประเภทดั้งเดิมอื่น ๆ
แต่จะเกิดอะไรขึ้นถ้าแทนที่จะส่งผ่านประเภทดั้งเดิมไปยังtoString()
เมธอดของฟังก์ชันตัวสร้างวัตถุที่สอดคล้องกันเราบังคับให้ประเภทดั้งเดิมถูกส่งผ่านเป็นพารามิเตอร์ไปยังtoString()
เมธอดของ Object function constructor ( Object.prototype.toString.call(x)
)?
ดู Object.prototype.toString () อย่างใกล้ชิด
ตามเอกสารประกอบเมื่อเรียกเมธอด toString จะดำเนินการตามขั้นตอนต่อไปนี้:
- หาก
this
ค่าตอบแทนundefined
"[object Undefined]"
- หาก
this
ค่าตอบแทนnull
"[object Null]"
- ถ้าค่านี้ไม่ใช่ค่าข้างต้นให้
O
เป็นผลลัพธ์ของการเรียกtoObject
ส่งthis
ค่าเป็นอาร์กิวเมนต์
- ให้คลาสเป็นค่าของ
[[Class]]
คุณสมบัติภายในของO
.
- ส่งกลับค่าสตริงที่เป็นผลมาจากการเชื่อมโยงสามสาย
"[object "
, และclass
"]"
ทำความเข้าใจสิ่งนี้จากตัวอย่างต่อไปนี้
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
อ้างอิง:
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010 / 27/09 / ที่ลับในชีวิตของจาวาสคริปต์-พื้นฐาน /