Có một chức năng tiêu chuẩn để kiểm tra các biến null, không xác định hoặc trống trong JavaScript không?


2260

Có một hàm JavaScript phổ quát nào kiểm tra xem một biến có giá trị không và đảm bảo rằng nó không phải undefinedhay nullkhông? Tôi đã nhận được mã này, nhưng tôi không chắc liệu nó có bao gồm tất cả các trường hợp không:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}


78
Protip, không bao giờ làm (truthy statement) ? true : false;. Cứ làm đi (truthy statement);.
David Baucum

5
@GeorgeJempty không phải là một bản sao, vì câu trả lời khác hỏi về các chuỗi nói riêng, trong khi câu hỏi này hỏi về các biến .
Madbreaks

2
Bất kỳ câu trả lời chính xác cho câu hỏi này hoàn toàn phụ thuộc vào cách bạn xác định "trống".
Madbreaks

3
@Jay Nó không ảnh hưởng gì đến việc thực thi mã của bạn. Nó quá dài dòng. Bạn sẽ không nói, "Bạn có đói là sự thật không?" Bạn chỉ "Bạn có đói không" Vì vậy, trong mã chỉ cần nói if (hungry) …thay vì if (hungry === true) …. Giống như tất cả những thứ mã hóa theo cách này, nó chỉ là vấn đề của hương vị. Cụ thể hơn với ví dụ do OP cung cấp, anh ta thậm chí còn nói rõ ràng hơn, "Nếu nó đúng, thì đúng, nếu không thì sai" Nhưng nếu nó đúng, thì nó đã đúng. Và, nếu nó sai, nó đã sai. Điều này giống như nói rằng "Nếu bạn đói thì bạn là như vậy, và nếu không thì bạn không."
David Baucum

Câu trả lời:


4379

Bạn chỉ có thể kiểm tra xem biếntruthygiá trị hay không. Điều đó có nghĩa là

if( value ) {
}

sẽ đánh giá để truenếu valuekhông :

  • vô giá trị
  • chưa xác định
  • NaN
  • chuỗi rỗng ("")
  • 0
  • sai

Danh sách trên thể hiện tất cả các falsygiá trị có thể có trong ECMA- / Javascript. Tìm nó trong đặc điểm kỹ thuật tại ToBooleanphần.

Hơn nữa, nếu bạn không biết liệu một biến có tồn tại hay không (điều đó có nghĩa là, nếu nó được khai báo ), bạn nên kiểm tra với typeoftoán tử. Ví dụ

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

Nếu bạn có thể chắc chắn rằng một biến được khai báo ít nhất, bạn nên trực tiếp kiểm tra xem nó có truthygiá trị như được hiển thị ở trên không.

Đọc thêm: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html


110
Điều gì xảy ra nếu giá trị là một boolean sai đã được dự định. Đôi khi bạn muốn đưa ra một giá trị mặc định nếu không có giá trị, nó sẽ không hoạt động nếu boolean sai được truyền vào.
TruMan1

100
@ TruMan1: trong trường hợp như vậy (trong đó logic của bạn ra lệnh xác thực), bạn phải đi như thế nào if( value || value === false ). Tương tự với tất cả các giá trị giả , chúng ta cần xác nhận cho những giá trị đó một cách rõ ràng.
jAndy

28
Ngoại trừ nếu giá trị là một mảng. Việc giải thích truthycó thể gây hiểu nhầm. Trong trường hợp đó chúng ta nên kiểm tra value.length != 0một mảng không trống.
người dùng

12
Chỉ muốn thêm rằng nếu bạn cảm thấy ifcấu trúc quá nặng về mặt cú pháp, bạn có thể sử dụng toán tử ternary, như vậy : var result = undefined ? "truthy" : "falsy". Hoặc nếu bạn chỉ muốn ép buộc một giá trị boolean, sử dụng !!nhà điều hành, ví dụ như !!1 // true, !!null // false.
KFL

7
Cũng lưu ý rằng điều này sẽ không kiểm tra các chuỗi chỉ chứa các ký tự khoảng trắng.
Barshe Roussy

222

Phương thức dài dòng để kiểm tra xem giá trị không được xác định hay null là:

return value === undefined || value === null;

Bạn cũng có thể sử dụng ==toán tử nhưng điều này hy vọng một người sẽ biết tất cả các quy tắc :

return value == null; // also returns true if value is undefined

33
Kiểm tra chỉ nullhoặc undefinedcó thể được thực hiện như vậy : if (value == null). Tâm ==điều khiển mà cưỡng chế. Nếu bạn kiểm tra như thế này if (value === null || value === undefined), bạn đã quên / không biết Javascript ép buộc như thế nào. webreflection.blogspot.nl/2010/10/ khăn
Christiaan Westerbeek

32
@ChristiaanWesterbeek: điểm của bạn arg == nulltạo ra kết quả tương tự như arg === undefined || arg === null. Tuy nhiên, tôi xem xét ví dụ sau dễ đọc hơn.
Salman A

10
arg == nulllà khá phổ biến trong kinh nghiệm của tôi.
Bryan Downing

8
return value === (void 0)undefinedđáng buồn hơn là kiểm tra dựa vào đó có thể là một biến hợp pháp trong phạm vi, đáng buồn thay.
x0n

4
@Sharky Có một sự khác biệt giữa một biến không được xác định và một biến không được khai báo: lucybain.com/blog/2014/null-undDef-undeclared
Christiaan Westerbeek

80
function isEmpty(value){
  return (value == null || value.length === 0);
}

