1. ฟังก์ชั่น:
ตัวดำเนินการ typeof ส่งคืนสตริงที่แสดงถึงประเภทข้อมูลของนิพจน์
สตริงที่เป็นไปได้คือ: "หมายเลข", "สตริง", "บูลีน", "วัตถุ", "ฟังก์ชั่น" และ "ไม่ได้กำหนด"
2. คำอธิบายของค่าส่งคืนที่ใช้กันทั่วไป
| การแสดงออก | ค่าส่งคืน |
| typeof undefined | 'ไม่ได้กำหนด' |
| typeof null | 'วัตถุ' |
| ประเภทของจริง | 'บูลีน' |
| Typeof 123 | 'ตัวเลข' |
| typeof "abc" | 'สตริง' |
| typeof function () {} | 'การทำงาน' |
| typeof {} | 'วัตถุ' |
| typeof [] | 'วัตถุ' |
| ประเภทของ varnownvariable | 'ไม่ได้กำหนด' |
หมายเหตุ: ค่าการส่งคืนของประเภทคือสตริงทั้งหมดและเป็นส่วนหัวของตัวพิมพ์เล็กทั้งหมด
3. แอปพลิเคชันปกติ:
1). ตรวจสอบว่าตัวแปรมีอยู่หรือไม่และมีค่า
TypeOf จะส่งคืน "undefined" ในสองกรณี: เมื่อไม่มีการประกาศตัวแปรและเมื่อค่าของตัวแปรไม่ได้กำหนด ตัวอย่างเช่น:
> typeof undeclaredVariable === "ไม่ได้กำหนด" จริง
> var ประกาศ variable;
> typeof ที่ประกาศว่า 'ไม่ได้กำหนด'
> typeof undefined 'undefined'
มีวิธีอื่นในการตรวจสอบว่าค่าไม่ได้กำหนด:
> ค่า var = ไม่ได้กำหนด;
> value === ไม่ได้กำหนดจริง
อย่างไรก็ตามหากวิธีนี้ใช้กับตัวแปรที่ไม่ได้ประกาศข้อยกเว้นจะถูกโยนทิ้งเพราะเฉพาะ typeof เท่านั้นที่สามารถตรวจจับตัวแปรที่ไม่ได้ประกาศได้ตามปกติโดยไม่ต้องรายงานข้อผิดพลาด:
> undeclaredVariable === อ้างอิงที่ไม่ได้กำหนด: undeclaredVariable ไม่ได้กำหนดไว้
หมายเหตุ: ตัวแปรที่ไม่ได้กำหนดค่าพารามิเตอร์ที่เป็นทางการที่ไม่ได้ส่งผ่านในพารามิเตอร์และคุณสมบัติที่ไม่มีอยู่จริงจะไม่มีปัญหาข้างต้นเพราะพวกเขาสามารถเข้าถึงได้เสมอและค่ามักไม่ได้กำหนดไว้เสมอ:
> var ประกาศ variable;
> DecraredVariable === ไม่ได้กำหนดไว้จริง
> (ฟังก์ชั่น (x) {return x === undefined} ()) จริง
> ({}). foo === จริงไม่ได้กำหนด
หมายเหตุ: ดังนั้นถ้า (window.maybeundeclaredVariable) {}
คำถาม: typeof ดูเหมือนซับซ้อนเมื่อทำงานให้เสร็จ
วิธีแก้ปัญหา: การดำเนินการแบบนี้ไม่ได้เป็นเรื่องธรรมดาดังนั้นบางคนคิดว่าไม่จำเป็นต้องหาทางออกที่ดีกว่า อย่างไรก็ตามบางคนอาจเสนอผู้ให้บริการพิเศษ:
> กำหนด undeclaredvariable false
> var ประกาศ variable;
> กำหนดการประกาศเท็จที่กำหนดไว้
หรืออาจมีใครบางคนต้องการผู้ประกอบการที่ตรวจพบว่ามีการประกาศตัวแปรหรือไม่:
> ประกาศเท็จที่ไม่ได้ประกาศ
> var ประกาศ variable;
> ประกาศประกาศว่าเป็นจริง
หมายเหตุของนักแปล: ใน Perl ตัวดำเนินการที่กำหนดไว้ด้านบนเทียบเท่ากับที่กำหนด () และตัวดำเนินการที่ประกาศไว้ข้างต้นเทียบเท่ากับมีอยู่ ()
2. พิจารณาว่าค่าไม่เท่ากับที่ไม่ได้กำหนดและไม่เท่ากับ NULL
คำถาม: หากคุณต้องการตรวจพบว่ามีการกำหนดค่า (ค่าไม่ได้ไม่ได้กำหนดหรือเป็นโมฆะ) คุณจะได้พบกับการแสดงออกที่แปลกประหลาดของ typeof (ซึ่งถือว่าเป็นข้อผิดพลาด): typeof null ส่งคืน "วัตถุ"::
> typeof null 'วัตถุ'
หมายเหตุ: สิ่งนี้สามารถกล่าวได้ว่าเป็นข้อผิดพลาดในการใช้งาน JavaScript ดั้งเดิมและมาตรฐานได้มาตรฐานแล้ว V8 เมื่อได้รับการแก้ไขและใช้งาน typeof null === "null" แต่ในที่สุดก็พิสูจน์ได้ว่าไม่สามารถทำได้ http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null
วิธีแก้ปัญหา: อย่าใช้ typeof เพื่อทำงานนี้ให้ใช้วิธีการต่อไปนี้แทน: อย่างไรก็ตามตัวแปร x ต้องประกาศล่วงหน้ามิฉะนั้นจะมีการรายงานข้อผิดพลาด
ฟังก์ชั่น isDefined (x) {return x! == null && x! == undefined; -
ความเป็นไปได้อีกประการหนึ่งคือการแนะนำ "ตัวดำเนินการค่าเริ่มต้น" หากไม่ได้กำหนด myValue นิพจน์ต่อไปนี้จะส่งคืนค่าเริ่มต้น Value:
myValue || defaultValue
นิพจน์ข้างต้นเทียบเท่ากับ:
(myValue! == undefined && myValue! == null)? myValue: defaultValue
ในความเป็นจริงมันเป็นการทำให้เข้าใจง่ายของข้อความต่อไปนี้:
myValue = myValue || defaultValue
3. แยกแยะระหว่างค่าวัตถุและค่าดั้งเดิม
ฟังก์ชั่นต่อไปนี้ใช้เพื่อตรวจสอบว่า X เป็นค่าวัตถุหรือไม่:
ฟังก์ชั่น isobject (x) {return (typeof x === "ฟังก์ชั่น" || (typeof x === "Object" && x! == null)); -
ปัญหา: การตรวจจับข้างต้นมีความซับซ้อนมากขึ้นเนื่องจากประเภทของฟังก์ชั่นและวัตถุเป็นประเภทที่แตกต่างกันและ typeof null ส่งคืน "วัตถุ"
วิธีแก้ปัญหา: วิธีการต่อไปนี้มักจะใช้ในการตรวจจับค่าวัตถุ:
ฟังก์ชั่น isobject2 (x) {return x === วัตถุ (x); -
คำเตือน: คุณอาจคิดว่าอินสแตนซ์ของวัตถุสามารถใช้ในการตรวจจับได้ที่นี่ แต่อินสแตนซ์ใช้เพื่อตัดสินความสัมพันธ์อินสแตนซ์โดยใช้ต้นแบบโดยใช้วัตถุ ดังนั้นฉันควรทำอย่างไรถ้าวัตถุที่ไม่มีต้นแบบ:
> var obj = object.create (null);
> object.getPrototypeof (obj) null
OBJ เป็นวัตถุจริง ๆ แต่ไม่ใช่ตัวอย่างของค่าใด ๆ :
> typeof obj 'วัตถุ'
> OBJ อินสแตนซ์ของวัตถุเท็จ
ในทางปฏิบัติคุณอาจไม่ค่อยพบวัตถุดังกล่าว แต่มันมีอยู่และมีวัตถุประสงค์
หมายเหตุของนักแปล: Object.prototype เป็นวัตถุที่มีอยู่โดยค่าเริ่มต้นและไม่มีต้นแบบ
> object.getPrototypeof (object.prototype) null
> typeof object.prototype 'วัตถุ'
> object.prototype อินสแตนซ์ Object False
4. ค่าดั้งเดิมประเภทอะไร?
typeof เป็นวิธีที่ดีที่สุดในการดูประเภทของค่าดั้งเดิมที่แน่นอน
> typeof "abc" 'สตริง'
> typeof undefined 'undefined'
คำถาม: คุณต้องรู้พฤติกรรมแปลก ๆ ของ typeof null
> typeof null // ระวัง! 'วัตถุ'
วิธีแก้ปัญหา: ฟังก์ชั่นต่อไปนี้สามารถแก้ไขปัญหานี้ได้ (สำหรับกรณีการใช้งานนี้เท่านั้น)
ฟังก์ชั่น getPrimItiVetyPename (x) {
var typename = typeof x;
สวิตช์ (typename) {
กรณี "undefined": case "boolean": case "number": case "string": return typename;
กรณี "วัตถุ": ถ้า (x === null) {return "null"; -
ค่าเริ่มต้น: // การตัดสินก่อนหน้านี้ล้มเหลวในการส่ง Throw TypeError ใหม่ ("พารามิเตอร์ไม่ใช่ค่าดั้งเดิม:"+x);
-
ทางออกที่ดีกว่า: ใช้ฟังก์ชัน getTypename () ซึ่งไม่เพียง แต่สามารถส่งคืนประเภทของค่าดั้งเดิม แต่ยังส่งคืนแอตทริบิวต์ [[คลาส]] ภายในของค่าวัตถุ ที่นี่เราพูดถึงวิธีการใช้ฟังก์ชั่นนี้ (หมายเหตุของนักแปล: $. type ใน jQuery คือการใช้งานเช่นนี้)
5. ไม่ว่าค่าจะเป็นฟังก์ชัน
typeof สามารถใช้เพื่อตรวจจับว่าค่าเป็นฟังก์ชันหรือไม่
> typeof function () {} 'ฟังก์ชั่น'
> typeof object.prototype.toString 'ฟังก์ชั่น'
โดยหลักการแล้วฟังก์ชั่นอินสแตนซ์ของการตรวจจับความต้องการประเภทนี้ เมื่อมองแวบแรกดูเหมือนว่าการเขียนนั้นสง่างามกว่า อย่างไรก็ตามเบราว์เซอร์มีการเล่นโวหาร: แต่ละเฟรมเวิร์กและหน้าต่างมีตัวแปรทั่วโลกของตัวเอง ดังนั้นหากคุณผ่านวัตถุในกรอบบางอย่างไปยังเฟรมเวิร์กอื่นอินสแตนซ์ของไม่ทำงานอย่างถูกต้องเพราะทั้งสองเฟรมเวิร์กมีตัวสร้างที่แตกต่างกัน นี่คือเหตุผลว่าทำไมจึงมีเมธอด array.isarray () ใน ecmascript5 มันจะดีถ้ามีวิธีการที่ข้ามเฟรมเวิร์กเพื่อตรวจสอบว่าวัตถุเป็นอินสแตนซ์ของตัวสร้างที่กำหนดหรือไม่ getTypename ข้างต้น () เป็นวิธีแก้ปัญหา แต่อาจมีวิธีแก้ปัญหาพื้นฐานมากขึ้น
6. ภาพรวม
สิ่งต่อไปนี้ควรเป็นความต้องการเร่งด่วนที่สุดใน JavaScript ในปัจจุบันและสามารถแทนที่คุณสมบัติการทำงานบางอย่างของความรับผิดชอบในปัจจุบันของ typeof:
isDefined () (เช่น object.isdefined ()): สามารถใช้เป็นฟังก์ชันหรือผู้ดำเนินการ
isobject ()
getTypename ()
กลไกที่สามารถตรวจจับได้ว่าวัตถุเป็นตัวอย่างของตัวสร้างที่ระบุข้ามเฟรมเวิร์ก
เพื่อตรวจสอบว่ามีการประกาศตัวแปรสำหรับข้อกำหนดดังกล่าวหรือไม่อาจไม่จำเป็นต้องมีผู้ให้บริการของตัวเอง
บทสรุปข้างต้นของการใช้งานประเภทใน JS คือเนื้อหาทั้งหมดที่ใช้ร่วมกันโดยบรรณาธิการ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น