Giá trị sai so với null, không xác định hoặc chuỗi rỗng


11

Tôi đã làm việc với jQuery trong nhiều năm qua. Tuy nhiên, gần đây, tôi thấy mình đã hiểu sâu hơn về ngôn ngữ JavaScript. Gần đây, tôi đã nghe về các giá trị "trung thực" và falsey. Tuy nhiên, tôi không hoàn toàn hiểu họ. Hiện tại, tôi có một số mã trông như thế này:

var fields = options.fields || ['id', 'query'];

Tôi cần xác định xem các trường là null, không xác định hoặc có độ dài bằng 0. Tôi biết cách dài là phải làm:

if ((fields === null) || (fields === undefined) || (fields.length === 0)) {
 ...                    
}

Câu hỏi của tôi là, như sau:

if (!fields)  {
 ...
}

4
Cũng nhìn ở đây.
Robert Harvey

Câu trả lời:


23

Trong lập trình, tính trung thực hoặc giả là chất lượng của các biểu thức boolean đó không giải quyết được giá trị boolean thực tế, nhưng vẫn được hiểu là kết quả boolean.

Trong trường hợp của C, bất kỳ biểu thức nào ước lượng bằng 0 được hiểu là sai. Trong Javascript, biểu thức valuetrong

if(value) {
}

sẽ đánh giá là đúng nếu valuekhông:

null
undefined
NaN
empty string ("")
0
false

Xem thêm
Có 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?


9

Tập hợp các giá trị "trung thực" và "falsey" trong JavaScript xuất phát từ ToBooleanhoạt động trừu tượng được xác định trong thông số ECMAScript , được sử dụng khi ép buộc một giá trị với boolean:

+--------------------------------------------------------------------------+
| Argument Type | Result                                                   |
|---------------+----------------------------------------------------------|
| Undefined     | false                                                    |
|---------------+----------------------------------------------------------|
| Null          | false                                                    |
|---------------+----------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion).    |
|---------------+----------------------------------------------------------|
| Number        | The result is false if the argument is +0, 0, or NaN;   |
|               | otherwise the result is true.                            |
|---------------+----------------------------------------------------------|
| String        | The result is false if the argument is the empty String  |
|               | (its length is zero); otherwise the result is true.      |
|---------------+----------------------------------------------------------|
| Object        | true                                                     |
+--------------------------------------------------------------------------+

Từ bảng này, chúng ta có thể thấy điều đó nullundefinedcả hai bị ép buộc falsetrong bối cảnh boolean. Tuy nhiên, fields.length === 0nhìn chung bạn không ánh xạ vào một giá trị sai. Nếu fields.lengthlà một chuỗi, thì nó sẽ được coi là false(vì một chuỗi có độ dài bằng 0 false), nhưng nếu đó là một đối tượng (bao gồm cả một mảng) thì nó sẽ ép buộc true.

Nếu fieldsnên là một chuỗi, thì đó !fieldslà một vị ngữ đủ. Nếu fieldslà một mảng, kiểm tra tốt nhất của bạn có thể là:

if (!fields || fields.length === 0)

2

Câu trả lời ngắn:

Không , chúng không giống nhau.

Nhưng điều này:

if (!fields) { ... }

Giống như thế này:

if ((fields === null) || (fields === undefined) || (fields === 0) || (fields === '') || (fields === NaN) || (fields === flase)) { ...
}

Dài (và tốt hơn) Trả lời:

Trước tiên hãy nói về những giá trị trung thực và giả dối.

Đó là tất cả về những gì xảy ra khi bạn đánh giá một cái gì đó là một boolean. Trong JavaScript, điều này xảy ra khi bạn sử dụng những thứ như ifcâu lệnh; khai thác hợp lý thích ||, !hoặc &&; hoặc Boolean()chức năng.

Các Boolean()chức năng chấp nhận một giá trị và lợi nhuận hoặc truehoặc false.

Ví dụ:

var age = 1; // Let's evaluate age as a boolean Boolean(age); // true

Đi trước và thử điều này trong một nút thay thế.