Điều này sẽ trả về đúng cho

undefined  // Because undefined == null

null

[]

""

và các hàm đối số bằng 0 vì một hàm lengthlà số lượng tham số khai báo.

Để không cho phép danh mục sau, bạn có thể chỉ muốn kiểm tra các chuỗi trống

function isEmpty(value){
  return (value == null || value === '');
}

7
undefined == nullnhưngundefined !== null
Ian Boyd

2
@IanBoyd đó là vì bạn đang so sánh == với ===. điều này có nghĩa là không xác định == null (đúng) không xác định! = null (sai) không xác định === null (sai) không xác định đi đúng hướng. moz doc về sự khác biệt của nhà phát
Corey Young

43

Đây là kiểm tra an toàn nhất và tôi chưa thấy nó được đăng ở đây chính xác như thế:

if (typeof value !== 'undefined' && value) {
    //deal with value'
};

Nó sẽ bao gồm các trường hợp giá trị không bao giờ được xác định và bất kỳ trường hợp nào trong số này:

  • vô giá trị
  • không xác định (giá trị không xác định không giống với tham số không bao giờ được xác định)
  • 0
  • "" (Chuỗi trống)
  • sai
  • NaN

Đã chỉnh sửa: Thay đổi thành bình đẳng nghiêm ngặt (! ==) vì bây giờ nó là chuẩn mực;)


10
Tôi đã không downvote, nhưng liên quan đến so sánh bình đẳng nghiêm ngặt, quy tắc chung là trừ khi bạn cần chuyển đổi kiểu ngầm định hơn so với sử dụng so sánh nghiêm ngặt.
J.Steve 4/12/13

2
Thanx cho nhận xét của bạn Steve. Đó là quy tắc chung là tốt. Tôi chỉ mong cho ppl hiểu lý do tại sao họ sử dụng cái này hay cái kia. Mọi cách bạn nhìn ppl sẽ rất vui khi giảng cho bạn về "luôn luôn sử dụng nghiêm ngặt" - giống như đó là điều quan trọng nhất trong Javascript. Tôi đã thấy quá nhiều trường hợp như nếu (val! == null) rõ ràng dẫn đến một kết quả không mong muốn. Thật tốt khi nói rằng khi nghi ngờ - hãy sử dụng nghiêm ngặt, nhưng tốt hơn hết là đừng nghi ngờ.
chàng trai

6
Tôi nghĩ vấn đề ở đây là chúng tôi hy vọng typeoftoán tử trả về một chuỗi vì vậy sử dụng kiểm tra đẳng thức nghiêm ngặt về mặt kỹ thuật chính xác hơn, cụ thể hơn và nhanh hơn. Vì vậy, thực sự, không có lý do để sử dụng so sánh lỏng lẻo, không phải là cách khác. Cũng val !== nullhoàn toàn hợp lệ trong nhiều trường hợp - tôi làm điều đó mọi lúc. Tôi đồng ý với lập luận không phù hợp của bạn, nhưng tôi nghĩ đây là một ví dụ tồi để đưa ra. Không cố gắng để troll bạn.
Bryan Downing

Thanx cho nhận xét của bạn Bryan, Bạn sử dụng val! == null vì bạn biết bạn đang làm gì. Một người mới bắt đầu sẽ muốn có một dự phòng khi val bị sai lệch. Nhưng, val sẽ không bao giờ là null, nó sẽ không được xác định. Giá như anh không nghe lời khuyên đó với Luôn luôn sử dụng nghiêm ngặt thì anh sẽ ít mắc lỗi hơn. Tôi đã thấy điều này xảy ra trong mã sản xuất. typeof luôn trả về một chuỗi và tốc độ khác nhau sẽ là dự phòng. Vì vậy, đối số duy nhất để sử dụng nghiêm ngặt trong trường hợp trên là tính nhất quán. Tôi đã nói rằng Không cần sự bình đẳng nghiêm ngặt. Điều đó không có nghĩa là bạn không thể nếu bạn muốn hoặc nếu nó làm cho mã của bạn nhất quán hơn.
chàng trai

28

Bạn có thể thấy chức năng sau đây hữu ích:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

Hoặc trong ES7 (nhận xét nếu cải tiến thêm)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

Các kết quả:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map

"Lưu ý rằng toán tử liên kết (: :) không phải là một phần của ES2016 (ES7) cũng như bất kỳ phiên bản nào sau này của tiêu chuẩn ECMAScript. Đây hiện là đề xuất giai đoạn 0 (ống hút) để được giới thiệu với ngôn ngữ." - Simon Kjellberg. tác giả muốn thêm hỗ trợ của mình cho đề nghị đẹp này để nhận được sự thăng thiên của hoàng gia.


+1 thật hữu ích khi biết đối tượng của loại 'regrec' , 'mảng' và 'function'
Yash

@Vix, tại sao phiên bản ES7 tốt hơn?
GollyJer

Đó không phải là, đã thử nghiệm nhiều cách dễ đọc hơn để thể hiện cùng một chức năng bằng cách sử dụng: hủy bỏ phân công, toán tử liên kết.
Vix

2
Lưu ý rằng toán tử liên kết ( ::) không phải là một phần của ES2016 (ES7) cũng như bất kỳ phiên bản nào sau này của tiêu chuẩn ECMAScript. Đây hiện là một đề xuất giai đoạn 0 (người rơm) để được giới thiệu với ngôn ngữ.
Simon Kjellberg

25

