Kiểm tra xem đối tượng có tồn tại trong JavaScript không


313

Làm cách nào để xác minh sự tồn tại của một đối tượng trong JavaScript?

Các công việc sau đây:

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

Nhưng điều này đưa ra một Lỗi:

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

Lỗi:

maybeObject không được xác định.

Câu trả lời:


578

Bạn có thể sử dụng typeoftoán tử một cách an toàn trên các biến không xác định.

Nếu nó đã được gán bất kỳ giá trị nào, bao gồm null, typeof sẽ trả về một cái gì đó không phải là không xác định. typeof luôn trả về một chuỗi.

vì thế

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

73
nếu nó luôn luôn là một chuỗi, bạn thực sự có thể (nên) làm !==để so sánh.
Mi-chê

9
Vì đây là một tính năng Javascript cốt lõi, thật đáng tiếc rằng không có tính năng tích hợp tốt hơn và ít bị lỗi hơn. Việc so sánh chuỗi ngăn trình biên dịch 100% đáng tin cậy cho chúng tôi biết khi chúng tôi mắc một lỗi nhỏ (như lỗi đánh máy) trong các loại kiểm tra này.
Domi

trong trường hợp của tôi, tôi đang tìm kiếm TÌM KIẾM cho đối tượng này, vì vậy điều này không có ích. tôi muốn một giải pháp tôi có thể sử dụng trong giao diện điều khiển như là thợ hàn, để xem liệu đối tượng có ở trong một nơi nào đó mà không có bất kỳ nhấp chuột nào không ..
blamb

@TJCrowder Những ví dụ đó dường như không thể truy cập được nữa.
Stefan van den Akker

1
@StefanvandenAkker: Liên kết đến ví dụ xấu phải là jsbin.com/ibeho3/1 . Ví dụ điển hình là tốt: jsbin.com/ibeho3/2 . (Đáng buồn là JSBin chuyển hướng đến bản mới nhất và mọi người đã chỉnh sửa nó trong vòng một inch của cuộc đời.)
TJ Crowder

48

Có rất nhiều sự thật nửa vời ở đây, vì vậy tôi nghĩ rằng tôi làm cho một số điều rõ ràng hơn.

Trên thực tế, bạn không thể biết chính xác nếu một biến tồn tại (trừ khi bạn muốn bọc mỗi dòng thứ hai vào một khối thử bắt).

Lý do là Javascript có giá trị nổi tiếng này trong undefinedđó nổi bật không có nghĩa là biến không được xác định hoặc nó không tồn tạiundefined !== not defined

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

Vì vậy, cả một biến tồn tại và một biến khác không thể báo cáo cho bạn undefined loại.

Đối với quan niệm sai lầm của @ Kevin , null == undefined. Đó là do sự ép buộc kiểu, và đó là lý do chính tại sao Crockford tiếp tục nói với tất cả những người không chắc chắn về điều này luôn luôn sử dụng toán tử bình đẳng nghiêm ngặt ===để kiểm tra các giá trị có thể sai lệch. null !== undefinedcung cấp cho bạn những gì bạn có thể mong đợi. Cũng xin lưu ý, đó foo != nullcó thể là một cách hiệu quả để kiểm tra nếu một biến không phải undefinedcũng không null. Tất nhiên bạn có thể rõ ràng, bởi vì nó có thể giúp dễ đọc.

Nếu bạn hạn chế câu hỏi để kiểm tra xem một đối tượng có tồn tại hay không, typeof o == "object"có thể là một ý tưởng tốt, ngoại trừ nếu bạn không xem xét các đối tượng mảng, vì điều này cũng sẽ được báo cáo là loại objectcó thể khiến bạn hơi bối rối. Chưa kể điều đó typeof nullcũng sẽ cung cấp cho bạn objectmà đơn giản là sai.

