NULL与未定义?选择什么?什么使用?
#javascript #typescript #learning

如果您有编写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上与您联系