Câu trả lời đầu tiên với đánh giá tốt nhất là sai. Nếu giá trị không được xác định, nó sẽ ném ngoại lệ trong các trình duyệt hiện đại. Bạn phải sử dụng:

if (typeof(value) !== "undefined" && value)

hoặc là

if (typeof value  !== "undefined" && value)

3
eee ... Tôi nghĩ điều này là sai vì nếu (giá trị) là đủ (ngoại trừ các đối tượng / mảng trống). nếu giá trị là 'không xác định' thì 'nếu' không thể vượt qua.
Oskar Szura

3
Điều này kết hợp các biến không được xác định (đánh giá ReferenceError khi đánh giá), khác với các biến có undefinedgiá trị.
Qantas 94 Nặng

2
Tôi đã nhận được cùng một lỗi ở đây. if (x), if (! x), if (!! x) tất cả sẽ ném lỗi nếu x không xác định.
shaosh

if(value === 0) gameOver(); ;)
Madbreaks

Câu trả lời này cũng sai vì nó trả về false khi valuebằng 0, đó không phải là điều mà op đang tìm kiếm.
Madbreaks

17

Kiểm tra điều kiện này

if (!!foo) {
    //foo is defined
}

là tất cả những gì bạn cần.


Tôi cho rằng đây chỉ là một đoạn trích. Nhưng ifđã thực hiện kiểm tra giả, cái này chỉ chuyển thành Boolean. Nó có bắt được bất kỳ trường hợp nào mà một người bình thường if(foo)không bắt được không?
Daan van Hulst

1
Điều này là hoàn hảo khi bạn cần một cái gì đó nội tuyến, ví dụ tôi cần một thuộc tính phản ứng (được gọi là hoạt động), điều đó đúng khi một chuỗi không trống - một câu lệnh if sẽ quá mức cần thiết để tôi có thể sử dụngactive={!!foo}
Ben Kolya Mansley

16

! kiểm tra các chuỗi rỗng (""), null, không xác định, sai và số 0 và NaN. Nói, nếu một chuỗi trống var name = ""thì console.log(!name)trả về true.

function isEmpty(val){
  return !val;
}

chức năng này sẽ trở thành sự thật nếu valtrống rỗng, null, undefined, false, số 0 hoặc NaN .

HOẶC LÀ

Theo tên miền vấn đề của bạn, bạn chỉ có thể sử dụng như !valhoặc !!val.


Điều này không thực sự nói nếu biến trống, vì false và 0 có thể là giá trị hợp lệ và không tạo thành giá trị trống. Giá trị của việc có hàm isEmpty sẽ là đảm bảo các giá trị bạn mong đợi là trả về giá trị true. theo ý kiến ​​của tôi null, không xác định, NaN và một chuỗi rỗng là các giá trị có nghĩa là trống.
Corey Young

9
Tại sao sử dụng isEmpty(val)nếu bạn chỉ có thể làm !val?
Allen Linatoc

Điều đó phụ thuộc vào bạn. Bạn có thể sử dụng nó để tăng khả năng đọc. Mặt khác, nếu bạn nghĩ rằng nhóm bạn làm việc họ là một lập trình viên tiên tiến hơn, thì bạn có thể sử dụng chỉ !valhoặc !!valtheo miền vấn đề của bạn.
Arif

15

Một giải pháp tôi rất thích:

Hãy xác định rằng một biến trống là null, hoặc undefined, hoặc nếu nó có độ dài, nó bằng 0 hoặc nếu nó là một đối tượng, thì nó không có khóa:

function isEmpty (value) {
  return (
    // null or undefined
    (value == null) ||

    // has length and it's zero
    (value.hasOwnProperty('length') && value.length === 0) ||

    // is an Object and has no keys
    (value.constructor === Object && Object.keys(value).length === 0)
  )
}

Trả về:

  • đúng: undefined , null, "", [],{}
  • sai: true , false, 1, 0, -1, "foo", [1, 2, 3],{ foo: 1 }

14

Bạn có một chút làm quá nó. Để kiểm tra xem một biến không được đưa ra một giá trị, bạn chỉ cần kiểm tra lại không xác định và null.

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

Đây là giả định 0, ""và các đối tượng (ngay cả đối tượng và mảng trống) là "giá trị" hợp lệ.


10

Nếu bạn thích javascript đơn giản hãy thử điều này:

  /**
   * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
   * length of `0` and objects with no own enumerable properties are considered
   * "empty".
   *
   * @static
   * @memberOf _
   * @category Objects
   * @param {Array|Object|string} value The value to inspect.
   * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
   * @example
   *
   * _.isEmpty([1, 2, 3]);
   * // => false
   *
   * _.isEmpty([]);
   * // => true
   *
   * _.isEmpty({});
   * // => true
   *
   * _.isEmpty('');
   * // => true
   */

function isEmpty(value) {
    if (!value) {
      return true;
    }
    if (isArray(value) || isString(value)) {
      return !value.length;
    }
    for (var key in value) {
      if (hasOwnProperty.call(value, key)) {
        return false;
      }
    }
    return true;
  }

Mặt khác, nếu bạn đã sử dụng dấu gạch dưới hoặc dấu gạch ngang, hãy thử:

_.isEmpty(value)

3
Đã thử mã của bạn. Tôi nhận được một thông báo lỗi trong bảng điều khiển có nội dung: "Lỗi tham chiếu Uncaught: isArray () không được xác định". Nếu không, sẽ là tuyệt vời nếu nó làm việc.
crmprogdev

