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


1767

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) {

5
nếu bạn muốn biết liệu foođược công bố, một trong hai typeof foo === 'undefined'hoặctypeof foo === typeof undefined

1
Các câu trả lời được đánh giá cao không hoạt động đối với các biến được khai báo nhưng có giá trị undefined. Câu trả lời đúng là đây: stackoverflow.com/a/36432729/772035
Paul

@Paulpro, phiên bản sử dụng hasOwnProperty('bar')không có thiếu sót giống như các phiên bản khác, nhưng sẽ yêu cầu một số điều chỉnh cho Node (thay thế windowbằng global).
oligofren

@Paulpro Thật vậy, nhưng khi tôi suy nghĩ rằng trước khi bạn trả lời, tôi đã đi đến kết luận rằng đó không thực sự là một vấn đề thực tế. Khi bạn đang xử lý các biến trong phạm vi khối hoặc hàm, thường là mã bạn sở hữu hoặc có quyền truy cập ghi, vì vậy bạn sẽ gặp lỗi thời gian chạy trong mọi trường hợp có thể sửa được. Trong khi đó, vấn đề thông thường với các biến chưa được xác định (không tồn tại) thường nằm trong mã nằm ngoài tầm kiểm soát của bạn, vì vậy bạn cần một cách để phát hiện nó. Vì vậy, đó là giải pháp 80/20.
oligofren

Câu trả lời:


3055

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

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

35
Đâ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

46
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à if (typeof console == 'object') {// biến là thứ tôi cần nó}
staticsan

59
@George IV: "chỉ cần làm` if (biến) "- ừm, không, điều đó không đúng với sai và 0.
Jason S

17
'if (biến)' cũng thất bại trong việc kiểm tra sự tồn tại của các thuộc tính đối tượng.
Scotts

54
@ geowa4 Trên thực tế, điều đó sẽ gây ra lỗi nếu biến không được xác định.
kevinji

857

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 thànhnull . Để 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
if (! biến_here) {// mã của bạn ở đây. }; không thể biết được biến đó là sai hay không xác định
boh

5
if(! variable_here)sẽ phá vỡ trong nhiều trường hợp. Nếu biến là 0 hoặc sai thì sẽ thất bại. Đó không phải là những gì bạn muốn.
Cory Danielson

2
không thể quyết định có nên bỏ phiếu này không. Nói đúng ra typeof foo === "undefined"là chính xác, và tốt hơn câu trả lời được 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 trở nên khó hiểu.
Alnitak

1
@StevenPenny Kiểm tra dòng thời gian. Câu trả lời hàng đầu đã được hợp nhất từ một câu hỏi khác sau khi câu trả lời này được đăng
Rob

1
Câu trả lời này không hoạt động. Đây là câu trả lời duy nhất ở đây có tác dụng: stackoverflow.com/a/36432729/772035
Paul

222

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ẽ bao gồm loại 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 bao gồm, 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:

không xác định, null, v.v.


2
@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ề [].
Thiago Yoithi

13
Tôi nhận được "ReferenceError: elem không được xác định"
ropo

3
@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 ...
Alireza

19
Sau đó, câu trả lời là sai lệch khi nó nói if(elem)kiểm tra cho không xác định (trong khi nó trả về lỗi không xác định), phải không?
Fanky

1
Hãy cho tôi một trường hợp sử dụng để kiểm tra nếu một biến không được xác định và nếu được xác định với một giá trị không xác định? Một số bạn đang nắm lấy ống hút và cố gắng để trông thật rực rỡ nhưng nếu bạn đang đặt một giá trị là không xác định và kiểm tra giá trị đó rõ ràng nó sẽ trả về sai hoặc bạn cần thay đổi mã của mình, smh .... câu trả lời này là chính xác !! !!!
almcaffee

210

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 ( windowtên của đố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 windowthay vì dưới dạng 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.


7
Đ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 viết mã đúng, thì bạn đang giới hạn các vars toàn cầu của mình. 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

2
Đây là câu trả lời tốt nhất f $ # ^% ing. Tôi đã kết thúc việc này khi cố gắng tìm ra cách giải thích cho chính xác trường hợp góc này. Xuất sắc. Không có ý tưởng bạn có thể làm điều này.
tạm

1
Cảnh báo: câu trả lời của bạn đã được di chuyển ở đây từ stackoverflow.com/questions/519145/iêu
Shog9

Đối với người dùng Angular: Thật không may, nó dường như không được phép trong câu lệnh ng-if.
qwertzguy

... kế hoạch chi tiết hoàn hảo để kiểm tra theo phạm vi. bạn có bất kỳ dấu hiệu hiệu suất nào không, nếu "trong cửa sổ" hoặc "(biến typeof === 'không xác định' | | biến === null)". Trên thực tế tôi quan tâm đến một bài kiểm tra thực tế khó khăn và không tranh luận về lý do tiềm năng (mà tôi có thể tự làm: mệnh đề thứ hai có nhiều thao tác hơn -> hiệu suất kém hơn)
Nhanh hơn

119

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'', rồi 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, hã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.


17
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.
Cory Danielson

2
Đ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.
Alex W

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

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

77

Kiểm tra nếu window. hasOwnProperty( " varname" )

Một thay thế cho rất nhiều typeofcâu trả lời;

Biến toàn cục được khai báo với một var varname = value;tuyên bố trong phạm vi toàn cầu

có thể được truy cập như các thuộc tính của đối tượng cửa sổ.

Như vậy, hasOwnProperty()phương pháp, mà

trả về một boolean cho biết liệu đối tượng có thuộc tính được chỉ định làm thuộc tính riêng của nó hay không (trái ngược với việc kế thừa nó)

có thể được sử dụng để xác định xem

a varcủa "varname" đã được khai báo trên toàn cầu tức là một thuộc tính của window.

// 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
] );

Đ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 khai báo - đ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ũng là giải pháp hoàn hảo hay lý tưởng , nhưng trong một số trường hợp nhất định, đó chỉ là công việc!

Ghi chú

Điều trên là đúng khi sử dụng varđể xác định một biến , trái ngược với let:

khai báo một biến cục bộ phạm vi khối, tùy ý khởi tạo nó thành một giá trị.

không giống như var từ khóa, định nghĩa một biến trên toàn cầu hoặc cục bộ cho toàn bộ hàm bất kể phạm vi khối.

Ở cấp cao nhất của chương trình và chức năng let, không giống như var, không tạo ra một thuộc tính trên đối tượng toàn cầu.

Để đầy đủ: các const hằng số, theo định nghĩa, không thực sự biến (mặc dù nội dung của chúng có thể); phù hợp hơn:

Các hằng số toàn cầu không trở thành thuộc tính của đối tượng cửa sổ, không giống như varcác biến. Một bộ khởi tạo cho một hằng số là bắt buộc; nghĩa là, bạn phải chỉ định giá trị của nó trong cùng một câu lệnh được khai báo.

Giá trị của hằng số không thể thay đổi thông qua việc gán lại và nó không thể được xác định lại.

Khai báo const tạo một tham chiếu chỉ đọc đến một giá trị. Điều đó không có nghĩa là giá trị mà nó giữ là bất biến, chỉ là định danh biến không thể được gán lại.

letcác biến hoặc consthằng không bao giờ là thuộc tính của bất kỳ đối tượng nào đã kế thừa hasOwnProperty()phương thức, nên nó không thể được sử dụng để kiểm tra sự tồn tại của chúng.

Về tính khả dụng và sử dụng của hasOwnProperty():

Mọi đối tượng xuất phát từ Object đều kế thừa hasOwnProperty()phương thức. [...] Không giống như intoán tử, phương thức này không kiểm tra chuỗi nguyên mẫu của đối tượng.


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')).
CPHPython

2
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.
Zelphir Kaltstahl

1
Câu trả lời này đã lỗi thời - theo ECMAScript tiêu chuẩn, bạn có thể xác định các biến với letcác biến này không có sẵn dưới dạng các thuộc tính của windowđối tượng [hoặc bất kỳ có sẵn nào khác]. hasOwnPropertykiểm tra sự hiện diện của các thuộc tính , không phải các biến và do đó không thể được sử dụng để phát hiện các biến được xác định bởi let.
amn

1
@amn Câu trả lời vẫn đúng về việc sử dụng varvà không liên quan đến vấn đề này. Tuy nhiên tôi đã thêm một ghi chú phác thảo cách sử dụng letconstkhác với cách sử dụng var. Cảm ơn cảm hứng của bạn; chúng ta cùng nhau vươn lên :)
Fred Gandt

1
@amn Tôi đã viết lại câu trả lời (hy vọng là lần cuối cùng) để làm rõ hơn rằng hasOwnPropertychỉ có thể được sử dụng theo cách quy định để kiểm tra sự tồn tại của varcác biến. Nó đọc ổn với tôi.
Fred Gandt

68

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á hay để 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 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 ở trên), 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ị.


