虚假值与null,未定义或空字符串


11

这些年来,我一直在使用jQuery。但是,最近,我发现自己对JavaScript语言有了更深入的了解。最近,我听说过“真实”和虚假的价值观。但是,我不完全理解它们。目前,我有一些看起来像这样的代码:

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

我需要确定字段是否为null,未定义或长度为0。

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

我的问题是,以下内容是否相同:

if (!fields)  {
 ...
}

Answers:



9

JavaScript中的“真”和“假”值集来自ToBooleanECMAScript规范中定义抽象操作,该操作用于将值强制转换为布尔值:

+--------------------------------------------------------------------------+
| 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                                                     |
+--------------------------------------------------------------------------+

从表中我们可以看出,nullundefined都裹挟false在布尔上下文。但是,您fields.length === 0通常不会将其映射到错误的值。如果fields.length为字符串,则将其视为false(因为零长度字符串为false),但是如果它是一个对象(包括数组),它将强制转换为true

如果fields应为字符串,!fields则为足够谓词。如果fields是数组,则最好的检查可能是:

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

2

简短答案:

,它们不一样。

但是这个:

if (!fields) { ... }

与此相同:

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

长(更好)的答案:

让我们首先讨论真实和虚假的价值观。

这都是关于当您将某物评估为布尔值时会发生什么。在JavaScript中,当您使用诸如if语句之类的东西时会发生这种情况。逻辑操作者喜欢||!,或&&; 或Boolean()功能。

Boolean()函数接受一个值并返回truefalse

例如:

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

继续尝试在节点repl中进行此操作。

布尔值只能是truefalse,因此返回值Boolean() 必须truefalse。在这种情况下,我们传入了value 1,并且在将其评估为布尔值时1true

重要提示:以布尔值形式评估时,值必须为true或false。这些是仅有的两个选择。

在JavaScript中,只有6个伪造的值。值,这将是false当作为一个布尔评价。它们是:false0""nullundefined,和NaN。因此,如果这些值中的任何一个被评估为布尔值,它们将为false:

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

这意味着在JavaScript中,其他任何值都将被true评估为布尔值。因此,JavaScript中的所有其他值都是真实的。

另一种评估事物的简单方法boolean是使用!运算符。就像Boolean函数一样,这会将值评估为布尔值。但是真实的价值观变成了false虚假的价值观true

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

再一次,在节点代表或其他方面尝试一下,以确保您理解。

所以这条语句:

if (!fields) { ... }

在说以下内容:“如果fields将boolean值评估为false,则运行if语句中的代码。”

至于你的第一句话:

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

您正在使用逻辑OR运算符,值得一读以确保您理解。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators


0

您的代码意味着:

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

现在options.fields转换为布尔值。根据定义nullundefined0""转化为false,(主要是)什么都转化为true(但我不想那么精确)。

这并不意味着相同,因为fields.length === 0行。空数组和其他对象将转换为true

注意:Javascript有时是一团糟...例如,实际上并不需要2个类型检查运算符(typeof和instanceof)。当true instanceof Boolean不工作时,ppl会使ppl感到困惑,并且typeof(true) == "boolean"由于键入没有自动完成的字符串而容易出错。也许在某些新版本中,这些问题将得到解决。


-1

您可以尝试(!!字段),如果fields元素为空,未定义或长度为0,它将返回true。或(!!!字段),则返回true。

双 !要么 !!将强制为真或假。我希望可以为此找到一个好的定义,但似乎无法再次找到它。


1
“ !!!” 是相同的 ”!” 按照定义,“ !!!!!” 和“ !!!!!!!”。“记下”值可用于确认某些事物是真实的还是虚假的,这肯定有其位置,但是它不能完全回答OP的问题。也就是说,真实或虚假的价值观到底是什么?
杰弗里·斯威尼

我发现,更好的描述不是没有运营商的文章:bennadel.com/blog/... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... 它会变成你的病情为布尔值。
兰迪·科利尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.