javascript - 这个三元组可以安全地处理 JavaScript 中的 undefined 吗?

标签 javascript

以下代码片段安全吗?

function theFunc(arg1, optionalList) {
   optionalList = optionalList ? optionalList : [];
   //do stuff with arg1 and optionalList
}

我添加了三元来处理未提供 optionalList 的情况(之前提示未定义),并且一位同事指出这不是测试未定义的可接受的方法。

这对我来说很有意义,因为 undefined 应该是 false,但我可以在网上看到人们说总是使用 typeof 的例子。我在 Chrome、FF 和 Edge 上都试过了,似乎没问题。是否有某种原因不使用此方法将可选值默认为空列表? 注意:我支持 IE,不能在参数列表中使用默认值。

最佳答案

问题是,如果 arg2 为 false 但不是未定义(例如,0、空字符串、NaN 或 null),您的逻辑会将其更改为 []。如果您的 arg2 有机会持有有意义的 falsey 值,您应该将代码更改为

arg2 = typeof arg2 === 'undefined' ? [] : arg2

否则,非未定义的 false 值将被丢弃并替换为 []

如果您不担心 undefined 是当前作用域内的变量名称,则可以简化为:

arg2 = arg2 === undefined ? [] : arg2

如果arg2 总是为真,如果已定义,那么您当前的代码在大多数情况下都很好(但请确保始终使用变量名称arg2optionalList,但不要混合使用)。

我仍然更喜欢使用默认参数:

function theFunc(arg1, arg2 = []) {

ES6+ 语法允许许多种漂亮而简洁的代码,而这在 ES5 中是不可能的。对于任何大小合理或专业的脚本,设置 Babel 自动将代码转译为 ES5 可能是更好的主意,允许您使用该语言的最新和最好的版本进行编写,而不是强制自己削弱代码的可读性仅使用过时的语法。

关于javascript - 这个三元组可以安全地处理 JavaScript 中的 undefined 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59494983/

相关文章:

javascript - 查找光标当前所在的 textNode

javascript - 另一种预防垃圾邮件机器人的方法

php - js+php实时图像裁剪

javascript - 当图像以 javascript 显示时,有没有办法获取信息?

javascript - 判断一个多词字符串是否包含一个词

javascript - Angular : can't apply a filter to data loaded via $http

javascript - 如何通过实例传递值?

javascript - 为什么ES6没有定义默认参数函数?

javascript - JS insideHTML.replace() 行为

javascript - 如何在没有 toggleClass 的情况下制作切换器