Diện tích nguyên thủy mà bạn thực sự cần phải cẩn thận về typeof, undefined, null, unknownvà misteries khác là những vật chủ. Họ không thể tin tưởng được. Họ được tự do làm hầu hết mọi thứ bẩn thỉu họ muốn. Vì vậy, hãy cẩn thận với chúng, kiểm tra chức năng nếu bạn có thể, bởi vì đó là cách an toàn duy nhất để sử dụng một tính năng thậm chí không tồn tại.


5
Đơn giản chỉ cần làm foo!=nullsẽ tạo ra một ReferenceError nếu fookhông được xác định. Vì vậy, tốt hơn là sử dụng typeof, trừ khi bạn có kế hoạch bắt ngoại lệ.
JAL

1
Tôi viết lại cho bạn một lần nữa: undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null' . Tôi đã không nói != nulllà tốt để kiểm tra nếu nó tồn tại. Bạn đang đưa nó ra khỏi bối cảnh. (Tôi cũng đã đề cập rằng đó là một sidenote, không liên quan chặt chẽ đến chủ đề của câu hỏi của OP)
gblazex

2
Bạn lại nhầm lẫn thuật ngữ không được xác định với loại undefined. Chúng không giống nhau. (note) it can be used !== you should use. Sử dụng thông thường trong khi đọc. Khi biến được khai báo (danh sách tham số hoặc ở nơi khác) và bạn muốn kiểm tra xem nó có giá trị hay không, !=null hoàn toàn an toàn. Đó là một usecase khác với những gì OP yêu cầu, đó là lý do tại sao tôi xâm nhập nó như một ghi chú. Toàn bộ đoạn nói về bài viết của Kevin và loại btw cưỡng chế. Như bạn có thể nhận thấy nếu bạn đọc cẩn thận.
gblazex

@JAL bạn đang thiếu phần mà bạn không gặp rủi ro khi sử dụng != nullkhi bạn biết rằng biến đã được khai báo. Điều này rất hữu ích để kiểm tra các đối số chức năng, xem xét:var hasValue = function(foo) {return foo != null}
tybro0103

@ tybro0103 điều đó đúng, nhưng toàn bộ vấn đề là "Làm cách nào để xác minh sự tồn tại của một đối tượng trong JavaScript?". Nếu bạn chắc chắn nó đã được tuyên bố, đó là một tình huống khác.
JAL

12

Bạn có thể dùng:

if (typeof objectName == 'object') {
    //do something
}

8

Hai lối.

gõ cho các biến cục bộ

Bạn có thể kiểm tra một đối tượng cục bộ bằng cách sử dụng typeof:

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

cửa sổ cho các biến toàn cầu

Bạn có thể kiểm tra một đối tượng toàn cầu (một đối tượng được xác định trên phạm vi toàn cầu) bằng cách kiểm tra đối tượng cửa sổ:

if (window.FormData) {}

7

Nếu đó là một đối tượng toàn cầu, bạn có thể sử dụng if (!window.maybeObject)


Tôi thấy window.hasOwnProperty('maybeObject')là dễ đọc hơn một chút, nếu đó là một đối tượng toàn cầu
Nathaniel Rogers

5

Bạn có thể sử dụng "typeof".

if(typeof maybeObject != "undefined")
    alert("GOT HERE");

4

Các chủ đề đã được mở khá lâu trước đây. Tôi nghĩ trong khi đó, việc sử dụng toán tử ternary là lựa chọn đơn giản nhất:

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

Phải, một cái gì đó dọc theo dòng var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;và kiểm tra nếu không false.
Hmerman6006

3

Tôi đã từng chỉ làm một if(maybeObject)kiểm tra null trong javascripts của tôi.

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

Vì vậy, chỉ khi maybeObject- là một đối tượng, cảnh báo sẽ được hiển thị. Tôi có một ví dụ trong trang web của tôi.

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


