为了账号安全,请及时绑定邮箱和手机立即绑定

将 javascript 变量初始化为空字符串而不是 null 是否存在技术问题?

将 javascript 变量初始化为空字符串而不是 null 是否存在技术问题?

绝地无双 2021-11-04 16:47:14
我正在使用 axios 处理 API 调用并在响应中返回一些 JSON。我有一个变量将保存 JSON 对象的值之一的结果,在本例中是一个字符串:let first_name = "";//later on..first_name = response.data.firstName;我的手被打了一巴掌,因为我已经初始化first_name为一个空字符串而不是null我不知道为什么 - 进行代码审查的人嘟哝了一些关于最佳实践的事情,并没有真正回答我。我的问题——如果我检查空字符串而不是稍后null使用first_name时,我将它初始化为什么重要吗?通过将变量设置为空字符串,是否有我错过的 javascript 最佳实践或优化?[编辑]关于我稍后在代码中如何使用的评论中的一些很好的讨论first_name。让我详细说明一下。我不想做代码转储,所以让我这样说,在first_name分配之后我检查以确保它既不是空字符串也不是空字符串,然后再使用它。我在这里感兴趣的是我所做的是否在 JavaScript 术语中是错误的或低效的,或者比将其分配为空值“更糟糕”。我将它指定为字符串作为助记符,如果一切顺利,它应该是一个字符串值。
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

将 JavaScript 变量初始化为空字符串而不是 null 是否存在技术问题?

这取决于上下文,但不存在直接的技术问题。从纯技术角度看,这并不重要,我们是否检查first_name === nullfirst_name === ""first_name === undefined或只!first_name

请注意,所有这些都非常特定于 JavaScript,因为许多其他语言要么没有,Null要么使用完全不同的模型来指示值的缺失。

null 与字符串

让我们进一步分析这个问题,以了解您的审稿人的推理。

null 不是字符串

最后first_name是一些返回字符串的计算结果。如果该字符串可以是空字符串"",则使用null, as是合理的null !== ""。我们可以在没有额外first_name_set标志或类似的情况下检查有效值的缺失。

如果我们使用null,那么我们永远不会从有效值域中汇集我们的初始值,这对于调试、错误处理和健全性检查来说是一个福音。

"" 可能永远无效

但是,如果first_name永远不会是空字符串,则空字符串可能是我们无效数据的有效候选者。

必须解释最佳实践

但这种解释null是可以接受的。另一方面,您的审稿人的推理在于他们的心态。如果这是他们认为的最佳实践,那么它可能是整个公司的“最佳实践”。这并不一定意味着它也是现实世界中的最佳实践,因为在拥有大量自学程序员的公司中,一些奇怪的误解可能由来已久。作为被审查者,您的最佳做法是质疑他们的推理。

一个好的代码审查提高了审查代码,更好的代码审查教好做法,但最好的代码审查提高整体的代码库,并教两个侧面。

初始化备注

话虽如此,这两种变体都对开发人员施加了额外的压力:我们被迫检查我们的值是否有效。更好的解决方案(如果可能)是摆脱无效的初始化,使用正确的值进行初始化。async并且await可以使我们能够在回调情况下这样做。


查看完整回答
反对 回复 2021-11-04
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

我认为您的审稿人正在考虑:

  • 使用空状态没有数据可用。

  • 使用空字符串状态数据可用(从 api 返回)。

我也同意在这个意义上使用 null 将是最佳实践。


查看完整回答
反对 回复 2021-11-04
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

first_name仅当有可能first_name = response.data.firstName不会执行并且之后的代码从first_name以下位置读取时,使用值进行初始化才有意义:


let first_name;


if( ... ) {

   first_name = response.data.firstName;

}


// ...


doSomething(first_name)

或者


let first_name;


try {

   // some code

   first_name = response.data.firstName;

} catch(err) {

}


// ...


doSomething(first_name)

因为那样你可以确保一些默认值。


但是,如果有什么之间let first_name;和first_name = response.data.firstName;再初始化的first_name无厘头,并宣布它早期没有意义无论是。


所以应该是:


let first_name = response.data.firstName;

// ...

doSomething(first_name)

将所有声明的函数的开始是从时间的遗物,其中let并const没有用,因为发动机/编译器不会警告你:


function foo() {

   console.log(bar)


   // ...


   var bar = 2; 

}


查看完整回答
反对 回复 2021-11-04
  • 3 回答
  • 0 关注
  • 370 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信