460

Phương pháp kiểm tra nếu một biến đã được khởi tạo là tốt hơn / đúng? (Giả sử biến có thể chứa bất cứ thứ gì (chuỗi, int, object, function, v.v.))

if (elem) { // or !elem

hoặc là

if (typeof(elem) !== 'undefined') {

hoặc là

if (elem != null) {
|
766

Các typeofnhà điều hành sẽ kiểm tra nếu biến thực sự là không xác định.

if (typeof variable === 'undefined') {
    // variable is undefined
}

Các typeofnhà điều hành, không giống như các nhà khai thác khác, không ném một ReferenceError ngoại lệ khi được sử dụng với một biến chưa được khai báo.

Tuy nhiên, hãy lưu ý rằng typeof nullsẽ trở lại "object". Chúng ta phải cẩn thận để tránh sai lầm khi khởi tạo một biến null. Để an toàn, đây là những gì chúng ta có thể sử dụng thay thế:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

Để biết thêm thông tin về việc sử dụng so sánh nghiêm ngặt ===thay vì bình đẳng đơn giản ==, hãy xem:
Nên sử dụng toán tử bằng nào (== vs ===) trong so sánh JavaScript?

|
2.7k

Bạn muốn các typeofnhà điều hành . Đặc biệt:

if (typeof variable !== 'undefined') {
    // the variable is defined
}
|
194

Trong JavaScript, một biến có thể được xác định, nhưng giữ giá trị undefined, vì vậy câu trả lời phổ biến nhất là không chính xác về mặt kỹ thuật và thay vào đó thực hiện như sau:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

Điều đó có thể đủ cho mục đích của bạn. Bài kiểm tra sau đây có ngữ nghĩa đơn giản hơn, giúp dễ dàng mô tả chính xác hành vi mã của bạn và tự hiểu nó (nếu bạn quan tâm đến những điều đó):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

Tất nhiên, điều này giả sử bạn đang chạy trên trình duyệt (nơi windowđặt tên cho đối tượng toàn cầu). Nhưng nếu bạn đang lẩn quẩn với những quả cầu như thế này thì có lẽ bạn đang ở trong một trình duyệt. Theo chủ quan, sử dụng 'name' in windowlà phù hợp với phong cách sử dụng window.nameđể đề cập đến toàn cầu. Truy cập toàn cầu dưới dạng các thuộc tính windowchứ không phải là biến cho phép bạn giảm thiểu số lượng biến không được khai báo mà bạn tham chiếu trong mã của mình (vì lợi ích của việc nhuộm) và tránh khả năng toàn cầu của bạn bị che khuất bởi một biến cục bộ. Ngoài ra, nếu toàn cầu làm cho da của bạn bò, bạn có thể cảm thấy thoải mái hơn khi chạm vào chúng chỉ với cây gậy tương đối dài này.

|
163

Trong nhiều trường hợp, sử dụng:

if (elem) { // or !elem

sẽ thực hiện công việc cho bạn! ... điều này sẽ kiểm tra các trường hợp dưới đây:

  1. không xác định : nếu giá trị không được xác định và nóundefined
  2. null : ví dụ: nếu null, nếu phần tử DOM không tồn tại ...
  3. chuỗi rỗng :''
  4. 0 : số không
  5. NaN : không phải là số
  6. sai

Vì vậy, nó sẽ loại bỏ tất cả các trường hợp, nhưng luôn có những trường hợp kỳ lạ mà chúng tôi muốn đề cập, ví dụ, một chuỗi có khoảng trắng, như trường hợp này ' ', điều này sẽ được xác định trong javascript vì nó có khoảng trắng bên trong chuỗi ... ví dụ trong trường hợp này, bạn thêm một kiểm tra nữa bằng cách sử dụng trim (), như:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

Ngoài ra, các kiểm tra này chỉ dành cho các giá trị , vì các đối tượng và mảng hoạt động khác nhau trong Javascript, mảng []trống và đối tượng trống {}luôn luôn đúng .

Tôi tạo hình ảnh dưới đây để hiển thị tóm tắt nhanh về câu trả lời:

|
  • 1

    Là trường hợp đầu tiên phù hợp khi kiểm tra một mảng trống quá?

    – Tạ Tuyết Lâm 18:02:22 29/11/2017
  • 1

    @ThiagoYoithi, vâng, bạn cần vượt qua Array.length trong trường hợp này là 0 khi nó trống, như if (myArray.length) {...}

    – Hoàng Trí Hùng 22:17:29 29/11/2017
  • 1

    Vâng, nhưng tôi muốn biết hành vi trong cách tiếp cận này: let ArrayVar = []; if (ArrayVar) // Kết quả của điều kiện này là đúng hay sai?

    – Trịnh Hồng Xuân 16:57:21 30/11/2017
  • 1

    @Alireza, tốt đẹp! Câu trả lời của bạn sẽ giúp rất nhiều người ngoài kia. Tôi đã ghi nhớ những giá trị giả mạo này, điều duy nhất mà tôi không chắc chắn là về [].

    – Đỗ Mộng Long 20:01:58 01/12/2017
  • 1

    @ropo, đó là vì bạn thậm chí không xác định elem để kiểm tra xem đó là gì, nếu đó là trường hợp của bạn, bạn cần kiểm tra nó với typeof (elem) === "chuỗi" đã được đề cập ...

    – Đặng Trung Việt 12:09:25 19/11/2018
115

Trong phần lớn các trường hợp bạn sẽ sử dụng:

elem != null

Không giống như một đơn giản if (elem), nó cho phép 0, false, NaN'', nhưng từ chối nullhoặc undefined, làm cho nó một tốt, kiểm tra chung cho sự hiện diện của một cuộc tranh cãi, hoặc tài sản của một đối tượng.


Các kiểm tra khác cũng không chính xác, chúng chỉ có cách sử dụng khác nhau:

  • if (elem): Có thể được sử dụng nếu elemlà đảm bảo được một đối tượng, hoặc nếu false, 0vv được coi là giá trị "mặc định" (do đó tương đương với undefinedhoặc null).

  • typeof elem == 'undefined'có thể được sử dụng trong trường hợp một chỉ định nullcó ý nghĩa riêng biệt với một biến hoặc thuộc tính chưa được khởi tạo.

    • Đây là kiểm tra duy nhất sẽ không gây ra lỗi nếu elemkhông được khai báo (nghĩa là không có varcâu lệnh, không phải là thuộc tính của windowhoặc không phải là đối số của hàm). Điều này, theo tôi, khá nguy hiểm vì nó cho phép lỗi chính tả bị bỏ qua mà không được chú ý. Để tránh điều này, xem phương pháp dưới đây.

Cũng hữu ích là một so sánh nghiêm ngặt chống lại undefined:

if (elem === undefined) ...

Tuy nhiên, vì toàn cầu undefinedcó thể bị ghi đè bằng một giá trị khác, tốt nhất nên khai báo biến undefinedtrong phạm vi hiện tại trước khi sử dụng nó:

var undefined; // really undefined
if (elem === undefined) ...

Hoặc là:

(function (undefined) {
    if (elem === undefined) ...
})();

Một lợi thế thứ cấp của phương thức này là các công cụ khai thác JS có thể giảm undefinedbiến thành một ký tự, tiết kiệm cho bạn một vài byte mỗi lần.

|
  • 1

    Tôi sốc vì bạn có thể ghi đè undefined. Tôi thậm chí không nghĩ rằng đó là giá trị đề cập trong câu trả lời. Có lẽ là tên biến tệ nhất được chấp nhận trong tất cả các Javascript.

    – Dương Thúy Huyền 06:53:53 16/04/2013
  • 1

    Điều này gây ra một ngoại lệ và yêu cầu bạn sử dụng window.trước biến nếu được sử dụng trong bối cảnh toàn cầu ... đây không phải là cách tốt nhất.

    – Trịnh Hoài Trang 14:42:00 09/09/2013
  • 1

    Vì vấn đề quan trọng này, bạn nên LUÔN sử dụng void(0)thay vì undefined.

    – Hoàng Khánh Ngân 10:29:45 23/10/2014
  • 1

    1 kể từ khi câu trả lời này chỉ ra rằng đôi khi bạn thực sự có thể muốn để xác định false, 0vv giá trị là không hợp lệ.

    – Đỗ Nguyên Hoàng 23:41:23 26/06/2018
65

Làm thế nào để kiểm tra nếu một biến tồn tại

Đây là một giải pháp chống đạn khá tốt để kiểm tra nếu một biến tồn tại và đã được khởi tạo:

var setOrNot = typeof variable !== typeof undefined;

Nó thường được sử dụng kết hợp với một toán tử ternary để đặt mặc định trong trường hợp một biến nhất định chưa được khởi tạo:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

Các vấn đề với đóng gói

Thật không may, bạn không thể đơn giản gói gọn kiểm tra của bạn trong một chức năng.

Bạn có thể nghĩ làm một cái gì đó như thế này:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

Tuy nhiên, điều này sẽ tạo ra một lỗi tham chiếu nếu bạn đang gọi, vd. isset(foo)và biến foochưa được xác định, bởi vì bạn không thể chuyển dọc theo biến không tồn tại cho hàm:

Uncaught ReferenceError: foo không được xác định


Kiểm tra xem các tham số chức năng không được xác định

Mặc dù issetchức năng của chúng tôi không thể được sử dụng để kiểm tra xem một biến có tồn tại hay không (vì lý do giải thích ở đây), nhưng nó cho phép chúng tôi kiểm tra xem các tham số của hàm có được xác định không:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

Mặc dù không có giá trị nào yđược truyền cho hàm test, issethàm của chúng ta hoạt động hoàn hảo trong ngữ cảnh này, vì yđược biết đến trong hàm testlà một undefinedgiá trị.

|
46

Kiểm tra nếu một đối tượng hasOwnProperty()

Một thay thế cho rất nhiều typeofcâu trả lời, là việc sử dụng trong hasOwnProperty()đó tất nhiên sẽ kiểm tra xem một đối tượng (khá nhiều thứ trong JS) có thuộc tính tức là một biến (trong số những thứ khác).

Các hasOwnProperty()phương thức trả về một boolean chỉ ra cho dù đối tượng có tính chất như là của riêng bất động sản (không được thừa kế) quy định.

Mọi đối tượng xuất phát từ Object đều kế thừa hasOwnProperty()phương thức. Phương pháp này có thể được sử dụng để xác định xem một đối tượng có thuộc tính được chỉ định làm thuộc tính trực tiếp của đối tượng đó hay không; Không giống như toán tử in , phương thức này không kiểm tra chuỗi nguyên mẫu của đối tượng.

// Globally established (therefore) properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
// window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ),             // true
    window.hasOwnProperty( "bar" ),             // true
    window.hasOwnProperty( "baz" ),             // true
    window.hasOwnProperty( "qux" ),             // false
    { foo: [], bar: 0 }.hasOwnProperty( "bar" ) // true
] );

Điều tuyệt vời hasOwnProperty()là khi gọi nó, chúng ta không sử dụng một biến có thể chưa được xác định - điều này tất nhiên là một nửa vấn đề ở nơi đầu tiên.

Mặc dù không phải lúc nào cũnggiải pháp hoàn hảo hoặc lý tưởng , nhưng trong một số trường hợp nhất định, đó chỉ là công việc!

|
  • 1

    Đây là một giải pháp thay thế tuyệt vời và nên được đưa lên hàng đầu trong câu hỏi này. Vui lòng đơn giản hóa tiêu đề câu trả lời bằng một ví dụ hoạt động trả về true(ví dụ window.hasOwnProperty('console')hoặc var hop = "p";window.hasOwnProperty('hop')).

    – Dương Thúy Huyền 11:38:32 14/09/2016
  • 1

    Không cần xác định một chức năng để giải thích, mọi người sẽ hiểu nó ngay lập tức và một câu trả lời ngắn sẽ nhanh hơn để đọc. Nếu bạn vẫn muốn rời khỏi đoạn mã, chỉ cần để lại hai dòng trên đó, dòng đầu tiên xác định var và lần thứ hai in kết quả.

    – Trịnh Hoài Trang 11:39:21 14/09/2016
  • 1

    Cuối cùng, một cái gì đó không gây ra lỗi vì truy cập vào một thành viên không tồn tại, một cái gì đó tất cả các typeofcâu trả lời đơn giản bỏ qua.

    – Hoàng Khánh Ngân 08:17:29 17/05/2017
42

Có một cách ngắn khác để kiểm tra điều này, khi bạn thực hiện các bài tập đơn giản và kiểm tra liên quan. Đơn giản chỉ cần sử dụng Toán tử có điều kiện (Ternary).

var values = typeof variable !== 'undefined' ? variable : '';

Ngoài ra, điều này sẽ hữu ích, khi bạn cố gắng khai báo biến Toàn cầu với sự gán gán của biến tham chiếu.

Nếu bạn muốn kiểm tra biến không nên undefinedhoặc null. Sau đó thực hiện kiểm tra bên dưới.

Khi biến được khai báo và nếu bạn muốn kiểm tra giá trị, điều này thậm chí đơn giản: và nó sẽ thực hiện undefinednullkiểm tra cùng nhau.

var values = variable ? variable : '';
|
  • 1

    Câu trả lời là không đúng. biến typeof luôn trả về một chuỗi, do đó không bao giờ sai. ví dụ nếu typeof(booooo)"undefined"sau đó typeof(typeof boooooo)"string"typeof boooooo && trueluôn luôn là true. Câu trả lời của @ John-Slegers là viết tắt như bạn có thể nhận được với typeof.

    – Dương Thúy Huyền 20:05:41 05/05/2017
  • 1

    Câu trả lời hoàn toàn chính xác của nó . Đây là một Fiddle làm việc . Và tôi không biết bạn đang nói về kịch bản nào. Các câu hỏi là về kiểm tra sự tồn tại biến.

    – Trịnh Hoài Trang 05:11:56 06/05/2017
  • 1

    @mpag Đừng nói sai. Chứng minh điều đó . Tìm một sai lầm là thực sự dễ dàng, thay vào đó bạn có thể cung cấp câu trả lời tốt ở đây !!!. Nếu câu trả lời sai, 28 lập trình viên sẽ không bỏ phiếu mà không kiểm tra câu trả lời của tôi. Vì có nhiều câu trả lời có uy tín ở đây, họ có thể đã bỏ phiếu đó, không phải điều này.

    – Hoàng Khánh Ngân 05:20:52 06/05/2017
  • 1
  • 1

    séc thứ 2 của bạn sẽ thất bại với 0 giá trị

    – Tạ Xuân Mai 08:30:11 30/05/2017
29

Nó phụ thuộc nếu bạn chỉ quan tâm rằng biến đã được xác định hoặc nếu bạn muốn nó có giá trị có ý nghĩa.

Kiểm tra nếu loại không xác định sẽ kiểm tra xem biến đã được xác định chưa.

=== nullhoặc !== nullsẽ chỉ kiểm tra xem giá trị của biến là chính xác null.

== nullhoặc != nullsẽ kiểm tra xem giá trị là undefinedhay null.

if(value)sẽ kiểm tra nếu biến đó là undefined, null, 0, hoặc một chuỗi rỗng.

|
28

không xác định, boolean, chuỗi, số, hàm

if (typeof foo! == 'không xác định') { 

}

Đối tượng, mảng

if( foo instanceof Array ) { 

}
|
13

Câu trả lời cao nhất là chính xác, sử dụng typeof.

Tuy nhiên, điều tôi muốn chỉ ra là trong JavaScript undefinedlà có thể thay đổi (vì một số lý do vô duyên). Vì vậy, chỉ cần thực hiện kiểm tra varName !== undefinedcó tiềm năng không phải lúc nào cũng trở lại như bạn mong đợi, bởi vì các lib khác có thể đã thay đổi không xác định. Một vài câu trả lời (@ skalee's, cho một người), dường như không thích sử dụng typeofvà điều đó có thể khiến một người gặp rắc rối.

Cách "cũ" để xử lý việc này là tuyên bố không xác định là var để bù đắp cho bất kỳ sự tắt tiếng / vượt quá tiềm năng nào undefined. Tuy nhiên, cách tốt nhất vẫn là sử dụng typeofvì nó sẽ bỏ qua mọi phần ghi đè undefinedtừ mã khác. Đặc biệt là nếu bạn đang viết mã để sử dụng ngoài tự nhiên, nơi ai biết những gì khác có thể đang chạy trên trang ...

|
11
if (typeof console != "undefined") {    
   ...
}

Hoặc tốt hơn

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

Hoạt động trong tất cả các trình duyệt

|
9

Để đóng góp cho cuộc tranh luận, nếu tôi biết biến nên là một chuỗi hoặc một đối tượng tôi luôn thích if (!variable), vì vậy hãy kiểm tra xem nó có sai không. Điều này có thể mang đến mã sạch hơn, ví dụ:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

..có thể được giảm xuống:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 

|
  • 1

    Đây không phải là những gì OP yêu cầu. Nếu data.url bằng với ''giải pháp của bạn sẽ xem xét nó không xác định, khi thực tế nó được định nghĩa là chứa một chuỗi rỗng.

    – Lý Hoàng Cúc 23:01:44 14/01/2018
  • 1

    Tôi đồng ý không phải là những gì đã được hỏi và bạn đã đúng: chuỗi trống '' sẽ được coi là không xác định. Nhưng tôi đã đăng bài này vì tôi nghĩ nó có thể hữu ích cho cuộc tranh luận đã được tạo ra giữa các câu trả lời khác nhau. Và trong ví dụ, cũng như trong nhiều trường hợp khác, bạn chỉ muốn in một chuỗi nếu thực sự có nội dung, vì vậy bạn có thể tận dụng thực tế là javascript coi cả chuỗi trống và không xác định

    – Đặng Hồng Tâm 16:18:18 19/01/2018
8

Những câu trả lời này (ngoài giải pháp Fred Gandt) đều không chính xác hoặc không đầy đủ.

Giả sử tôi cần tôi variableName;mang một undefinedgiá trị, và do đó, nó đã được khai báo theo cách thức var variableName;có nghĩa là nó đã được khởi tạo ; - Làm cách nào để kiểm tra xem nó đã được khai báo chưa?

Hoặc thậm chí tốt hơn - làm cách nào để kiểm tra ngay nếu "Book1.ch CHƯƠNG22.par Đoạn37" tồn tại với một cuộc gọi, nhưng không phát sinh lỗi tham chiếu?

Chúng tôi làm điều đó bằng cách sử dụng toán tử JasvaScript mạnh nhất, toán tử trong :

"[variable||property]" in [context||root] 
>> true||false

Trong thời điểm phổ biến AJAX, tôi đã viết một phương thức (tên sau này) làNS () có khả năng xác định xem không gian tên có tồn tại bao gồm các thử nghiệm sâu cho các tên thuộc tính như "Book1.ch CHƯƠNG22.par Đoạn37" và nhiều hơn nữa.

Nhưng vì nó đã được xuất bản trước đó và vì tầm quan trọng của nó, nó xứng đáng được xuất bản trong một chủ đề riêng biệt nên tôi sẽ không đăng nó ở đây mà sẽ cung cấp từ khóa ( javascript + isNS ) để giúp bạn xác định mã nguồn, được hỗ trợ với tất cả giải thích cần thiết.

|
8

Null là một giá trị trong JavaScript và typeof nulltrả về"object"

Do đó, câu trả lời được chấp nhận sẽ không hoạt động nếu bạn vượt qua các giá trị null. Nếu bạn chuyển các giá trị null, bạn cần thêm một kiểm tra bổ sung cho các giá trị null:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.