ตรวจสอบว่าวัตถุมีอยู่ใน JavaScript


313

ฉันจะตรวจสอบการมีอยู่ของวัตถุใน JavaScript ได้อย่างไร

ผลงานดังต่อไปนี้:

if (!null)
   alert("GOT HERE");

แต่นี่เป็นข้อผิดพลาด:

if (!maybeObject)
   alert("GOT HERE");

ข้อผิดพลาด:

maybeObject ไม่ได้กำหนดไว้

คำตอบ:


578

คุณสามารถใช้typeofโอเปอเรเตอร์กับตัวแปรที่ไม่ได้กำหนดอย่างปลอดภัย

ถ้ามันได้รับการกำหนดค่าใด ๆ รวมถึงโมฆะ typeof จะส่งคืนสิ่งอื่นที่ไม่ใช่ undefined typeof จะส่งคืนสตริงเสมอ

ดังนั้น

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

73
ถ้าเป็นสตริงเสมอคุณสามารถ (ควร) ทำ!==เพื่อการเปรียบเทียบ
คาห์

9
เนื่องจากนี่เป็นคุณสมบัติหลักของ Javascript จึงเป็นที่น่าเสียดายที่ไม่มีข้อผิดพลาดในตัวที่ดีกว่าและมีน้อยกว่า การเปรียบเทียบสตริงป้องกันคอมไพเลอร์จาก 100% บอกเราอย่างน่าเชื่อถือเมื่อเราทำผิดพลาดเล็กน้อย (เช่นการพิมพ์ผิด) ในการตรวจสอบประเภทนี้
Domi

ในกรณีของฉันฉันกำลังค้นหา SEARCH สำหรับวัตถุนี้ดังนั้นมันจึงไม่ช่วย ฉันต้องการโซลูชั่นที่ฉันสามารถใช้ในคอนโซลเป็น wel เพื่อดูว่าวัตถุที่อยู่ในที่ใดที่หนึ่งโดยไม่ต้อง domtree clickery ใด ๆ ..
blamb

@TJCrowder ตัวอย่างเหล่านั้นดูเหมือนจะไม่สามารถเข้าถึงได้อีกต่อไป
Stefan van den Akker

1
@StefanvandenAkker: เชื่อมโยงไปยังตัวอย่างที่ไม่ดีควรจะjsbin.com/ibeho3/1 ตัวอย่างที่ดีคือดี: jsbin.com/ibeho3/2 (เศร้า JSBin เปลี่ยนเส้นทางไปยังล่าสุดและผู้คนได้รับการแก้ไขที่ภายในไม่กี่นิ้วของชีวิตของมัน)
TJ Crowder

48

มีครึ่งความจริงมากมายที่นี่ดังนั้นฉันคิดว่าฉันทำให้บางสิ่งชัดเจนขึ้น

ที่จริงแล้วคุณไม่สามารถบอกได้อย่างถูกต้องว่ามีตัวแปรอยู่หรือไม่ (ยกเว้นว่าคุณต้องการรวมทุกบรรทัดที่สองลงในบล็อก try-catch)

เหตุผลก็คือจาวาสคริปต์มีคุณค่าที่ฉาวโฉ่undefinedซึ่งไม่ได้หมายความว่าตัวแปรนั้นไม่ได้ถูกกำหนดหรือมันไม่มีอยู่จริงundefined !== not defined

var a;
alert(typeof a); // undefined (declared without a value)
alert(typeof b); // undefined (not declared)

ดังนั้นทั้งตัวแปรที่มีอยู่และอีกตัวที่ไม่สามารถรายงานundefined ประเภทของคุณได้

