javascript - 为什么要将对象中的所有值转换为 Javascript 中的字符串?

标签 javascript dynamic-typing

免责声明:我的经验主要是使用静态类型语言进行开发,即使我了解动态类型的工作原理,我也不是很熟悉常见的做法,我也不是很了解通常的提示和技巧呢。

我最近开始在一个项目中工作,我们使用无服务器并使用 javascript 在 AWS 中部署一些 lambda。在深入研究现有代码后,我发现了一个让我有点震惊的常见做法:

当调用 lambda 并接收 JSON 负载时,会进行初始预处理,将对象中的所有值转换为字符串。

const mapValues = require('lodash/mapValues')
const escape = require('validator/lib/escape')
...
const body = mapValues(requestBody, value => escape('' + value))
...

然后在预处理之后,真正的工作开始(验证、处理、调用其他服务等...)

我的第一个想法是:

  • 好处:有助于减少可能的不同类型的认知负担,使我们能够假设一切都将始终是一个字符串。

  • 缺点:处理非字符串值(例如数字)的额外复杂性。

问题 1:使用这种方法还有其他好处和缺陷吗?

问题 2:这可以被视为不好的做法吗?如果是这样,为什么? (事实,不是意见)

提前致谢! :)

最佳答案

有趣的问题。我建议你问问作者他们是否可用。以下是我的一些想法:

我认为拥有字符串值不会减少反而会增加认知负担,因为您在进行基本算术运算时必须注意转换它们。我相信我们所有人都至少见过一次 1+111

此外,将每个数据都作为字符串处理是一种非常糟糕的做法,它甚至有自己的模拟名称:stringly typed。这是食谱示例。

我能想到的唯一正当理由是防止针对服务的各种注入(inject)攻击。在某些情况下,如果允许用户发送任意 json,则有可能使服务执行正常情况下不会执行的代码路径。 (像 {"__proto__":[],"length":1,"0":"foo"} 这样古怪的东西强制转换为 "foo" 但它是 typeof 对象,这可以绕过一些有缺陷的验证逻辑。mongodb 也容易受到一些类似的攻击)。但即使在这种情况下,正确的验证也比将每个值都转换为字符串要好得多。

关于javascript - 为什么要将对象中的所有值转换为 Javascript 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011877/

相关文章:

javascript - 如何在 react-CKEditor 组件中固定图像的宽度和高度?

c# - MOQ 返回动态类型作为对象问题

language-agnostic - 不需要声明变量类型的语言的质量是否是弱类型或动态类型的示例

haskell - Typeable 类型的“模式匹配”

c++ - 如何添加不同类型的属性图?

instantiation - 从 Haxe 中的字符串名称创建类的实例

javascript - 如何计算需要通过特定于控件的计算规则从各种表单控件元素更新的输出值?

javascript - 根据 javascript 中的条件合并两个嵌套的 JSON 对象

javascript - typescript 生成冗余变量

javascript - 我可以依靠 `<tbody>` 标记的隐式创建吗?