11
Trong trường hợp của lodash ít nhất, _.isNillà chức năng bạn đang tìm kiếm, không phải _.isEmpty. Tài liệu isNil , tài liệu isEmpty
Snixtor

Điều này sẽ thất bại nếu giá trị là boolean và có giá trị đúng.
kalyanbk

3
Javascript đơn giản không có isArrayhoặc isStringchức năng trên window.
GFoley83

@ GFoley83 - Bạn bắt được tôi! Tôi có lý do của tôi không sử dụng Windows. Tôi thực sự đề cập đến chủ đề trong chương nói về lịch sử và sự phát triển của ngôn ngữ phần mềm. Thông tin liên quan khác có thể sẽ là cuộc thảo luận / mã trình bày Xử lý lỗi đơn âm trong cuốn sách của tôi, Tìm hiểu lập trình chức năng trong Go. Chúc mừng!
l3x

9

Của tôi đây - trả về true nếu giá trị là null, không xác định, v.v hoặc trống (tức là chỉ chứa khoảng trắng):

function stringIsEmpty(value) {

    return value ? value.trim().length == 0 : true;

}

1
Tôi đã làm một bài kiểm tra về một số phương pháp ở đây. Với một kiểm tra không xác định, chức năng của bạn hoạt động rất tốt. Vì vậy, tôi sử dụng if (typeof value! == 'không xác định' &&! IsEmpty (value)) HOẶC, nếu bạn thực sự muốn kiểm tra trống, bạn có thể sử dụng if (typeof value === 'không xác định' | | IsEmpty2 (value) ). Điều này sẽ làm việc cho null; Chưa xác định; 0; ""; ""; sai
RationalRợi

6
return val || 'Handle empty variable'

là một cách thực sự tốt và sạch để xử lý nó ở nhiều nơi, cũng có thể được sử dụng để gán biến

const res = val || 'default value'

Rất nhiều nơi nhưng không phải khi mặc định là truevà bạn đang cố gắng để cung cấp hoặc trả lại một valsố false.
Molomby

@Molomby đó là một trường hợp cạnh rất cụ thể nhưng thậm chí có thể dễ dàng xử lýconst res = falsyValue ? true : falsyValue
cubefox 21/03/19

5

Nếu biến không được khai báo, bạn sẽ không thể kiểm tra không xác định bằng cách sử dụng hàm vì bạn sẽ gặp lỗi.

if (foo) {}
function (bar) {}(foo)

Cả hai sẽ tạo ra một lỗi nếu foo chưa được khai báo.

Nếu bạn muốn kiểm tra nếu một biến đã được khai báo, bạn có thể sử dụng

typeof foo != "undefined"

nếu bạn muốn kiểm tra xem foo đã được khai báo chưa và nó có giá trị bạn có thể sử dụng

if (typeof foo != "undefined" && foo) {
    //code here
}

5

Để kiểm tra giá trị mặc định