สำหรับ @ null == undefinedความเข้าใจผิดของเควิน มันเป็นเพราะการบีบบังคับประเภทและมันเป็นเหตุผลหลักที่ Crockford บอกกับทุกคนที่ไม่แน่ใจในเรื่องแบบนี้เสมอให้ใช้โอเปอเรเตอร์ความเสมอภาคที่เข้มงวด===เพื่อทดสอบค่าที่ผิดพลาด null !== undefinedให้สิ่งที่คุณคาดหวัง โปรดทราบว่าfoo != nullอาจเป็นวิธีที่มีประสิทธิภาพในการตรวจสอบว่าตัวแปรคือค่ามิได้undefined nullแน่นอนคุณสามารถชัดเจนเพราะอาจช่วยให้อ่านได้

หากคุณ จำกัด คำถามเพื่อตรวจสอบว่ามีวัตถุอยู่หรือไม่typeof o == "object"อาจเป็นความคิดที่ดียกเว้นในกรณีที่คุณไม่ได้พิจารณาวัตถุในอาร์เรย์เพราะจะมีการรายงานว่าเป็นวัตถุชนิดobjectที่อาจทำให้คุณสับสน ไม่พูดถึงที่typeof nullจะให้คุณobjectซึ่งเป็นเพียงความผิด

พื้นที่แรกที่คุณควรจะระมัดระวังเกี่ยวกับtypeof, undefined, null, unknownและอื่น ๆ ที่มี misteries วัตถุโฮสต์ พวกเขาไม่สามารถเชื่อถือได้ พวกเขามีอิสระที่จะทำสิ่งสกปรกเกือบทุกอย่างที่พวกเขาต้องการ ดังนั้นจึงควรระมัดระวังตรวจสอบการทำงานหากทำได้เพราะเป็นวิธีเดียวที่ปลอดภัยในการใช้คุณสมบัติที่อาจไม่มี


5
เพียงทำfoo!=nullจะผลิต ReferenceError ถ้าfooไม่ได้กำหนดไว้ ดังนั้นจึงเป็นการดีกว่าที่จะใช้typeofยกเว้นว่าคุณกำลังวางแผนที่จะรับข้อยกเว้น
JAL

1
ฉันเขียนมันลงสำหรับคุณอีกครั้ง: &&undefined !== not defined foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null'ฉันไม่ได้บอกว่า!= nullดีสำหรับการตรวจสอบว่ามีอยู่จริงหรือไม่ คุณกำลังนำมันออกจากบริบท (ฉันยังกล่าวว่ามันเป็น sidenote ไม่เกี่ยวข้องกับเรื่องของ OP ของคำถามอย่างเคร่งครัด)
gblazex

2
undefinedคุณอีกครั้งสับสนคำว่าไม่ได้กำหนดไว้กับชนิด พวกเขาไม่เหมือนกัน (note) it can be used !== you should use. ใช้สามัญสำนึกขณะอ่าน เมื่อมีการประกาศตัวแปร (รายการพารามิเตอร์หรือที่อื่น ๆ ) และคุณต้องการตรวจสอบว่ามันมีค่าหรือไม่!=null มีความปลอดภัยอย่างสมบูรณ์ มันเป็น usecase ที่แตกต่างจากที่ OP ร้องขอนั่นคือสาเหตุที่ฉันบุกรุกมันเป็นโน้ต ย่อหน้าทั้งหมดเป็นเรื่องเกี่ยวกับการโพสต์ของ @ Kevin และประเภทการข่มขู่ btw ในขณะที่คุณสามารถสังเกตเห็นถ้าคุณอ่านอย่างระมัดระวัง
gblazex

@JAL คุณไม่มีส่วนที่คุณไม่ได้เสี่ยงต่อข้อผิดพลาดในการใช้งาน!= nullเมื่อคุณทราบว่ามีการประกาศตัวแปรแล้ว สิ่งนี้มีประโยชน์มากสำหรับการตรวจสอบอาร์กิวเมนต์ของฟังก์ชันให้พิจารณา:var hasValue = function(foo) {return foo != null}
tybro0103

