如果您有编写JavaScript的经验,则可能倾向于使用未定义代替NULL,甚至可以在一定程度上施放无定义的零值。如果您更明智的话,您会知道Null和Undefined不应该互换。
当然,选择一个和/或在它们之间进行切换的警告并不是一个对话启动器,因为这很少会导致生产中的任何头部转折……很少!我之所以这样说,是因为我敢肯定,使用错误的类型已经引起了问题,这些问题是在没有完全理解的情况下解决的。
好吧,让我们看一下细节。
无效的
null
是一个原始值,代表故意缺乏任何对象值。可能是许多编程语言中最常见的关键字,也可能具有常见的定义。其他语言变得幻想,然后使用nil
。我还不确定这是否还等同于Null,但值得一看。
不明确的
undefined
是当未分配值的变量时使用的原始值。这只是JavaScript的事情。使用JavaScript,您可以及时返回以使变量未分配一个值。
“ 但黑色炸药,将null分配给变量做同样的事情“看到那是您错的地方。这是给您的类比。我们可以说null就像加载网页,只是获取空白屏幕,但是未定义是“未找到”错误。
这两个关键字确实具有一些常见的特征。我可以从我的头顶上想到的是,它们都是虚假的价值观。这意味着,如果您像if (null || undefined)
这样的布尔表达式,您将始终从中得到假。
选择什么?什么使用?
让我先以此方式解决这个问题。您不应该真正选择。您的情况必须为您选择,或者您根据解决问题的解决方案做出选择。这是对编程中几乎每个“ VS”问题的答案,但是没有人喜欢它,因为它结束了论点太早结束。
谈到为您选择的情况。在大多数情况下,如果不是全部,则将数据迁移到用户转移到某些数据存储的变量,即使是通过HTTP请求,您也必须在某个时候涉及将其转换为JSON的形式。 JSON是一种开放的标准文件格式和数据互换格式。
在通过某些库或处理数据库处理API时,请注意您喜欢的库如何向您提供某些属性或空的数据?为什么您的ORM或数据库连接器Thingie Mabob不给您一个未定义的属性?因为那时很难判断您要处理的结构中是否存在。获得{"foo": null}
比{}
好,因为我知道“ foo”确实存在在某些其他条件下。当您有机会时,打开JavaScript控制台并运行以下内容:
JSON.stringify({
foo: null
bar: undefined
})
打字条特别使这些选择非常大,就像定义类型时一样,您需要指定对象或变量的属性是否可以容纳null,null,不确定或某种类型。
让我们做一个场景来结束这个迷你咆哮。
您正在用自己喜欢的框架编写表格,当用户类型时,向后端提出数据的请求时,您的后端只能更新已更改的字段。我们还假设我们使用RESTFUL API进一步固定范围。您的前端如何交流?假设该表格用于用户详细信息,并且字段为“名称”,“年龄”,“高度”。
如果客户的请求有效载荷是
{
"age": 24,
"height": null
}
后端可以将此有效载荷解释为:
- 财产“年龄”存在并且有数字。使用提供的整数更新年龄
- 未定义属性“名称”。什么都不做
- 属性“高度”为null。清除数据存储中的字段。
后端如何确定未定义属性“名称”?因为不是。
该有效载荷等效于以下
const body = {
age: 24,
height: null,
name: undefined
}
其中包含“名称”是多余的。在这种情况下,滥用“未定义”也是错误的常见位置。当此对象用于创建URL搜索参数时,它将将关键字“未定义”解释为字符串,希望如果您喜欢的http client省略了请求中的不确定属性,那么您很幸运,但是有些人会错误地序列化。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /p>
我什至求助于具有辅助功能来从对象创建查询参数以避免这种情况
function createUrlSearchParamsFor(payload) {
const safePayload = payload ? JSON.parse(JSON.stringify(payload)) : payload
return new URLSearchParams(safePayload);
}
当JavaScript对象被序列化时,所有未定义的属性都被丢弃,请记住“未定义”意味着属性尚未分配值。但是另一方面,null被JSON称为有效的JSON数据类型
就是这样。希望你学到了一些东西。
如果您在此帖子上发现任何有趣的位或调整,请在此处讨论或在Twitter上与您联系