function typeOfVar (obj) {
      return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
function isVariableHaveDefaltVal(variable) {
    if ( typeof(variable) === 'string' ) {  // number, boolean, string, object 
        console.log(' Any data Between single/double Quotes is treated as String ');        
        return (variable.trim().length === 0) ? true : false;
    }else if ( typeof(variable) === 'boolean' ) {
      console.log('boolean value with default value \'false\'');
        return (variable === false) ? true : false;
    }else if ( typeof(variable) === 'undefined' ) {
        console.log('EX: var a; variable is created, but has the default value of undefined.'); 
        return true;
    }else if ( typeof(variable) === 'number' ) { 
        console.log('number : '+variable);
        return (variable === 0 ) ? true : false;
    }else if ( typeof(variable) === 'object' ) {
   //   -----Object-----
        if (typeOfVar(variable) === 'array' && variable.length === 0) {
            console.log('\t Object Array with length = ' + [].length); // Object.keys(variable)
            return true;
        }else if (typeOfVar(variable) === 'string' && variable.length === 0 ) {
            console.log('\t Object String with length = ' + variable.length);
            return true;
        }else if (typeOfVar(variable) === 'boolean' ) {
            console.log('\t Object Boolean = ' + variable);
            return (variable === false) ? true : false;
        }else if (typeOfVar(variable) === 'number' ) {
            console.log('\t Object Number = ' + variable);
            return (variable === 0 ) ? true : false;
        }else if (typeOfVar(variable) === 'regexp' && variable.source.trim().length === 0 ) {
       console.log('\t Object Regular Expression : ');
        return true;
        }else if (variable === null) {
       console.log('\t Object null value');
        return true;
        }
    }
    return false;
}
var str = "A Basket For Every Occasion";
str = str.replace(/\s/g, "-");
//The "g" flag in the regex will cause all spaces to get replaced.

kiểm tra kết quả:

isVariableHaveDefaltVal(' '); // string          
isVariableHaveDefaltVal(false); // boolean       
var a;           
isVariableHaveDefaltVal(a);               
isVariableHaveDefaltVal(0); // number             
isVariableHaveDefaltVal(parseInt('')); // NAN isNAN(' '); - true         
isVariableHaveDefaltVal(null);              
isVariableHaveDefaltVal([]);               
isVariableHaveDefaltVal(/ /);              
isVariableHaveDefaltVal(new Object(''));               
isVariableHaveDefaltVal(new Object(false));            
isVariableHaveDefaltVal(new Object(0)); 
typeOfVar( function() {} );

Tôi đã sử dụng hàm @Vix () để kiểm tra đối tượng thuộc loại nào.

sử dụng instansof «

var prototypes_or_Literals = function (obj) {
    switch (typeof(obj)) {
        // object prototypes
        case 'object':
            if (obj instanceof Array)
                return '[object Array]';
            else if (obj instanceof Date)
                return '[object Date]';
            else if (obj instanceof RegExp)
                return '[object regexp]';
            else if (obj instanceof String)
                return '[object String]';
            else if (obj instanceof Number)
                return '[object Number]';

            else
                return 'object';
        // object literals
        default:
            return typeof(obj);
    }   
};
output test «
prototypes_or_Literals( '' ) // "string"
prototypes_or_Literals( new String('') ) // "[object String]"
Object.prototype.toString.call("foo bar") //"[object String]"        

Kiểm tra toán tử so sánh == [Dữ liệu]. === [Dữ liệu, Loại đối tượng] Số JS luôn được lưu trữ dưới dạng số dấu phẩy động chính xác kép, theo tiêu chuẩn quốc tế IEEE 754. // Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
Yash

5
function isEmpty(obj) {
    if (typeof obj == 'number') return false;
    else if (typeof obj == 'string') return obj.length == 0;
    else if (Array.isArray(obj)) return obj.length == 0;
    else if (typeof obj == 'object') return obj == null || Object.keys(obj).length == 0;
    else if (typeof obj == 'boolean') return false;
    else return !obj;
}

Trong ES6 có trim để xử lý các chuỗi khoảng trắng:

const isEmpty = value => {
    if (typeof value === 'number') return false
    else if (typeof value === 'string') return value.trim().length === 0
    else if (Array.isArray(value)) return value.length === 0
    else if (typeof value === 'object') return value == null || Object.keys(value).length === 0
    else if (typeof value === 'boolean') return false
    else return !value
}

1
chức năng tuyệt vời, cảm ơn bạn! xử lý mọi loại giá trị - số bị bỏ sót trong tất cả các giải pháp khác!
Fabian von Ellerts

1
@FabianvonEllerts Xin đừng cố chỉnh sửa mã bổ sung thành câu trả lời của người khác. Đăng nó dưới dạng câu trả lời của riêng bạn, như một bình luận dưới câu trả lời, hoặc yêu cầu trong một bình luận rằng họ tự cập nhật câu trả lời.
TylerH

5

Nó có thể hữu ích.

Tất cả các giá trị trong mảng đại diện cho những gì bạn muốn trở thành (null, không xác định hoặc những thứ khác) và bạn tìm kiếm những gì bạn muốn trong đó.

var variablesWhatILookFor = [null, undefined, ''];
variablesWhatILookFor.indexOf(document.DocumentNumberLabel) > -1

2
bạn có thể giải thích chuyện gì đang xảy ra ở đó
JoshKisb

Mảng chứa một số biến mà bạn giả sử là trống.
ddagsan

@JoshKisb tất cả các giá trị trong mảng đại diện cho những gì bạn muốn trở thành (null, không xác định hoặc những thứ khác) và bạn tìm kiếm những gì bạn muốn trong đó.
ddagsan

1
@ddagsan Trong khi JoshKisb có thể đánh giá cao câu trả lời của bạn, bạn nên đưa lời giải thích của mình vào câu trả lời thay vì trong các bình luận
Nick

4

Nếu bạn đang sử dụng TypeScriptvà không muốn tính đến "các giá trị đó false" thì đây là giải pháp cho bạn:

Đầu tiên: import { isNullOrUndefined } from 'util';

Sau đó: isNullOrUndefined(this.yourVariableName)

Xin lưu ý: Như đã đề cập dưới đây, điều này hiện không được chấp nhận, value === undefined || value === nullthay vào đó hãy sử dụng . ref .


2
Tôi nghĩ rằng điều này thật tuyệt vời vì vậy ban đầu tôi đã bỏ qua, nhưng đó là một điều Node.js không được chấp nhận. Loại định nghĩa tệp cho biết:/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
Atomictom

@atomictom Tôi nghĩ đó là một typescriptđiều. Bạn có thể vui lòng cung cấp các liên kết của tài liệu của nó?
BlackBeard

Tại đây: nodejs.org/api/util.html#util_util_isnullorund xác_object . Ngoài ra: "Tôi nghĩ đây là mát mẻ vì vậy tôi ban đầu bỏ phiếu tán " mà nên đọc :)
atomictom

Tại sao sự phản đối một điều đơn giản hữu ích như thế này? geeeeee.
ticktock

3

Vắc xin

Tôi không khuyên bạn nên cố gắng xác định hoặc sử dụng hàm tính toán xem có giá trị nào trên toàn thế giới không. "Thực sự" có nghĩa là gì? Nếu tôi có let human = { name: 'bob', stomach: 'empty' }, nên isEmpty(human)trở về true? Nếu tôi có let reg = new RegExp('');, nên isEmpty(reg)trở về true? Thế còn isEmpty([ null, null, null, null ])- danh sách này chỉ chứa sự trống rỗng, vậy bản thân danh sách có trống không? Tôi muốn đưa ra ở đây một số lưu ý về "khoảng trống" (một từ có chủ ý tối nghĩa, để tránh các liên kết có sẵn) trong javascript - và tôi muốn tranh luận rằng "khoảng trống" trong các giá trị javascript không bao giờ nên được xử lý một cách khái quát.


Sự thật / giả dối

Để quyết định làm thế nào để xác định "độ trống" của các giá trị, chúng ta cần phải bổ sung sẵn nội dung của javascript, ý thức vốn có về việc các giá trị là "trung thực" hay "giả mạo". Đương nhiên, nullundefinedcả hai đều là "giả". Ít tự nhiên hơn, số 0(và không có số nào khác ngoại trừ NaN) cũng là "giả". Ít nhất là tự nhiên: ''là giả, nhưng []{}(và new Set(), và new Map()) là sự thật - mặc dù tất cả đều có vẻ trống rỗng như nhau!


Null vs Không xác định

Ngoài ra còn có một số cuộc thảo luận liên quan đến nullvs undefined- chúng ta có thực sự cần cả hai để thể hiện sự trống rỗng trong các chương trình của mình không? Cá nhân tôi tránh bao giờ có các chữ cái u, n, d, e, f, i, n, e, d xuất hiện trong mã của tôi theo thứ tự đó. Tôi luôn luôn sử dụng nullđể biểu thị "sự trống rỗng". Mặc dù vậy, một lần nữa, chúng ta cần thể hiện ý thức vốn có của javascript về cách thức nullvà sự undefinedkhác biệt:

  • Cố gắng truy cập vào một tài sản không tồn tại cho undefined
  • Bỏ qua một tham số khi gọi một hàm dẫn đến việc nhận tham số đó undefined:

let f = a => a;
console.log(f('hi'));
console.log(f());

  • Các tham số có giá trị mặc định chỉ nhận mặc định khi được cung cấp undefined, không null:

let f = (v='hello') => v;
console.log(f(null));
console.log(f(undefined));


Vắc xin không chung chung

Tôi tin rằng sự trống rỗng không bao giờ nên được xử lý theo cách chung chung. Thay vào đó, chúng ta nên luôn luôn có sự nghiêm ngặt để có thêm thông tin về dữ liệu của mình trước khi xác định xem nó có bị bỏ trống không - tôi chủ yếu làm điều này bằng cách kiểm tra loại dữ liệu nào tôi đang xử lý:

let isType = (value, Cls) => {
  try {
    return Object.getPrototypeOf(value).constructor === Cls;
  } catch(err) {
    return false;
  }
};

Lưu ý rằng hàm này bỏ qua tính đa hình - nó dự kiến valuelà một thể hiện trực tiếp Clsvà không phải là một thể hiện của một lớp con của Cls. Tôi tránh instanceofvì hai lý do chính:

  • ([] instanceof Object) === true ("Một mảng là một đối tượng")
  • ('' instanceof String) === false ("Chuỗi không phải là Chuỗi")

Lưu ý rằng Object.getPrototypeOfđược sử dụng để tránh trường hợp như thế let v = { constructor: String };Các isTypechức năng vẫn trả về đúng cho isType(v, String)(false), và isType(v, Object)(true).

Nhìn chung, tôi khuyên bạn nên sử dụng isTypechức năng này cùng với các mẹo sau:

  • Giảm thiểu số lượng giá trị xử lý mã của loại không xác định. Ví dụ, cho let v = JSON.parse(someRawValue);, vbiến của chúng tôi bây giờ là loại không xác định. Càng sớm càng tốt, chúng ta nên hạn chế khả năng của mình. Cách tốt nhất để làm điều này có thể là bằng cách yêu cầu một loại cụ thể: ví dụ: if (!isType(v, Array)) throw new Error('Expected Array');đây là cách thực sự nhanh chóng và biểu cảm để loại bỏ bản chất chung của vvà đảm bảo nó luôn luôn là một Array. Đôi khi, mặc dù, chúng ta cần phải cho phép vcó nhiều loại. Trong những trường hợp đó, chúng ta nên tạo các khối mã vkhông còn chung chung, càng sớm càng tốt:

if (isType(v, String)) {
  /* v isn't generic in this block - It's a String! */
} else if (isType(v, Number)) {
  /* v isn't generic in this block - It's a Number! */
} else if (isType(v, Array)) {
  /* v isn't generic in this block - it's an Array! */
} else {
  throw new Error('Expected String, Number, or Array');
}

  • Luôn sử dụng "danh sách trắng" để xác nhận. Nếu bạn yêu cầu một giá trị là, ví dụ: Chuỗi, Số hoặc Mảng, hãy kiểm tra 3 khả năng "trắng" đó và ném Lỗi nếu không có gì trong số 3 được thỏa mãn. Chúng ta nên có thể thấy rằng việc kiểm tra đối với khả năng "đen" không phải là rất hữu ích: Nói chúng tôi viết if (v === null) throw new Error('Null value rejected');- điều này là rất tốt cho việc đảm bảo rằng nullgiá trị này không làm cho nó qua, nhưng nếu một giá trị không làm cho nó qua, chúng tôi vẫn biết khó bất cứ thứ gì về nó. Một giá trị vvượt qua kiểm tra null này vẫn còn RẤT chung chung - đó là bất cứ điều gì nhưngnull ! Danh sách đen hầu như không xua tan sự chung chung.
  • Trừ khi một giá trị là null, không bao giờ coi "một giá trị trống". Thay vào đó, hãy xem xét "một chữ X trống". Về cơ bản, không bao giờ xem xét làm bất cứ điều gì như if (isEmpty(val)) { /* ... */ }- cho dù isEmptychức năng đó được thực hiện như thế nào (tôi không muốn biết ...), điều đó không có ý nghĩa! Và đó là cách quá chung chung! Độ trống chỉ nên được tính toán với kiến ​​thức về valloại. Kiểm tra phòng ngừa nên như thế này:

    • "Một chuỗi, không có ký tự": if (isType(val, String) && val.length === 0) ...
    • "Một đối tượng, với 0 đạo cụ": if (isType(val, Object) && Object.entries(val).length === 0) ...
    • "Một số, bằng hoặc nhỏ hơn 0": if (isType(val, Number) && val <= 0) ...
    • "Một mảng, không có mục nào": if (isType(val, Array) && val.length === 0) ...

    • Ngoại lệ duy nhất là khi nullđược sử dụng để biểu thị chức năng nhất định. Trong trường hợp này, thật ý nghĩa khi nói: "Một giá trị trống":if (val === null) ...


Tôi có thể thấy bạn đã suy nghĩ một chút về điều này:>
Rui Marques

3

Hãy thử với logic khác nhau . Bạn có thể sử dụng mã dưới đây để kiểm tra tất cả bốn (4) điều kiện để xác thực như không null, không trống, không xác định và không zero chỉ sử dụng mã này (! (! (Biến))) trong javascript và jquery.

function myFunction() {
    var data;  //The Values can be like as null, blank, undefined, zero you can test

    if(!(!(data)))
    {
        alert("data "+data);
    } 
    else 
    {
        alert("data is "+data);
    }
}

3

Hãy xem toán tử kết hợp ECMAScript Nullish mới

Bạn có thể nghĩ về tính năng này - ??nhà điều hành - như một cách để đưa rơi trở lại giá trị mặc định khi giao dịch với nullhoặc undefined.

let x = foo ?? bar();

Một lần nữa, đoạn mã trên tương đương với đoạn sau.

let x = (foo !== null && foo !== undefined) ? foo : bar();

2
function isEmpty(val){
    return !val;
}

nhưng giải pháp này được thiết kế quá mức, nếu bạn không muốn sửa đổi chức năng sau này cho các nhu cầu mô hình busines, thì sẽ sạch hơn để sử dụng nó trực tiếp trong mã:

if(!val)...

2
var myNewValue = myObject && myObject.child && myObject.child.myValue;

Điều này sẽ không bao giờ ném một lỗi. Nếu myObject , con hoặc myValue là null thì myNewValue sẽ là null. Không có lỗi sẽ được ném


2

Đối với tất cả mọi người đến đây vì có câu hỏi tương tự, những điều sau đây rất tuyệt và tôi có nó trong thư viện của tôi những năm qua:

(function(g3, $, window, document, undefined){
   g3.utils = g3.utils || {};
/********************************Function type()********************************
* Returns a lowercase string representation of an object's constructor.
* @module {g3.utils}
* @function {g3.utils.type}
* @public
* @param {Type} 'obj' is any type native, host or custom.
* @return {String} Returns a lowercase string representing the object's 
* constructor which is different from word 'object' if they are not custom.
* @reference http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
* http://stackoverflow.com/questions/3215046/differentiating-between-arrays-and-hashes-in-javascript
* http://javascript.info/tutorial/type-detection
*******************************************************************************/
g3.utils.type = function (obj){
   if(obj === null)
      return 'null';
   else if(typeof obj === 'undefined')
      return 'undefined';
   return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
};
}(window.g3 = window.g3 || {}, jQuery, window, document));

2

Nếu bạn muốn tránh nhận đúng nếu giá trị là bất kỳ giá trị nào sau đây, theo câu trả lời của jAndy :

  • vô giá trị
  • chưa xác định
  • NaN
  • chuỗi rỗng ("")
  • 0
  • sai

Một giải pháp khả thi có thể tránh nhận được các giá trị trung thực là:

function isUsable(valueToCheck) {
    if (valueToCheck === 0     || // Avoid returning false if the value is 0.
        valueToCheck === ''    || // Avoid returning false if the value is an empty string.
        valueToCheck === false || // Avoid returning false if the value is false.
        valueToCheck)             // Returns true if it isn't null, undefined, or NaN.
    {
        return true;
    } else {
        return false;
    }
}

Nó sẽ được sử dụng như sau:

if (isUsable(x)) {
    // It is usable!
}
// Make sure to avoid placing the logical NOT operator before the parameter (isUsable(!x)) and instead, use it before the function, to check the returned value.
if (!isUsable(x)) {
    // It is NOT usable!
}

Ngoài các kịch bản đó, bạn có thể muốn trả về false nếu đối tượng hoặc mảng trống:

  • Đối tượng: {} (Sử dụng ECMA 7+ )
  • Mảng: [] (Sử dụng ECMA 5+ )

Bạn sẽ đi về nó theo cách này:

function isEmptyObject(valueToCheck) {
    if(typeof valueToCheck === 'object' && !Object.keys(valueToCheck).length){
        // Object is empty!
        return true;
    } else {
        // Object is not empty!
        return false;
    }
}

function isEmptyArray(valueToCheck) {
    if(Array.isArray(valueToCheck) && !valueToCheck.length) {
        // Array is empty!
        return true;
    } else {
        // Array is not empty!
        return false;
    }
}

Nếu bạn muốn kiểm tra tất cả các chuỗi khoảng trắng (""), bạn có thể làm như sau:

function isAllWhitespace(){
    if (valueToCheck.match(/^ *$/) !== null) {
        // Is all whitespaces!
        return true;
    } else {
        // Is not all whitespaces!
        return false;
    }
}

Lưu ý: hasOwnPropertytrả về true cho các chuỗi rỗng, 0, false, NaN, null và không xác định, nếu biến được khai báo là bất kỳ trong số chúng, vì vậy nó có thể không phải là tốt nhất để sử dụng. Hàm này có thể được sửa đổi để sử dụng nó để hiển thị rằng nó đã được khai báo, nhưng không thể sử dụng được.


2

Mã trên GitHub

const isEmpty = value => (
  (!value && value !== 0 && value !== false)
  || (Array.isArray(value) && value.length === 0)
  || (isObject(value) && Object.keys(value).length === 0)
  || (typeof value.size === 'number' && value.size === 0)

  // `WeekMap.length` is supposed to exist!?
  || (typeof value.length === 'number'
      && typeof value !== 'function' && value.length === 0)
);

// Source: https://levelup.gitconnected.com/javascript-check-if-a-variable-is-an-object-and-nothing-else-not-an-array-a-set-etc-a3987ea08fd7
const isObject = value =>
  Object.prototype.toString.call(value) === '[object Object]';

Bài kiểm tra của người nghèo

const test = () => {
  const run = (label, values, expected) => {
    const length = values.length;
    console.group(`${label} (${length} tests)`);
    values.map((v, i) => {
      console.assert(isEmpty(v) === expected, `${i}: ${v}`);
    });
    console.groupEnd();
  };

  const empty = [
    null, undefined, NaN, '', {}, [],
    new Set(), new Set([]), new Map(), new Map([]),
  ];
  const notEmpty = [
    ' ', 'a', 0, 1, -1, false, true, {a: 1}, [0],
    new Set([0]), new Map([['a', 1]]),
    new WeakMap().set({}, 1),
    new Date(), /a/, new RegExp(), () => {},
  ];
  const shouldBeEmpty = [
    {undefined: undefined}, new Map([[]]),
  ];

  run('EMPTY', empty, true);
  run('NOT EMPTY', notEmpty, false);
  run('SHOULD BE EMPTY', shouldBeEmpty, true);
};

Kết quả kiểm tra:

EMPTY (10 tests)
NOT EMPTY (16 tests)
SHOULD BE EMPTY (2 tests)
  Assertion failed: 0: [object Object]
  Assertion failed: 1: [object Map]

chức năng tuyệt vời, tất cả các câu trả lời khác ở đây có nhiều vấn đề mà bạn xuất hiện để giải quyết, tôi chỉ ước tôi đã tìm thấy nó trước khi tôi tự viết: p nghĩ rằng bạn có thể muốn xem stackoverflow.com/ của tôi câu hỏi / 5515 310 / Thẻ cả hai chức năng của chúng tôi dường như có cùng một đầu ra nhưng tôi đã cắt giảm mã một chút. Xin vui lòng cho tôi biết nếu tôi bỏ lỡ bất cứ điều gì.
Sean Bannister

Bạn đã thử "Bài kiểm tra của người nghèo" chưa? Tôi nghĩ rằng tôi đã kết thúc việc thêm nhiều bài kiểm tra trong hàm cho các trường hợp đặc biệt như Map, WeakMap và có thể cả Date, RegExp. Bạn có chắc chắn về bạn value.constructor === Object? Kiểm tra này .
Pascal Polleunus

Có, tôi đã chạy thử nghiệm của bạn, cảm ơn vì những điều đó, cả hai chức năng của chúng tôi đều trả lại kết quả giống nhau với cả hai thử nghiệm của chúng tôi. Tôi tiếp tục tự hỏi nếu tôi thiếu một cái gì đó bên ngoài các trường hợp thử nghiệm. Tôi tin value.constructor === Objectlà ổn, trong javascript IF các câu lệnh OR có thứ tự thực hiện để câu lệnh OR sẽ chỉ thực thi nếu trước đó không trả về TRUE và chúng tôi đã kiểm tra Null. Trong thực tế, mục đích duy nhất của câu lệnh OR cuối cùng đó là phát hiện {}và đảm bảo nó không trả về ĐÚNG cho những thứ không nên.
Sean Bannister

1

Điều này sẽ kiểm tra xem biến số của lồng không xác định là không xác định

function Undef(str) 
{
  var ary = str.split('.');
  var w = window;
  for (i in ary) {
    try      { if (typeof(w = w[ary[i]]) === "undefined") return true; }
    catch(e) { return true; }
  }
  return false;
}

if (!Undef("google.translate.TranslateElement")) {

Các kiểm tra ở trên nếu chức năng dịch Google DịchEEuity tồn tại. Điều này tương đương với:

if (!(typeof google === "undefined" 
 || typeof google.translate === "undefined" 
 || typeof google.translate.TranslateElement === "undefined")) {

1

Toán tử chuỗi tùy chọn cung cấp một cách để đơn giản hóa việc truy cập các giá trị thông qua các đối tượng được kết nối khi có thể tham chiếu hoặc hàm có thể không được xác định hoặc null.

let customer = {
  name: "Carl",
  details: {
    age: 82,
    location: "Paradise Falls" // detailed address is unknown
  }
};
let customerCity = customer.details?.address?.city;

Toán tử kết hợp nullish có thể được sử dụng sau khi xâu chuỗi tùy chọn để tạo giá trị mặc định khi không tìm thấy:

let customer = {
  name: "Carl",
  details: { age: 82 }
};
const customerCity = customer?.city ?? "Unknown city";
console.log(customerCity); // Unknown city

1
function notEmpty(value){
  return (typeof value !== 'undefined' && value.trim().length);
}

nó cũng sẽ kiểm tra các khoảng trắng ('') cùng với:

  • null, không xác định, NaN, trống, chuỗi (""), 0, sai

0

Tôi nghĩ rằng sử dụng? Toán tử sạch hơn một chút.

var ? function_if_exists() : function_if_doesnt_exist();
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.