Boolean chỉ có thể là truehoặc false, vì vậy giá trị trả về Boolean() phảitruehoặc false. Trong trường hợp này, chúng tôi đã chuyển vào giá trị 1và khi được đánh giá là boolean, 1true.

Quan trọng: Khi được đánh giá là boolean, giá trị phải là đúng hoặc sai. Đó là hai lựa chọn duy nhất.

Trong JavaScript, chỉ có 6 giá trị giả. Các giá trị sẽ được falsekhi được đánh giá là một boolean. Đó là: false, 0, "", null, undefined, và NaN. Vì vậy, nếu bất kỳ giá trị nào trong số này được đánh giá là boolean, chúng sẽ sai:

Boolean(false) // false Boolean(0) // false Boolean("") // false Boolean(null) // false Boolean(undefined) // false Boolean(NaN) // false

Điều này có nghĩa là bất kỳ giá trị nào khác, trong JavaScript, sẽ được trueđánh giá là boolean. Vì vậy, mọi giá trị khác trong JavaScript là trung thực.

Một cách dễ dàng khác để đánh giá một cái gì đó booleanlà bằng cách sử dụng !toán tử. Cũng giống như Booleanhàm, cái này đánh giá một giá trị là boolean. Nhưng giá trị trung thực trở thành falsevà giá trị giả trở thành true.

!false // true !0 // true !"" / true !null // true !undefined // true !NaN // true

Một lần nữa, hãy thử điều này trong một nút thay thế hoặc một cái gì đó để đảm bảo bạn hiểu.

Vì vậy, tuyên bố này:

if (!fields) { ... }

Đang nói như sau: "if fields, khi được đánh giá là boolean, là false, thì hãy chạy mã bên trong câu lệnh if này."

Đối với tuyên bố đầu tiên của bạn:

var fields = options.fields || ['id', 'query'];

Bạn đang làm việc với toán tử OR logic, đáng để đọc để đảm bảo rằng bạn hiểu. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators


0

Mã của bạn có nghĩa là:

var fields;
if (options.fields)
    fields = options.fields;
else
    fields = ['id', 'query'];

Bây giờ options.fieldsđược chuyển đổi thành một giá trị boolean. Theo định nghĩa null, undefined, 0, ""được chuyển thành false, (chủ yếu) bất cứ điều gì khác được chuyển thành true(nhưng tôi không muốn để được như vậy chính xác).

Nó không có nghĩa giống nhau, bởi vì fields.length === 0dòng. Mảng trống và các đối tượng khác được chuyển đổi thành true.

lưu ý: Javascript đôi khi là một mớ hỗn độn lớn ... Ví dụ: không có nhu cầu thực sự đối với các toán tử kiểm tra 2 loại (typeof và instanceof). Nó chỉ nhầm lẫn ppl khi true instanceof Booleankhông hoạt động và sử dụng typeof(true) == "boolean"là dễ bị lỗi vì gõ một chuỗi mà không tự động hoàn thành. Có thể trong một số phiên bản mới, những vấn đề này sẽ được giải quyết.


-1

Bạn có thể thử (!! trường) nếu phần tử trường là null, không xác định hoặc có độ dài bằng 0, nó sẽ trả về true. Hoặc (!!! các trường) thì điều này sẽ trở lại đúng.

gấp đôi! hoặc là !! sẽ buộc đúng hay sai. Tôi ước tôi có thể tìm thấy một định nghĩa tốt cho việc này nhưng dường như tôi không thể tìm lại được.


1
"!!!" giống như "!" theo định nghĩa, như là "!!!!!" và "!!!!!!!". "Notting" một giá trị có thể được sử dụng để xác nhận rằng một cái gì đó là sự thật hoặc giả, chắc chắn có vị trí của nó, nhưng nó không trả lời đầy đủ câu hỏi của OP. Đó là, chính xác những gì là giá trị trung thực hoặc giả?
Jeffrey Sweeney

Tôi tìm thấy một bài viết mô tả tốt hơn về toán tử không phải: bennadel.com/blog/ Nhà phát triển.mozilla.org / en-US / docs / Web / JavaScript / Reference / Lỗi Nó sẽ biến điều kiện của bạn thành giá trị boolean.
Randy Collier
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.