Javascript! instanceof If Statement


186

นี่เป็นคำถามพื้นฐานจริงๆเพียงเพื่อตอบสนองความอยากรู้ของฉัน แต่มีวิธีที่จะทำสิ่งนี้:

if(obj !instanceof Array) {
    //The object is not an instance of Array
} else {
    //The object is an instance of Array
}

กุญแจสำคัญในความสามารถในการใช้งานไม่ได้! ต่อหน้าตัวอย่าง โดยปกติวิธีที่ฉันต้องตั้งค่านี้เป็นเช่นนี้:

if(obj instanceof Array) {
    //Do nothing here
} else {
    //The object is not an instance of Array
    //Perform actions!
}

และมันก็น่ารำคาญนิดหน่อยที่จะต้องสร้างคำสั่ง else เมื่อฉันแค่อยากรู้ว่าวัตถุนั้นเป็นชนิดเฉพาะหรือไม่

คำตอบ:


356

ใส่ในวงเล็บและลบล้างด้านนอก

if(!(obj instanceof Array)) {
    //...
}

ในกรณีนี้ลำดับความสำคัญมีความสำคัญ ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ) ตัว! ผู้ประกอบการนำหน้าอินสแตนซ์ของผู้ประกอบการ


9
@ hrishikeshp19 - ฉันค่อนข้างแน่ใจว่าคุณต้องการ parens ฉันเพิ่งลองใน chrome, IE และ node และแต่ละโฮสต์ต้องการพวกเขา
Marcus Pope

1
ต้องการ @ pariship89 parens จำเป็นต้องมีการพิสูจน์: !! obj instanceof Arrayคืนค่าเท็จ (ไม่ถูกต้อง) ในขณะที่!!(obj instanceof Array)คืนค่าจริง (ถูกต้อง)
zamnuts

10
เหตุผลก็คือ! obj มีการประเมินครั้งแรกในถ้า (! obj อินสแตนซ์ของอาร์เรย์) ซึ่งประเมินเป็นจริง (หรือเท็จ) ซึ่งจะกลายเป็นถ้า (bool อินสแตนซ์ของอาร์เรย์) ซึ่งเป็นเท็จอย่างเห็นได้ชัด ดังนั้นให้ห่อในวงเล็บตามที่แนะนำ
ronnbot

1
เหตุผลนี้ควรเป็นส่วนหนึ่งของคำตอบมิฉะนั้นคำตอบนี้ไม่ได้ดีไปกว่าคริสด้านล่าง @SergioTulentsev คุณจะใจดีและเพิ่มสิ่งนี้: In this case, the order of precedence is important (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). The ! operator precedes the instanceof operator. คำตอบของคุณ?
user0800

73
if (!(obj instanceof Array)) {
    // do something
}

เป็นวิธีที่ถูกต้องในการตรวจสอบเรื่องนี้ - ตามที่คนอื่นได้ตอบไปแล้ว อีกสองกลวิธีที่ได้รับการแนะนำจะไม่ทำงานและควรจะเข้าใจ ...

ในกรณีของ!ผู้ประกอบการโดยไม่ต้องวงเล็บ

if (!obj instanceof Array) {
    // do something
}

ในกรณีนี้ลำดับความสำคัญมีความสำคัญ ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ) !ประกอบแจ๋วinstanceofผู้ประกอบการ ดังนั้น!objประเมินให้falseเป็นอันดับแรก (เทียบเท่า! Boolean(obj)); ถ้างั้นคุณกำลังทดสอบว่าfalse instanceof Arrayลบซึ่งเห็นได้ชัดหรือไม่

ในกรณีของ!ผู้ประกอบการก่อนที่instanceofผู้ประกอบการ

if (obj !instanceof Array) {
    // do something
}

นี่เป็นข้อผิดพลาดทางไวยากรณ์ ตัวดำเนินการเช่นเป็น!=ตัวดำเนินการเดียวซึ่งตรงข้ามกับ NOT ที่ไม่ได้ใช้กับ EQUALS ไม่มีตัวดำเนินการดังกล่าว!instanceofในลักษณะเดียวกับที่ไม่มี!<ตัวดำเนินการ


NB ฉันจะแสดงความคิดเห็นต่อคำตอบของ Sergio เพราะเห็นได้ชัดว่าถูกต้อง แต่ฉันไม่ได้เป็นสมาชิกของ SO ดังนั้นจึงไม่มีคะแนนชื่อเสียงเพียงพอที่จะแสดงความคิดเห็น
chrismichaelscott

5
คำตอบเดียวที่อธิบายว่าทำไมของปัญหา (เช่นนี้) ควรได้รับการยอมรับ ...
โรเบิร์ต Rossmann

@chrismichaelscott ในความคิดของฉันและฉันแน่ใจว่าฉันไม่ได้อยู่คนเดียวคำตอบเช่นคุณเป็นสิ่งที่ต้องการมากที่สุดโดยทุกคนถามคำถามที่นี่ มีความชัดเจนตรงประเด็นและแบ่งปันข้อมูลและตัวอย่างเพียงพอที่จะแก้ไขปัญหาที่นำเสนอ ขอบคุณมาก. และฉันคิดว่าคุณสมควรได้รับชื่อเสียงและควรเป็นคำตอบที่ได้รับการยอมรับ
cram2208

42

มันง่ายที่จะลืมวงเล็บ (วงเล็บ) เพื่อให้คุณสามารถสร้างนิสัย:

if(obj instanceof Array === false) {
    //The object is not an instance of Array
}

หรือ

if(false === obj instanceof Array) {
    //The object is not an instance of Array
}

ลองที่นี่


7
จริงๆแล้วมันดูสะอาดกว่าการปฏิเสธสำหรับฉัน
Kamil Latosinski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.