41

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í còn đơn giản: và nó sẽ thực hiện undefinednullkiểm tra cùng nhau.

var values = variable ? variable : '';

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.
mpag

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.
RajeshKdev

@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.
RajeshKdev

Trên thực tế, đoạn mã thứ hai, không được kiểm tra giống như điều kiện trên. Tôi nghĩ mọi người sẽ hiểu theo dòng này If you wanted to check variable shouldn't be undefined or null., bởi nhận xét này, nó nêu rõ, nó không thực hiện kiểm tra khai báo biến. đó là để kiểm tra giá trị biến.
RajeshKdev

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

32

Cách ngắn để kiểm tra một biến không được khai báo (không xác định) là

if (typeof variable === "undefined") {
  ...
}

Tôi thấy nó hữu ích để phát hiện tập lệnh chạy bên ngoài trình duyệt (không có windowbiến khai báo ).


Đây có phải là "cách chính tắc" là di động?
Jason

3
Cái này sai. window.bar=undefinedđược xác định và đặt thành một giá trị. Câu trả lời của bạn không phát hiện ra sự khác biệt giữa điều này và nếu biến không tồn tại. Nếu bạn đã làm this.hasOwnProperty('bar')nó có thể đã làm việc.
oligofren

mã này không hoạt động và bạn có thể xác minh điều này bằng cách sử dụng bất kỳ bảng điều khiển trình duyệt nào
ha9u63ar

