โยนข้อผิดพลาด ('msg') เทียบกับโยนข้อผิดพลาดใหม่ ('msg')


165
var err1 = Error('message');
var err2 = new Error('message');

ความแตกต่างคืออะไร? มองไปที่พวกเขาในคอนโซลโครเมี่ยมพวกเขามีลักษณะเหมือนกัน คุณสมบัติเดียวกันบนวัตถุและ__proto__สายโซ่เดียวกัน ดูเหมือนว่าErrorจะเป็นเหมือนโรงงาน

อันไหนถูกต้องและทำไม


5
ทั้งหมดก่อสร้างพื้นเมืองที่กำหนดไว้ใน ECMAScript newรวมทั้งพฤติกรรมของตนเมื่อเรียกโดยไม่ได้
ฉันเกลียด Lazy

คำตอบ:


164

ทั้งคู่ก็โอเค นี่คือการระบุไว้อย่างชัดเจนในข้อกำหนด :

... ดังนั้นการเรียกฟังก์ชันError(…)นั้นเทียบเท่ากับนิพจน์การสร้างวัตถุnew Error(…)ด้วยอาร์กิวเมนต์เดียวกัน


7
สิ่งนี้เป็นจริงใน ES6 เช่นกัน?
paulmelnikow

4
ใช่. สำหรับเอกสารปัจจุบันโปรดดูที่: ecma-international.org/ecma-262/6.0/…
theUtherSide

@paulmelnikow - ใช่ ความเข้ากันได้ย้อนหลังเป็นลำดับความสำคัญสูงสุดของ TC39 มนต์คือ "อย่าทำลายเว็บ"
TJ Crowder

17

Errorไม่ทำหน้าที่เหมือนโรงงานเช่นการก่อสร้างพื้นเมืองอื่น ๆ : Array, Objectฯลฯ if (!(this instanceof Array)) { return new Array(arguments); }สิ่งที่ตรวจสอบทั้งหมดเช่น (แต่โปรดทราบว่าString(x)และnew String(x)แตกต่างกันมากและเช่นเดียวกันกับNumberและBoolean)

ที่กล่าวว่าในกรณีที่มีข้อผิดพลาดไม่จำเป็นต้องโยนErrorวัตถุ ... ใช้throw 'Bad things happened';งานได้เช่นกัน
คุณสามารถโยนวัตถุตามตัวอักษรเพื่อการดีบั๊ก:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};

9
ฉันเกรงว่าฉันจะไม่เห็นด้วยอย่างเต็มที่ String("abc")ไม่ได้สร้างStringวัตถุในขณะที่new String("abc")ทำ
pimvdb

2
@pimvdb: ความจริงผมได้เปลี่ยนไปObject=> Object('foo')ผลตอบแทนวัตถุสตริง ... มาถึงสิ่งที่มันเกือบทั้งหมดก่อสร้างพื้นเมืองเป็นบิตผิด ... Number, Boolean, Date, Stringทั้งหมดทำไม่ได้ ... Array, ObjectและErrorทำ แต่Eventและผู้DOMxxxxสร้าง -api ทุกคนจะโยนข้อผิดพลาด
Elias Van Ootegem

ฉันยังคิดnew Array(arguments)ว่าไม่ได้ทำสิ่งที่ถูกArray(1, 2, 3)ต้อง แต่อาจจะฉันแค่ nitpicking :)
pimvdb

8
ประกอบกับการขว้างสตริง: สตริงไม่ใช่ข้อผิดพลาด
alex

11
@alex: ได้รับการโยนไม่ใช่Errorอินสแตนซ์ (หรือตัวอักษรสตริง) สูญเสียการติดตามสแต็ค เพียงแค่นิด ๆ หน่อย ๆ ในบทความที่เชื่อมโยง: arguments.calleeถูกห้ามในโหมดที่เข้มงวด
Elias Van Ootegem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.