@ tybro0103 นั้นเป็นจริง แต่ปัญหาทั้งหมดคือ "ฉันจะตรวจสอบการมีอยู่ของวัตถุใน JavaScript ได้อย่างไร" หากคุณมั่นใจว่ามีการประกาศว่าเป็นสถานการณ์ที่แตกต่าง
JAL


8

สองทาง.

typeof สำหรับตัวแปรท้องถิ่น

คุณสามารถทดสอบวัตถุท้องถิ่นโดยใช้ typeof:

if (typeof object !== "undefined") {}

หน้าต่างสำหรับตัวแปรทั่วโลก

คุณสามารถทดสอบวัตถุทั่วโลก (หนึ่งในขอบเขตทั่วโลก) โดยการตรวจสอบวัตถุหน้าต่าง:

if (window.FormData) {}



4

ด้ายถูกเปิดค่อนข้างบางเวลาที่ผ่านมา ฉันคิดว่าในขณะเดียวกันการใช้ตัวดำเนินการประกอบไปด้วยเป็นตัวเลือกที่ง่ายที่สุด:

maybeObject ? console.log(maybeObject.id) : ""

แท้จริงแล้วสิ่งที่ตามสายของและตรวจสอบว่าไม่var maybeObject = typeof maybeObject !== "undefined" ? Chart:false; false
Hmerman6006

3

ฉันเคยทำif(maybeObject)เช่นเดียวกับการตรวจสอบเป็นโมฆะในจาวาสคริปต์ของฉัน

if(maybeObject){
    alert("GOT HERE");
}

ดังนั้นหากmaybeObject- เป็นวัตถุการแจ้งเตือนจะปรากฏขึ้น ฉันมีตัวอย่างในเว็บไซต์ของฉัน

https://sites.google.com/site/javaerrorsandsolutions/home/javascript-dynamic-checkboxes


ปัญหาคือถ้าไม่ได้ประกาศอ็อบเจกต์มันจะทำให้เกิดข้อผิดพลาด: ไม่ได้กำหนดบางทีอ็อคเจ็กท์
Juanma Menendez

ถ้าmaybeObjectเป็น0, 0.0, or ""เช่นนั้นมันจะตรวจสอบเท็จ
alejandrociatti

3

ฉันเพิ่งทดสอบตัวอย่าง typeOf จากด้านบนและไม่มีใครทำงานให้ฉันดังนั้นฉันจึงใช้สิ่งนี้แทน:

    btnAdd = document.getElementById("elementNotLoadedYet");
    if (btnAdd) {
       btnAdd.textContent = "Some text here";
    } else {
      alert("not detected!");
    }


1

นอกเหนือจากการตรวจสอบการมีอยู่ของวัตถุ / ตัวแปรที่คุณอาจต้องการให้ "กรณีที่เลวร้ายที่สุด" เอาท์พุทหรืออย่างน้อยก็ดักมันเข้าไปในการแจ้งเตือนเพื่อให้มันไม่ได้ไปสังเกต

ตัวอย่างของฟังก์ชันที่ตรวจสอบให้ทางเลือกและตรวจจับข้อผิดพลาด

function fillForm(obj) {
  try {
    var output;
    output = (typeof obj !== 'undefined') ? obj : '';
    return (output);
  } 
  catch (err) {
    // If an error was thrown, sent it as an alert
    // to help with debugging any problems
    alert(err.toString());
    // If the obj doesn't exist or it's empty 
    // I want to fill the form with ""
    return ('');
  } // catch End
} // fillForm End

ฉันสร้างสิ่งนี้ขึ้นเพราะวัตถุที่ฉันส่งไปอาจเป็น x, xm, xm [z] และ typeof xm [z] จะล้มเหลวโดยมีข้อผิดพลาดหาก xm ไม่มีอยู่

ฉันหวังว่ามันจะช่วย (BTW ฉันเป็นสามเณรกับ JS)



1