1
Hãy xem xét const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. Biến xđược xác định nhưng sai được trả về ...
user2878850

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 có chính xác khôngnull .

== 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.


12

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 đè củaundefined từ 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 ...


1
Vấn đề là moot, bởi vì nếu varName không được xác định thì varName !== undefinedsẽ chỉ gây ra ReferenceError. Khả năng biến đổi của undefinedvấn đề sẽ không xảy ra.
Wutaz

Cảnh báo: câu trả lời của bạn đã được di chuyển ở đây từ stackoverflow.com/questions/519145/iêu
Shog9

1
Trong các phiên bản Javascript mới hơn undefinedlà thuộc tính chỉ đọc. Tuy nhiên để được chống đạn bạn có thể sử dụng typeof mvVar === typeof void 0. void 0Trả về undefinedluôn.
kwarnke

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


3
Tại sao sau này là tốt hơn theo ý kiến ​​của bạn?
skalee

3
@skalee Mình đồng ý cái sau thì tốt hơn. Điều này vì lý do đơn giản là bạn kiểm tra xem các loại có phải là loại bạn muốn trước khi sử dụng chúng không.
Broxzier

Cảnh báo: câu trả lời của bạn đã được di chuyển ở đây từ stackoverflow.com/questions/519145/iêu
Shog9

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)
} 


Đâ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.
Demonblack

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
de3

8

Thật khó để phân biệt giữa không xác định và null. Null là một giá trị bạn có thể gán cho một biến khi bạn muốn chỉ ra rằng biến đó không có giá trị cụ thể. Không xác định là một giá trị đặc biệt sẽ là giá trị mặc định của các biến không được gán.


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
Sẽ hữu ích để hiển thị nội tuyến đầu ra của mỗi cảnh báo.
demisx

@demisx Đồng ý, nhưng thay vì đề xuất chỉnh sửa, tại sao không thực hiện? Tùy chọn là có lý do. Một số có thể coi đó là thô lỗ; Tôi cho rằng nó hiệu quả - vì vậy tôi đã tự chỉnh sửa câu trả lời (đang chờ xem xét).
Fred Gandt

