Tất cả các giá trị falsey trong JavaScript


215

Các giá trị trong JavaScript là 'falsey' là gì , có nghĩa là họ đánh giá như sai trong các biểu thức như if(value), value ?!value?


Đã có một số cuộc thảo luận về mục đích của các giá trị falsey trên Stack Overflow , nhưng không có câu trả lời đầy đủ hoàn chỉnh liệt kê tất cả các giá trị falsey là gì.

Tôi không thể tìm thấy bất kỳ danh sách đầy đủ nào về MDN JavaScript Reference và tôi đã ngạc nhiên khi thấy rằng kết quả hàng đầu khi tìm kiếm một danh sách đầy đủ, có thẩm quyền của các giá trị falsey trong JavaScript là các bài viết trên blog, một số trong đó có thiếu sót rõ ràng (ví dụ: NaN) và không ai trong số đó có định dạng như Stack Overflow, nơi có thể thêm ý kiến ​​hoặc câu trả lời thay thế để chỉ ra những điều kỳ quặc, bất ngờ, thiếu sót, sai lầm hoặc cảnh giác. Vì vậy, nó dường như có ý nghĩa để làm cho một.



1
@tibos blog.stackoverflow.com/2011/07/ Mạnh
user56reinstatemonica8

5
dorey.github.io/JavaScript-Equality-Table là một tài nguyên tuyệt vời và có một if()tab cho tính trung thực.
đám mây

4
Wow, thực sự hữu ích, cảm ơn! [[]] == ""nhưng [] != []? Đầu tôi đau ...
user56reinstatemonica8

Thông số kỹ thuật ECMA 262 chi tiết các quy tắc so sánh này, cụ thể từ giây 11.9.1 đến 11.9.6: ecma-i Intl.org/ecma-262/5.1/#sec-11.9.3 Sẽ rất phù hợp nếu bạn cập nhật câu trả lời của mình để đưa vào tài liệu tham khảo này , vì nó cung cấp các quy tắc về cách xác định đúng / sai (được cho là) ​​được thực hiện.
Shaun Wilson

Câu trả lời:


367

Giá trị Falsey trong JavaScript

  • false
  • Zero của Numberloại: 0và cũng -0, 0.0và hình thức hex 0x0( nhờ RBT )
  • Không có BigIntloại: 0n-0n(mới vào năm 2020, cảm ơn GetMeARemoteJob )
  • "", ''``- chuỗi có độ dài 0
  • null
  • undefined
  • NaN
  • document.all (chỉ trong trình duyệt HTML)
    • Đây là một thứ kì dị. document.alllà một đối tượng falsey, với typeofnhư undefined. Đó là một chức năng thuộc sở hữu của Microsoft trong IE trước IE11 và đã được thêm vào thông số HTML dưới dạng "vi phạm cố ý của đặc tả JavaScript" , ví dụ như các trang web được viết cho IE sẽ không cố gắng truy cập document.all.something; đó là giả mạo vì if (document.all)từng là một cách phổ biến để phát hiện IE, trước các bình luận có điều kiện. Xem tại sao document.all giả? để biết chi tiết

