Câu hỏi Có hàm chuẩn nào để kiểm tra các biến rỗng, không xác định hoặc biến trống trong JavaScript không?


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

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

1609
2018-04-01 15:14


gốc


có thể trùng lặp Làm thế nào để bạn kiểm tra một chuỗi rỗng trong JavaScript? - Dour High Arch
Tôi đã làm một câu đố để thử nghiệm: jsfiddle.net/J7m7m/886 - D-Money
Protip, không bao giờ làm (truthy statement) ? true : false;. Cứ làm đi (truthy statement);. - David Baucum
Có thể trùng lặp Làm thế nào để bạn kiểm tra một chuỗi rỗng trong JavaScript? - George Jempty
@GeorgeJempty không phải là một kẻ lừa đảo, vì câu trả lời khác hỏi về dây đặc biệt, trong khi điều này hỏi về biến. - Madbreaks


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


Bạn chỉ có thể kiểm tra xem biến có một truthy giá trị hay không. Điêu đo co nghia la

if( value ) {
}

sẽ đánh giá true nếu value Là không phải:

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

Danh sách trên đại diện cho tất cả có thể falsy giá trị trong ECMA- / Javascript. Tìm nó trong đặc điểm kỹ thuật tại ToBoolean phần.

Hơn nữa, nếu bạn không biết cho dù một biến tồn tại (có nghĩa là, nếu nó là khai báo) bạn nên kiểm tra với typeof nhà điều hành. 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 biến được khai báo ít nhất, bạn nên trực tiếp kiểm tra xem nó có truthy giá trị như được hiển thị ở trên.

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


3313
2018-04-01 15:17



Điều gì 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
@ TruMan1: trong trường hợp như vậy (nơi logic của bạn ra lệnh xác thực) bạn phải đi như if( value || value === false ). Cùng đi cho tất cả giá trị giả, chúng tôi cần xác thực cho những người đó một cách rõ ràng. - jAndy
Ngoại trừ nếu giá trị là một mảng. Giải thích về truthy có thể gây hiểu lầm. Trong trường hợp đó chúng ta nên kiểm tra value.length != 0 cho một mảng không trống. - user
Chỉ muốn thêm rằng nếu bạn cảm thấy if xây dựng là cú pháp quá nặng, bạn có thể sử dụng toán tử ternary, như sau: var result = undefined ? "truthy" : "falsy". Hoặc nếu bạn chỉ muốn ép buộc thành giá trị boolean, hãy sử dụng !! toán tử, ví dụ: !!1 // true, !!null // false. - KFL
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. - Christophe Roussy


Phương thức verbose để kiểm tra nếu giá trị là undefined hoặc null là:

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

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

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

151
2018-04-01 15:20



Chỉ kiểm tra null hoặc là undefined có thể được thực hiện như vậy: if (value == null). Tâm trí == toán tử coerces. 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 coerces như thế nào. webreflection.blogspot.nl/2010/10/… - Christiaan Westerbeek
@ChristiaanWesterbeek: quan điểm của bạn arg == null tạ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
arg == null khá phổ biến trong trải nghiệm của tôi. - Bryan Downing
return value === (void 0) an toàn hơn thử nghiệm undefined đó cũng có thể là một biến hợp pháp trong phạm vi, thật đáng buồn. - x0n
@Sharky Có sự khác biệt giữa một biến không xác định và biến chưa khai báo: lucybain.com/blog/2014/null-undefined-undeclared - Christiaan Westerbeek


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

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

undefined  // Because undefined == null

null

[]

""

và các hàm đối số 0 vì hàm length là số tham số được khai báo cần.

Để 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 === '');
}

55
2018-04-01 15:19



undefined == null nhưng undefined !== null - Ian Boyd
@IanBoyd đó là bởi vì bạn đang so sánh == đến ===. điều này có nghĩa là undefined == null (true) undefined = = null (false) undefined === null (false) undefined! == null (true) sẽ tốt hơn để cung cấp thêm một chút thông tin để trở nên hữu ích và thúc đẩy mọi người đi đúng hướng. moz doc về sự khác biệt developer.mozilla.org/en-US/docs/Web/JavaScript/… - Corey Young
@ AdamLeggett, sự thật không thâm nhập vào nó. - Mike Samuel
Xin lỗi, tôi hiểu sai. - Adam Leggett