1
@Fred - Tôi đã xem lịch sử chỉnh sửa và có thể đoán tại sao các chỉnh sửa của bạn bị từ chối ... thay vì chỉ thêm các dòng để hiển thị đầu ra sẽ như thế nào, như demisx đề xuất, bạn đã thay đổi đáng kể những gì Jith đã đăng.
Stephen P

8

Null là một giá trị trong JavaScript và typeof null trả 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
}

7

Kiểm tra mạnh mẽ nhất 'được xác định' là với typeof

if (typeof elem === 'undefined')

Nếu bạn chỉ kiểm tra một biến xác định để gán mặc định, để dễ đọc một lớp lót, bạn có thể thường xuyên làm điều này:

elem = elem || defaultElem;

Bạn thường sử dụng tốt, xem: Cách thành ngữ để đặt giá trị mặc định trong javascript

Ngoài ra còn có một lớp lót này sử dụng từ khóa typeof :

elem = (typeof elem === 'undefined') ? defaultElem : elem;

7

bạn có thể sử dụng typeoftoán tử.

Ví dụ,

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

Đoạn mã trên sẽ trả về đầu ra như

dữ liệu biến là: không xác định.


1
Cảnh báo: câu trả lời của bạn đã được di chuyển ở đây từ stackoverflow.com/questions/519145/iêu
Shog9

7

Để kiểm tra xem một biến đã được khai báo / bộ chưa, tôi đã thực hiện thủ thuật bẩn này.

Tôi chưa tìm thấy cách trích xuất mã thành hàm, ngay cả với eval.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

Bạn có ý nghĩa gì khi "trích xuất mã thành hàm"?
Melab

7

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.


1
Các innhà điều hành chỉ kiểm tra cho sự tồn tại bất động sản, và không phải tất cả các biến là tài sản - constlettuyên bố không (và constthậm chí không, tốt, biến ).
amn

1
constletđã được chuẩn hóa với ECMAScript 2015, được xuất bản hơn 3 năm trước và từ đó đã được các nghi phạm thông thường chấp nhận và được sử dụng khá phổ biến ngày nay, tôi dám nói - có hơn 2 triệu lần xuất hiện của "const" trên Github trong các tệp tin JS .
amn

Có, "biến" - chính xác. Đó là lý do tại sao tôi nhận xét về câu trả lời của bạn, chỉ ra rằng bạn không thể sử dụng intoán tử để kiểm tra xem có tồn tại một biến hay không, bởi vì "const và let không [thuộc tính]" - trong khi constthực sự có thể nói là giới thiệu một tham chiếu không đổi , như trái lại với một tham chiếu biếnlet , mặt khác, thực sự đưa ra một tham chiếu biến - nói cách khác, theo bất kỳ thước đo nào, một biến và câu trả lời của bạn không chính xác khi ngụ ý rằng bạn có thể kiểm tra xem một biến được xác định có lettồn tại không bằng cách sử dụng intoán tử - bạn không thể.
amn

Đặc tả ECMAScript 6 xác định ngôn ngữ JavaScript, không phải bạn cũng không phải trình duyệt Web. Đó là lý do tại sao nó được gọi là một đặc điểm kỹ thuật - nó rõ ràng chỉ định ngôn ngữ. Câu trả lời của bạn là lỗi thời nhất, tệ nhất là nó cố tình bỏ qua những gì bạn cho là không liên quan, trong khi nó rất liên quan. Trích dẫn thông số kỹ thuật được liên kết, "khai báo let và const xác định biến". Các cấu trúc này không thể truy cập như các thuộc tính của windowđối tượng, tôi không biết làm thế nào để làm cho điều này rõ ràng hơn với bạn.
Amn

Câu trả lời không bao gồm tất cả các trường hợp biến. Cụ thể, nó không bao gồm các biến được xác định với lettừ khóa. Đó là tất cả những gì tôi đã chỉ ra.
Amn

6

Trong tình huống cụ thể được nêu trong câu hỏi,

typeof window.console === "undefined"

giống hệt với

window.console === undefined

Tôi thích cái sau vì nó ngắn hơn.