หากคุณสนใจเกี่ยวกับการดำรงอยู่ของมันเท่านั้น (มันถูกประกาศ?) คำตอบที่ได้รับการอนุมัตินั้นเพียงพอแล้ว:

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

หากคุณสนใจว่ามันมีค่าจริงคุณควรเพิ่ม:

if (typeof maybeObject != "undefined" && maybeObject != null ) {
   alert("GOT THERE");
}

เช่น typeof( null ) == "object"

เช่น bar = { x: 1, y: 2, z: null}

typeof( bar.z ) == "object" 
typeof( bar.not_present ) == "undefined" 

วิธีนี้คุณตรวจสอบว่ามันไม่ใช่nullหรือundefinedและเนื่องจากtypeofไม่มีข้อผิดพลาดหากไม่มีค่าบวก&&วงจรสั้นคุณจะไม่ได้รับข้อผิดพลาดขณะทำงาน

โดยส่วนตัวฉันขอแนะนำให้เพิ่มผู้ช่วย fn ที่ไหนสักแห่ง (และไม่ไว้ใจtypeof()):

function exists(data){
   data !== null && data !== undefined
}

if( exists( maybeObject ) ){
    alert("Got here!"); 
}

0
if (n === Object(n)) {
   // code
}

5
แม้ว่าบล็อกรหัสนี้อาจตอบคำถามของ OP คำตอบนี้จะมีประโยชน์มากขึ้นถ้าคุณอธิบายว่ารหัสนี้แตกต่างจากรหัสในคำถามสิ่งที่คุณเปลี่ยนทำไมคุณเปลี่ยนและสาเหตุที่แก้ปัญหา โดยไม่ต้องแนะนำผู้อื่น
Mifeet


-1

ตั้งค่ากล่องข้อความให้เป็นหนึ่งเฟรมเป็นเฟรมแบบอินไลน์โดยใช้ div alignmnt แท็บแผง ดังนั้นก่อนอื่นก่อนที่จะกำหนดค่าเราต้องตรวจสอบกรอบแผงแท็บที่เลือกที่มีอยู่หรือไม่ใช้รหัสต่อไปนี้:

รหัส Javascript:

/////////////////////////////////////////
<script>

function set_TextID()
            {
                try
                    {
                        if(!parent.frames["entry"])
                            {
                            alert("Frame object not found");    
                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["entry"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["education"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["education"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["contact"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["contact"].document.getElementById("form_id").value=setText;
                            }

                        }catch(exception){}
                }

</script>

-1

ศูนย์และ null เป็นตัวชี้โดยนัย หากคุณไม่ได้ทำเลขคณิตเปรียบเทียบหรือพิมพ์ '0' ไปที่หน้าจอไม่จำเป็นต้องพิมพ์จริง มันโดยปริยาย ตามที่ระบุไว้ใน ไม่จำเป็นต้องพิมพ์ด้วยเหตุผลเดียวกัน ดู.

if (obj) console.log ("มีอยู่");

ฉันไม่เห็นการร้องขอไม่เช่นนั้นจะไม่รวมอยู่ใน เท่าที่ฉันรักเนื้อหาพิเศษที่ไม่พอดีกับคำถาม ช่วยให้มันง่าย


ฉันไม่เห็นคำถาม: if (!maybeObject)- แต่จริงๆแล้วชื่อเรื่องขอตรงกันข้าม
Armali

-4

คิดว่ามันง่ายที่สุดเช่นนี้

if(myobject_or_myvar)
    alert('it exists');
else
   alert("what the hell you'll talking about");

-10

หรือคุณสามารถเริ่มใช้เอกสิทธิ์ของฉันที่มีอยู่ ()แทนและสามารถทำสิ่งที่ถือว่าเป็นไปไม่ได้ เช่น:

สิ่งที่ต้องการ: exists("blabla")หรือแม้กระทั่ง: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")ยังเป็นไปได้ ...


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