Tôi biết đây là một câu hỏi cũ, nhưng đây là kiểm tra an toàn nhất và tôi đã không nhìn 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ị chưa bao giờ được xác định và cũng có bất kỳ điều nào sau đây:

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

P.S. không cần sự bình đẳng nghiêm ngặt trong typeof value! = 'không xác định'


26
2017-11-10 16:13



Có gì với cuộc bỏ phiếu xuống? Một số người cuồng tín bình đẳng nghiêm ngặt trong nhà. Oh chờ đợi, bạn đã được bảo để luôn luôn sử dụng bình đẳng nghiêm ngặt và bạn luôn luôn làm những gì bạn đã được nói, phải không? - guya
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 nhu cầu chuyển đổi loại ngầm định so với so sánh nghiêm ngặt nên được sử dụng. - J.Steve
Thanx cho bình luận của bạn Steve. Quy tắc chung đó là tốt. Tôi chỉ mong đợi cho ppl để hiểu lý do tại sao họ sử dụng một hoặc khác. Mỗi cách bạn nhìn ppl sẽ được vui mừng để rao giảng bạn về "luôn luôn sử dụng nghiêm ngặt" - như nó là điều quan trọng nhất trong Javascript. Tôi đã thấy quá nhiều trường hợp như if (val! == null) mà rõ ràng dẫn đến kết quả không mong muốn. Thật tốt khi nói rằng khi nghi ngờ - sử dụng nghiêm ngặt, nhưng tốt hơn là không nghi ngờ gì. - guya
Tôi nghĩ điểm ở đây là chúng tôi mong đợi typeof toán tử trả về một chuỗi để sử dụng kiểm tra bình đẳng nghiêm ngặt về mặt kỹ thuật là 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 xung quanh. Cũng thế val !== null hoàn toàn hợp lệ trong nhiều trường hợp - tôi luôn làm như vậy. Tôi đồng ý với đối số không phù hợp của bạn, nhưng tôi nghĩ rằng đây là một ví dụ nghèo để làm cho nó với. Không cố gắng troll bạn. - Bryan Downing
Thanx cho bình luận của bạn Bryan, Bạn sử dụng val! == null vì bạn biết những gì bạn đang làm. Một người mới bắt đầu sẽ muốn có một dự phòng khi val là giả. Tuy nhiên, val sẽ không bao giờ rỗng, nó sẽ không được xác định. Nếu chỉ có anh ta không nghe lời khuyên đó để “luôn luôn sử dụng nghiêm ngặt” anh ta sẽ có ít 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à diff diff sẽ bị dư thừa. Vì vậy, lập luận duy nhất cho việc sử dụng nghiêm ngặt trong trường hợp trên là nhất quán. Tôi đã nói “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 làm cho mã của bạn nhất quán hơn. - guya


Câu trả lời đầu tiên với xếp hạng tốt nhất là sai. Nếu giá trị không xác định, nó sẽ ném một 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)

25
2018-03-19 13:23



eee ... Tôi nghĩ rằng điều này là sai, nếu như (giá trị) là đủ (trừ các đối tượng / mảng trống). nếu giá trị là 'không xác định' thì sự đồng ý 'if' sẽ không qua. - Oskar Szura
Điều này conflates biến mà không được xác định (mà ném một ReferenceError về đánh giá), mà là khác nhau với các biến với undefined giá trị. - Qantas 94 Heavy
Tôi gặp lỗi tương tự ở đây. nếu (x), nếu (! x), nếu (!! x) tất cả sẽ ném lỗi nếu x là 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ề sai khi value là số không, là không phải những gì op đang tìm kiếm. - Madbreaks


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

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