Xin lưu ý rằng chúng tôi chỉ tìm kiếm consoletrong phạm vi toàn cầu (là một windowđối tượng trong tất cả các trình duyệt). Trong tình huống cụ thể này, nó là mong muốn. Chúng tôi không muốnconsole định nghĩa ở nơi khác.

@BrianKelley trong câu trả lời tuyệt vời của mình giải thích các chi tiết kỹ thuật. Tôi chỉ thêm thiếu kết luận và tiêu hóa nó thành một cái gì đó dễ đọc hơn.


Cảnh báo: câu trả lời của bạn đã được di chuyển ở đây từ stackoverflow.com/questions/519145/iêu
Shog9

2
Sai. cái sau ném một ngoại lệ trong giao diện điều khiển của tôi.
john ktejik

6

Tôi sử dụng hai cách khác nhau tùy thuộc vào đối tượng.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

Đôi khi tôi không muốn đánh giá một chuỗi rỗng là falsey, vì vậy sau đó tôi sử dụng trường hợp này

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

Nếu bạn cần ngược lại, thì trong trường hợp đầu tiên! Biến trở thành !! biến và trong hàm không hợp lệ === trở thành! = Và tên hàm thay đổi thành notInvalid.


5

Sở thích của tôi là typeof(elem) != 'undefined' && elem != null .

Tuy nhiên, bạn chọn, xem xét đưa kiểm tra vào một chức năng như vậy

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

Nếu bạn không biết biến được khai báo thì hãy tiếp tục với typeof (x) != 'undefined' && x != null;

Trường hợp bạn biết biến được khai báo nhưng có thể không tồn tại, bạn có thể sử dụng

existy(elem) && doSomething(elem);

Biến bạn đang kiểm tra đôi khi có thể là một thuộc tính lồng nhau. Bạn có thể sử dụng prop | | {} để đi xuống sự tồn tại của dòng kiểm tra đối với thuộc tính được đề cập:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

Sau mỗi thuộc tính sử dụng (... '|| {}'). NextProp để một thuộc tính bị thiếu sẽ không gây ra lỗi.

Hoặc bạn có thể sử dụng như existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


Nếu bạn đặt nó trong một chức năng, nó là dư thừa. typeof (x) != 'undefined' && x != nulltương đương với x != nullkhi xđược khai báo.
Ry-

3

Nó phụ thuộc vào tình hình. Nếu bạn đang kiểm tra thứ gì đó có thể hoặc không được xác định trên toàn cầu bên ngoài mã của bạn (như jQuery có lẽ), bạn muốn:

if (typeof(jQuery) != "undefined")

(Không cần bình đẳng nghiêm ngặt ở đó, typeof luôn trả về một chuỗi.) Nhưng nếu bạn có đối số cho hàm có thể hoặc không được thông qua, chúng sẽ luôn được xác định, nhưng không có giá trị nếu bị bỏ qua.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

Cố gắng bắt

Nếu biến hoàn toàn không được xác định, bạn có thể kiểm tra điều này mà không cần thực thi mã bằng cách sử dụng khối thử bắt như sau (bạn không cần phải use strictchế độ)

THƯỞNG: (tham khảo các câu trả lời khác) Tại sao ===rõ ràng hơn ==( nguồn )

nếu (a == b)

Nhập mô tả hình ảnh ở đây

nếu (a === b)

Nhập mô tả hình ảnh ở đây


1
FYI, (a == b) được đặt trên lưới Game of Life không thú vị lắm.
johnsnails

1

Tôi ngạc nhiên khi điều này chưa được đề cập ...

Dưới đây là một vài biến thể bổ sung sử dụng this['var_name']

lợi ích của việc sử dụng phương pháp này mà nó có thể được sử dụng trước khi một biến được xác định.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

Cái này sai. window.bar=undefinedđược xác định và đặt thành một giá trị. Câu trả lời của bạn không phát hiện ra sự khác biệt giữa điều này và nếu biến không tồn tại. Nếu bạn đã làm this.hasOwnProperty('bar')nó có thể đã làm việc.
oligofren

0

Bạn có thể sử dụng một khối thử ... bắt như sau:

Một bất lợi là bạn không thể đặt nó vào một chức năng vì nó sẽ ném ReferenceError

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

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.