"Falsey" đơn giản có nghĩa là ToBooleanhàm nội bộ của JavaScript trả về false. ToBooleancơ sở !value, value ? ... : ...;if (value). Đây là thông số kỹ thuật chính thức của nó (bản nháp hoạt động năm 2020) (những thay đổi duy nhất kể từ khi đặc tả ECMAscript đầu tiên vào năm 1997 là việc bổ sung các Biểu tượng của ES6 , luôn luôn đúng và BigIntđược đề cập ở trên:

Không xác định: Trả về false.  Null: Trả về false.  Boolean: Trả về đối số.  Số: Nếu đối số là +0, -0 hoặc NaN, trả về false;  Nếu không thì trả lại đúng.  Chuỗi: Nếu đối số là Chuỗi rỗng (độ dài của nó bằng 0), trả về false;  Nếu không thì trả lại đúng.  BigInt: Nếu đối số là 0n, trả về false;  Nếu không thì trả lại đúng.  Biểu tượng: Trả về đúng.  Đối tượng: Trả về đúng.


So sánh với == (bình đẳng lỏng lẻo)

Thật đáng để nói về những so sánh lỏng lẻo== của các giá trị giả, với việc sử dụng ToNumber()và có thể gây ra một số nhầm lẫn do sự khác biệt cơ bản. Họ có hiệu quả hình thành ba nhóm:

Với "đẳng thức nghiêm ngặt" ( ===), không có các nhóm như vậy. Chỉ false === false.

Đây là một trong những lý do tại sao nhiều nhà phát triển và nhiều hướng dẫn phong cách (ví dụ: Standardjs ) thích ===và hầu như không bao giờ sử dụng ==.


Giá trị thật mà == false

"Truthy" đơn giản có nghĩa là ToBooleanhàm nội bộ của JavaScript trả về true. Một điều không hay về Javascript để nhận biết (và một lý do chính đáng khác để thích ===hơn ==): có thể giá trị là sự thật ( ToBooleantrả về true), nhưng cũng có thể == false.

Bạn có thể nghĩ if (value && value == false) alert('Huh?')là một sự bất khả thi logic không thể xảy ra, nhưng nó sẽ, cho:

  • "0"'0'- chúng là các chuỗi không trống, là sự thật, nhưng Javascript ==khớp với các số có chuỗi tương đương (ví dụ 42 == "42"). Kể từ khi 0 == false, nếu "0" == 0, "0" == false.
  • new Number(0)new Boolean(false)- chúng là những đối tượng, là sự thật, nhưng ==nhìn thấy giá trị của chúng == false.
  • 0 .toExponential(); - một đối tượng có giá trị bằng số tương đương với 0
  • Bất kỳ cấu trúc tương tự nào cung cấp cho bạn một giá trị bằng nhau được bọc trong một loại là sự thật
  • [], [[]][0](nhờ cloudfeet cho liên kết Javascript Bình đẳng Bảng )

Một số giá trị trung thực hơn

Đây chỉ là một vài giá trị mà một số người có thể mong đợi là chim ưng, nhưng thực sự là sự thật.

  • -1 và tất cả các số âm khác không
  • ' ', " ", "false", 'null'... tất cả chuỗi không trống, bao gồm chuỗi mà chỉ là khoảng trắng
  • Bất cứ thứ gì từ typeof, luôn trả về một chuỗi không trống, ví dụ:

    • typeof null(trả về một chuỗi 'object' do lỗi / quirk lâu )
    • typeof undefined(trả về một chuỗi 'undefined')
  • Bất kỳ đối tượng nào (ngoại trừ "vi phạm cố ý" document.alltrong trình duyệt; hãy nhớ rằng đó nullkhông thực sự là một đối tượng mặc dù có typeofđề xuất khác). Kể cả:

    • {}
    • []
    • function(){}hoặc () => {}(bất kỳ chức năng nào, bao gồm các chức năng trống)
    • Error và bất kỳ trường hợp nào của Error
    • Bất kỳ biểu thức chính quy
    • Bất cứ điều gì được tạo ra với new(bao gồm new Number(0)new Boolean(false))
  • Bất kỳ biểu tượng

true, 1, "1"[1]trở lại truekhi so sánh với nhau bằng ==.


3
FYI, những gì !, if?..:có điểm chung là họ gọi ToBooleanhàm nội bộ trên giá trị. Làm thế nào những giá trị ứng xử trong bối cảnh !, ifvv đã được ngụ ý bởi tên của họ: Họ là những giá trị "falsy". Tôi là một chút sợ rằng những người khác sẽ đọc các câu trả lời và nghĩ rằng "Ồ vậy ra trong bối cảnh này ( !, if, ?...:), giá trị là false, nhưng với !!, nó true" , nhưng không hiểu các khái niệm cơ bản. Hai điểm khác: 1) v ? true : falsechỉ là một cách dài dòng !!v. 2) typeof luôn trả về một chuỗi không trống, đó là sự thật.
Felix Kling

1
Tức là không có điểm trong việc nhìn vào typeof nullhoặc typeof undefinedcụ thể. Bạn chỉ có thể nói rằng các chuỗi không trống là sự thật.
Felix Kling

1
Tôi hiểu, nhưng điều này không liên quan gì đến câu hỏi ban đầu;) Thêm quá nhiều thông tin có liên quan nhưng không liên quan có thể gây nhầm lẫn cho độc giả.
Felix Kling

5
Tôi vừa mới học được rằng đó document.all giả.
Claudiu

3
Về so sánh lỏng lẻo: bởi vì Booleans được chuyển đổi thành số, x == falsesẽ gọi ToNumber(x)đó là rất khác nhau ToBoolean(x). Có thể đáng để giải thích. Ngoài ra tôi chỉ nhận thấy rằng tôi đã nhận xét về câu trả lời này từ lâu: D
Felix Kling

3

Đừng quên chuỗi không trống "false"để đánh giátrue


8
Vì vậy, không phải là một giá trị giả, mà được yêu cầu?
Bergi

5
cảm động đó là một giá trị mà bạn có thể mong đợi là chim ưng và không, điều này vẫn đáng được biết đến, và tôi nghĩ, công đức được đề cập trong một danh sách toàn diện
MrMcPlad

4
Đã thêm vào danh sách ... nhưng chúng ta đừng cố biến điều này thành một danh sách toàn diện về tất cả các giá trị trung thực có thể có! :-)
Sẽ

3

Chỉ cần thêm vào danh sách các giá trị giả mạo của @ user568458:

  • Ngoài số nguyên 0, số thập phân 0,0, 0,00 hoặc bất kỳ số 0 nào như vậy cũng là một giá trị giả.

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    Đoạn mã trên I am a falsy value

  • Tương tự biểu diễn hex của số 0 cũng là một giá trị giả như trong đoạn mã dưới đây:

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }   
    else {
        console.log('I am a falsy value');
    }

    Đoạn mã trên một lần nữa in I am a falsy value.


7
JavaScript không có số nguyên. 0, 0x0, 0.00.00là literals chỉ khác nhau cho cùng một IEEE-754 64-bit dấu chấm động giá trị zero.
dòng chảy

1

Ngoài chủ đề, kể từ ES2020, chúng tôi có một giá trị mới là giả, đó là BigInt zero (0n):

0n == false // true
-0n == false // true

Vì vậy, với điều này, hiện tại chúng ta có tổng cộng 7 giá trị "giả" (không bao gồm document.all như người dùng đã đề cập ở trên vì đây là một phần của DOM chứ không phải là JS).


1
Đẹp! Cảm ơn, tôi chưa nghe về điều đó, tôi đã thêm nó vào danh sách lớn với một liên kết ghi nhận câu trả lời của bạn để nâng cao nó
user56reinstatemonica8
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.