Câu hỏi Kiểm tra JavaScript nếu biến tồn tại (được xác định / khởi tạo)


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ể giữ bất kỳ thứ gì (chuỗi, int, đối tượng, hàm, v.v.))

if (elem) { // or !elem

hoặc là

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

hoặc là

if (elem != null) {

1288
2018-02-25 03:44


gốc


Tôi ngạc nhiên là tôi không thấy: 'if (!! variable)' ở đây. Bất kỳ lý do tại sao điều này không được khuyến cáo? - JasoonS
if (!! variable) '- không được khuyến nghị gây ra khi biến === 0 -' (biến !!) 'sẽ trả về giá trị true - iMysak
@ JasoonS Và nó sẽ ném một ngoại lệ nếu biến không được xác định / khởi tạo. - Alex
nếu bạn muốn biết liệu foo được khai báo, typeof foo === 'undefined' hoặc là typeof foo === typeof undefined - vaxquis
hơn nữa để nhận xét @iMysak, nếu bạn sử dụng "if (variable)" và "variable" là 0, điều đó sẽ đánh giá sai, tôi chỉ mất một giờ theo đuổi điều này, một lỗi ngớ ngẩn như vậy - Chris


Các câu trả lời:


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

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

2509
2018-02-06 04:56



Điều này có vẻ là một giải pháp tốt, nhưng bạn có thể giải thích tại sao điều này hoạt động? - Morgan Cheng
Trên thực tế, bạn nên kiểm tra xem đối tượng có phải là thứ bạn cần không. Vì vậy, đó sẽ là nếu (typeof console == 'đối tượng') {// biến là những gì tôi cần nó được} - staticsan
@George IV: "chỉ cần làm` nếu (biến) "- um, không, thất bại cho sai và 0. - Jason S
'if (variable)' cũng không thành công để kiểm tra sự tồn tại của các thuộc tính đối tượng. - scotts
@ geowa4 Trên thực tế, điều đó sẽ ném một lỗi nếu biến không xác định. - mc10


Các typeof toán tử sẽ kiểm tra xem biến có thực sự không được xác định hay không.

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

Các typeof toán tử, không giống như các toán tử khác, không ném Tham chiếuError ngoại lệ khi được sử dụng với biến chưa khai báo.

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

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

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


694
2018-06-28 16:00



if (! variable_here) {// mã của bạn ở đây. }; không thể biết biến đó là sai hay không xác định - boh
if(! variable_here) sẽ phá vỡ trong nhiều trường hợp. Nếu biến là 0 hoặc sai thì nó sẽ thất bại. Đó không phải là những gì bạn muốn. - Cory Danielson
không thể quyết định có nên bỏ phiếu này hay không. Nói đúng ra typeof foo === "undefined" là chính xác và tốt hơn câu trả lời bình chọn hàng đầu, nhưng các ghi chú bổ sung chỉ khiến câu trả lời này khó hiểu. - Alnitak
Đây không phải là bản sao của stackoverflow.com/a/519157 ? - Steven Penny
@StevenPenny Đó là, ngay bây giờ. Nó bắt đầu khá khác nhau, sau đó OP chỉnh sửa nó cho đến khi nó khá giống nhau bây giờ. - ZAD-Man


Trong JavaScript, một biến có thể được xác định, nhưng giữ giá trị undefined, do đó, 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 các 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 của mã của bạn và tự hiểu nó (nếu bạn quan tâm đến những thứ như vậy):

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

Điều này, tất nhiên, giả sử bạn đang chạy trong một trình duyệt (nơi window là tên cho đối tượng chung). Nhưng nếu bạn đang mucking xung quanh với globals như thế này bạn có thể trong một trình duyệt. Chủ quan, sử dụng 'name' in window phù hợp với phong cách sử dụng window.name để tham khảo globals. Truy cập globals như các thuộc tính của window thay vì các biến cho phép bạn giảm thiểu số lượng biến không khai báo mà bạn tham chiếu trong mã của bạn (vì lợi ích của linting), và tránh khả năng toàn cầu của bạn bị che khuất bởi biến cục bộ. Ngoài ra, nếu globals làm cho da của bạn thu thập thông tin bạn có thể cảm thấy thoải mái hơn chạm vào chúng chỉ với thanh tương đối dài này.


182
2017-10-22 15:47



Về mặt kỹ thuật, đây là câu trả lời hoàn chỉnh nhất, cảm ơn! - crabCRUSHERclamCOLLECTOR
Điều này chỉ kiểm tra nếu biến đã được khai báo trên toàn cầu. Nếu bạn đang mã hóa đúng, thì bạn đang hạn chế các vars toàn cầu của bạn. Nó sẽ báo cáo sai cho các vars cục bộ: (function () {var sdfsfs = 10; console.log ("sdfsfs" trong cửa sổ);}) () ` - Eddie Monge Jr
Đây là câu trả lời tốt nhất f $ # ^% ing. Tôi đã kết thúc bằng cách cố gắng tìm ra cách để giải thích chính xác trường hợp góc này. Rực rỡ. Không có ý tưởng bạn có thể làm điều này. - Aerovistae
Cảnh báo: câu trả lời của bạn đã được di chuyển tại đây từ stackoverflow.com/questions/519145/… - Shog9♦
Nó sẽ chỉ hoạt động cho các biến toàn cục hoặc cho khai báo cục bộ (ví dụ: trong vòng lặp)? - Barth Zalewski


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

elem != null

Không giống như đơn giản if (elem), nó cho phép 0, false, NaN và '', nhưng từ chối null hoặc là undefined, làm cho nó trở thành một thử nghiệm tổng quát, tốt cho sự hiện diện của một đối số hoặc thuộc tính 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ác cách sử dụng khác nhau:

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

  • typeof elem == 'undefined' có thể được sử dụng trong trường hợp được chỉ định null có ý nghĩa riêng biệt với 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 ném một lỗi nếu elem không phải là khai báo (ví dụ: không var tuyên bố, không phải là tài sản của window, hoặc không phải là đối số hàm). Đây là, theo ý kiến ​​của tôi, khá nguy hiểm vì nó cho phép lỗi chính tả trượt bằng cách không được chú ý. Để tránh điều này, hãy xem phương thức 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ể được ghi đè bằng một giá trị khác, tốt nhất là khai báo biến undefined trong phạm vi hiện tại trước khi sử dụng:

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

Hoặc là:

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

Lợi thế thứ hai của phương pháp này là các bộ giảm tốc JS có thể giảm undefined biến thành một ký tự đơn, tiết kiệm cho bạn một vài byte mỗi lần.


112
2018-02-25 03:48



Tôi bị sốc vì bạn có thể ghi đè undefined. Tôi thậm chí không nghĩ rằng đó là giá trị đề cập đến trong câu trả lời. Có lẽ là tên biến duy nhất có thể chấp nhận được tồi tệ nhất trong tất cả Javascript. - Cory Danielson
Đ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 ngữ cảnh chung ... đây không phải là cách tốt nhất. - Alex W
Vì vấn đề quan trọng này, bạn nên LUÔN LUÔN sử dụng void(0) thay vì undefined. - Barth Zalewski
+1 vì câu trả lời này chỉ ra rằng đôi khi bạn có thể thực sự muốn để xác định false, 0, vv dưới dạng giá trị không hợp lệ. - rinogo


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 những trường hợp dưới đây:

  1. chưa xác định: nếu giá trị không được xác định và nó undefined
  2. vô giá trị: nếu nó là null, ví dụ, nếu một 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à một con số
  6. sai

Vì vậy, nó sẽ bao gồm tất cả các trường hợp, nhưng luôn luôn có những trường hợp kỳ lạ mà chúng tôi muốn bao gồm, ví dụ, một chuỗi với không gian, như thế này ' ' một, điều này sẽ được định nghĩa trong javascript vì nó có dấu cách 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 dành cho giá trị chỉ khi 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 thật.

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

undefined, null, etc


85
2017-09-01 06:15



Minh họa tuyệt vời. Bạn có phiếu bầu của tôi - oBo
Trường hợp đầu tiên có phù hợp khi kiểm tra một mảng trống không? - Thiago Yoithi
@ThiagoYoithi, có, bạn cần phải vượt qua Array.length trong trường hợp này là 0 khi nó trống rỗng, như thể (myArray.length) {...} - Alireza
Vâng, nhưng tôi muốn biết hành vi trong cách tiếp cận này: hãy để arrayVar = []; if (arrayVar) // Là kết quả của điều kiện này đúng hay sai? - Thiago Yoithi
@Alireza, đẹp quá! Câu trả lời của bạn sẽ giúp nhiều người ngoài kia. Tôi đã ghi nhớ những giá trị sai lệch này, điều duy nhất mà tôi không chắc chắn là về []. - Thiago Yoithi


Cách kiểm tra xem biến có tồn tại không

Đây là một giải pháp khá chống đạn để thử nghiệm 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ử bậc ba để đặ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 đóng gói séc của bạn trong một hàm.

Bạn có thể nghĩ đến việc 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 ví dụ. isset(foo) và biến foo chưa được xác định, vì bạn không thể chuyển cùng một biến không tồn tại thành một hàm:

Uncaught ReferenceError: foo không được định nghĩa


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

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

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ị cho y được truyền theo hàm test, của chúng tôi isset chức năng hoạt động hoàn hảo trong bối cảnh này, bởi vì y được biết đến trong hàm test như một undefined giá trị.


59
2018-02-19 11:54



@ChristophAlrich: Rất tiếc. Cảm ơn bạn đã chỉ ra điều đó. Tôi đã sửa câu trả lời của mình :-) - John Slegers


Kiểm tra xem một đối tượng hasOwnProperty()

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

Các hasOwnProperty() phương thức trả về một boolean cho biết đối tượng có thuộc tính được chỉ định là thuộc tính riêng (không được kế thừa) hay không.

Mọi đối tượng đều xuất phát từ Vật kế thừa hasOwnProperty() phương pháp. Phương thức 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ư trong nhà điều hành, phương pháp 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 về hasOwnProperty() là trong việc gọi nó, chúng tôi không sử dụng một biến có thể chưa được xác định - mà tất nhiên là một nửa vấn đề ở nơi đầu tiên.

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


42
2018-05-02 14:07



Đây là một lựa chọn tuyệt vời và nên được đưa lên hàng đầu về câu hỏi này. Vui lòng đơn giản hóa dòng tiêu đề câu trả lời bằng ví dụ hoạt động trả về true (ví dụ. window.hasOwnProperty('console') hoặc là var hop = "p";window.hasOwnProperty('hop')). - CPHPython
Không cần phải 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 là nhanh hơn để đọc. Nếu bạn vẫn muốn để lại đoạn mã, chỉ cần để lại hai dòng trên nó, đầu tiên xác định var và in thứ hai kết quả. - CPHPython
@CPHPython Đã chỉnh sửa; đuợc? - Fred Gandt
Cải thiện tuyệt vời, đơn giản và nhanh chóng để hiểu, cảm ơn! - CPHPython
Cuối cùng một cái gì đó mà không ném một lỗi vì truy cập vào một thành viên mà không tồn tại ... Một cái gì đó tất cả các typeof câu trả lời chỉ đơn giản là bỏ qua. - Zelphir


Có một cách ngắn tay 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à các kiểm tra liên quan. Đơn giản chỉ cần sử dụng Toán tử đ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 Global với phép gán ví dụ của biến tham chiếu.

Nếu bạn muốn kiểm tra biến không nên undefined hoặc là 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í còn đơn giản:  và nó sẽ thực hiện undefined và null kiểm tra cùng nhau.

var values = variable ? variable : '';

39
2018-02-19 05:26



câu trả lời vì nó bị sai lệch. typeof biến luôn luôn trả về một chuỗi, do đó không bao giờ là sai. ví dụ. nếu typeof(booooo) Là "undefined" sau đó typeof(typeof boooooo) Là "string" và typeof boooooo && true luôn luôn true. @ John-Slegers 'câu trả lời là về như viết tắt như bạn có thể nhận được với typeof. - mpag
Câu trả lời hoàn toàn đúng của nó. Đây là một Fiddle đang hoạt động. 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ề việc kiểm tra sự tồn tại của biến. - RajeshKdev
@mpag Đừng nói Flat sai. Chứng minh nó. 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 các lập trình viên sẽ không bỏ phiếu bình chọn mà không kiểm tra câu trả lời của tôi. Vì có rất nhiều câu trả lời có uy tín ở đây nên họ có thể đã lên tiếng bình chọn, chứ không phải điều này. - RajeshKdev
jsfiddle.net/o5mzrsfc/3 - mpag
kiểm tra thứ 2 của bạn sẽ thất bại với 0 giá trị - Fareed Alnamrouti


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

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

}

Object, Array

if( foo instanceof Array ) { 

}

27
2017-07-26 02:08



Cảnh báo: câu trả lời của bạn đã được di chuyển tại đây từ stackoverflow.com/questions/519145/… - Shog9♦
Cảnh báo: foo instanceof Array sẽ gây ra một ngoại lệ nếu foo không định nghĩa được. - Jonathan Lidbeck