Vấn đề là nếu mightObject không được khai báo, nó sẽ ném Lỗi: có thể không xác định được dự đoán
Juanma Menendez

nếu maybeObject0, 0.0, or "", nó sẽ kiểm tra sai
alejandrociatti

3

Tôi vừa mới thử nghiệm các ví dụ typeOf ở trên và không có ví dụ nào phù hợp với tôi, vì vậy thay vào đó tôi đã sử dụng ví dụ này:

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


1

Ngoài việc kiểm tra sự tồn tại của đối tượng / biến, bạn có thể muốn cung cấp đầu ra "trường hợp xấu nhất" hoặc ít nhất là nhốt nó vào một cảnh báo để nó không bị chú ý.

Ví dụ về chức năng kiểm tra, cung cấp thay thế và bắt lỗi.

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

Tôi cũng tạo ra điều này bởi vì đối tượng tôi truyền cho nó có thể là x, xm, xm [z] và typeof xm [z] sẽ không thành công nếu có lỗi nếu xm không tồn tại.

Tôi hy vọng nó sẽ giúp. (BTW, tôi là người mới với JS)


1

Đối với tôi, điều này làm việc cho một đối tượng DOM:

if(document.getElementsById('IDname').length != 0 ){
   alert("object exist");
}

1

Nếu bạn chỉ quan tâm đến sự tồn tại của nó (đã được khai báo chưa?), Câu trả lời được phê duyệt là đủ:

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

Nếu bạn quan tâm đến việc nó có giá trị thực tế, bạn nên thêm:

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

Như typeof( null ) == "object"

ví dụ bar = { x: 1, y: 2, z: null}

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

bằng cách này, bạn kiểm tra xem nó có nullhay không undefinedvà vì typeofkhông có lỗi nếu giá trị không tồn tại cộng với &&các mạch ngắn, bạn sẽ không bao giờ gặp lỗi thời gian chạy.

Cá nhân, tôi khuyên bạn nên thêm một người trợ giúp fn ở đâu đó (và đừng tin tưởng typeof()):

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

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

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

5
Mặc dù khối mã này có thể trả lời câu hỏi của OP, nhưng câu trả lời này sẽ hữu ích hơn nhiều nếu bạn giải thích mã này khác với mã trong câu hỏi như thế nào, bạn đã thay đổi gì, tại sao bạn lại thay đổi và tại sao điều đó giải quyết vấn đề mà không giới thiệu người khác.
Mifeet


-1

đặt giá trị Hộp văn bản thành một khung thành khung nội tuyến bằng bảng điều khiển thẻ div alignmnt. Vì vậy, trước hết, trước khi đặt giá trị, chúng tôi cần kiểm tra khung bảng được chọn có sẵn hoặc không sử dụng các mã sau:

Mã 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

zero và null là các con trỏ ẩn. Nếu bạn không thực hiện số học, so sánh hoặc in '0' để sàng lọc thì không cần phải thực sự nhập nó. Nó ngầm. Như trong ngụ ý. Typeof cũng không bắt buộc vì lý do tương tự. Đồng hồ đeo tay.

if (obj) console.log ("tồn tại");

Tôi đã không thấy yêu cầu cho một hoặc không có ở đó cho nó không được bao gồm như. Nhiều như tôi thích nội dung bổ sung không phù hợp với câu hỏi. Hãy giữ cho nó đơn giản.


Tôi thấy không có trong câu hỏi: if (!maybeObject)- nhưng thực sự, tiêu đề yêu cầu ngược lại.
Armali

-4

Hãy nghĩ rằng nó dễ nhất như thế này

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

-10

Hoặc, tất cả bạn có thể bắt đầu sử dụng phương thức tồn tại () độc quyền của tôi thay vào đó và có thể thực hiện những điều được coi là không thể. I E:

Những thứ như : exists("blabla"), hoặc thậm chí: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")cũng có thể ...


4
Và phương pháp đó ở đâu?
v010dya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.