Hoặc trong ES7 (bình luận 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

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


23
2018-02-12 10:32



+1 nó là hữu ích để biết các đối tượng của loại 'regexp', 'mảng' và 'hàm' - Yash
@Vix, tại sao phiên bản ES7 lại tốt hơn? - GollyJer
Nó không phải là, đã thử nghiệm với nhiều cách dễ đọc hơn để thể hiện cùng một chức năng làm cho việc sử dụng của: destructuring assignment, bind operator. - Vix
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. Đó là một đề xuất giai đoạn 0 (strawman) để được giới thiệu về ngôn ngữ. - Simon Kjellberg


! kiểm tra các chuỗi rỗng (""), null, undefined, false và số 0 và NaN. Nói, nếu một chuỗi rỗng var name = "" sau đó console.log(!name) trả về true.

function isEmpty(val){
  return !val;
}

hàm này sẽ trả về true nếu val Là trống, không, không xác định, sai, số 0 hoặc NaN.


16
2018-01-23 06:56



Đ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 cấu thành một giá trị rỗng. Giá trị của việc có một hàm isEmpty sẽ là để đảm bảo các giá trị mà bạn mong đợi là rỗng trả về true. theo quan điểm của tôi là null, undefined, NaN và một chuỗi rỗng là các giá trị có ý nghĩa là rỗng. - Corey Young
Tại sao sử dụng isEmpty(val) nếu bạn có thể làm !val? - Allen Linatoc
Điêu đo phụ thuộc vao bạn. Bạn có thể sử dụng nó để tăng khả năng đọc. Nếu không, nếu bạn nghĩ rằng nhóm bạn làm việc họ là người lập trình nâng cao hơn, thì bạn có thể sử dụng !val hoặc là !!val theo miền vấn đề của bạn. - Arif


Bạn là một chút lạm dụng nó. Để kiểm tra nếu một biến không được đưa ra một giá trị, bạn sẽ chỉ cần kiểm tra đối với undefined và null.

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

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


10
2018-04-01 15:21



Chỉ kiểm tra null hoặc là undefined có thể được thực hiện như vậy: if (value == null). Tâm trí == toán tử coerces. 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 coerces như thế nào. webreflection.blogspot.nl/2010/10/… - Christiaan Westerbeek


Đây là của tôi - trả về true nếu giá trị là null, undefined, etc hoặc blank (tức là chỉ chứa các khoảng trống):

function stringIsEmpty(value) {

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

}

9
2018-02-12 15:45





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

Nếu không, nếu bạn đã sử dụng dấu gạch dưới hoặc lodash, hãy thử:

_.isEmpty(value)

7
2017-08-21 13:39



Đã thử mã của bạn. Tôi nhận được một thông báo lỗi trong giao diện điều khiển cho biết: "Lỗi tham chiếu không bắt buộc: isArray () không được xác định". Nếu không, sẽ là tuyệt vời nếu nó hoạt động. - crmprogdev
Trong trường hợp của lodash ít nhất, _.isNil là 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
JavaScript đơn giản không có isArray hoặc là isString chức năng trên window. - GFoley83
@ GFoley83 - Bạn bắt gặp tôi! Tôi có lý do 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ự tiến triển của các ngôn ngữ phần mềm. Thông tin có liên quan hơn có thể sẽ là cuộc thảo luận / mã trình bày Xử lý Lỗi Monadic trong 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


Kiểm tra tình trạng này

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

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


6
2018-05-01 21:01



điều này ném một lỗi: Uncaught ReferenceError: foo is not defined - MonOve
Tôi cho rằng đây chỉ là một đoạn. Nhưng if đã thực hiện kiểm tra lỗi, điều này chỉ chuyển thành Boolean. Nó có bắt được bất kỳ trường hợp nào bình thường không if(foo) không bắt? - Daan van Hulst
Điều này là hoàn hảo cho 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 (gọi là hoạt động) đó là sự thật khi một chuỗi không có sản phẩm nào - một tuyên bố nếu sẽ là quá mức cần thiết để tôi chỉ có thể sử dụng active={!!foo} - Ben Kolya Mansley