JavaScript: mảng trống, [] đánh giá là true trong cấu trúc có điều kiện. Tại sao thế này?


94

Tôi đã gặp phải rất nhiều lỗi trong mã của mình vì tôi mong đợi biểu thức này:

Boolean([]); để đánh giá thành sai.

Nhưng đây không phải là trường hợp như nó được đánh giá là đúng.

Do đó, các hàm có thể trả về []như thế này:

// Where myCollection possibly returned [ obj1, obj2, obj3] or []
if(myCollection)
{
  // ...

}else
{
  // ...
}

đã không làm những điều mong đợi.

Tôi có nhầm lẫn khi giả định rằng []một mảng trống không?

Ngoài ra, hành vi này có nhất quán trong tất cả các trình duyệt không? Hoặc có bất kỳ món quà nào ở đó nữa không? Nhân tiện, tôi đã quan sát hành vi này trong Goolgle Chrome.


5
mảng là đối tượng, đối tượng là chân lý. chỉ cần yêu cầu array.length, nếu không phải là zero, nó sẽ là sự thật. khi bạn chuyển đổi rõ ràng sang Boolean, mảng sẽ biến thành một chuỗi rỗng trước tiên, sau đó chuỗi rỗng chuyển thành false.
dandavis

1
Tại sao bạn không sử dụng myCollection.length > 0?
Steve

1
@Steve - điều đó sẽ không hoạt động nếu myCollectionxảy ra nullhoặc undefined. Bạn cần sử dụng if(myCollection && myCollection.length > 0).
Ted Hopp

@TedHopp - tất nhiên ... tôi chỉ chỉ ra rằng myCollection.length > 0cung cấp giá trị boolean đang thực hiện những gì OP yêu cầu ... anh ấy vẫn cần thực hiện công việc từ đó.
Steve

Câu trả lời:


108

Từ http://www.sitepoint.com/javascript-truthy-falsy/

Các giá trị sau luôn sai:

  • sai
  • 0 (không)
  • "" (chuỗi trống)
  • vô giá trị
  • chưa xác định
  • NaN (một giá trị Số đặc biệt có nghĩa là Không phải số!)

Tất cả các giá trị khác là true, bao gồm "0" (không trong ngoặc kép), "false" (sai trong ngoặc kép), các hàm trống, mảng trống và đối tượng trống.


25
Nếu bạn kiểm tra biểu thức [] == falsenó sẽ đánh giá true.
m.rufca


có một bảng nhỏ hiển thị các tình huống bất ngờ sử dụng trình ==so sánh trong liên kết bạn đã đăng. Tôi nhận xét chỉ để cẩn thận khi mong đợi đánh giá đúng hoặc sai.
m.rufca

4
Điều này không thực sự trả lời câu hỏi, đó là TẠI SAO. Tại sao một mảng rỗng là trung thực, trong khi một chuỗi rỗng là sai? Như một quyết định thiết kế có chủ ý, điều này cảm thấy rất kém.
Esa Lindqvist

1
Có thể, bởi vì chúng được yêu cầu hoạt động giống như các đối tượng nguyên thủy. Nhưng Javascript không có các mảng nguyên thủy.
Barmar

23

Bạn nên kiểm tra .lengthmảng đó để xem nó có chứa bất kỳ phần tử nào không.

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)

@marczellm Nhận xét đó của Steve đã lỗi thời, anh ấy đã thông báo cho DevIshOne về điều kiện bị thiếu "khi mảng có các phần tử" , do đó đã được sửa trong bản chỉnh sửa .
mucaho
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.