Javascript 方法应该有多安全?

Javascript 方法应该有多安全?,javascript,Javascript,在编写代码时,我想知道我的方法应该有多安全。我应该信任我的类的用户吗?还是检查一切?这意味着参数类型检查,这可能不是一个好的实践,因为Javascript应该是duck类型的 这基本上导致了信任问题。是否有最佳实践?是否存在隐含的“合同” 例如: CarsCollection.prototype.get = function ( index ) { return this.collection[index]; }; 或 一般来说,框架代码和可重用库是广泛参数检查的主要候选对象,因为您(

在编写代码时,我想知道我的方法应该有多安全。我应该信任我的类的用户吗?还是检查一切?这意味着参数类型检查,这可能不是一个好的实践,因为Javascript应该是duck类型的

这基本上导致了信任问题。是否有最佳实践?是否存在隐含的“合同”

例如:

CarsCollection.prototype.get = function ( index ) {
    return this.collection[index];
};


一般来说,框架代码和可重用库是广泛参数检查的主要候选对象,因为您(以及您当前和未来的同事)将大量使用这些代码

您不必到处添加参数检查,只要在合理的时候使用它们即可

如果要指定某些行为,如:是否应
array\u delete\u value
修改输入参数或返回已删除值的副本?在注释中指定它,并添加一个测试,该测试正好测试此行为

如果您担心性能,可以编写类似断言的语句,并在缩小步骤中删除它们。这类似于在关闭断言的情况下编译

断言可能看起来像:

argument("index", index).of_type("number").required();


如果你投了反对票,请留下评论。我错过什么了吗?你有一种与之竞争的方法吗?

我喜欢让我的代码尽可能地成为虚拟证据。这减少了开发人员使用我的API/函数/代码获取WTF的数量。参数检查始终是一种很好的实践,尤其是在JavaScript这样的动态类型语言中。所以你所做的没有错。JavaScript中也允许进行类型检查。我发现更容易跟踪显式声明其参数类型的函数。这减少了API用户的认知负担(即不必处理
foo(5)
foo(“5”)
)而且在编写函数时,还可以减少您自己的认知负荷,因为您不必处理JavaScript类型的特殊性,并且可以确保参数是您期望的类型。

虽然这并不能完全回答您的问题,需要注意的是,javascript的松散性使您的许多问题成为非问题(除非您希望这样)

  • 若索引为false,并且您查看collection[index],您将得到未定义的
    。老实说,我不确定这是否是数组/对象的一个特性,或者虚假值是否被强制为0,但无论如何,这都不是正式的错误
  • 如果索引不是数字,括号表示法将从查找数组成员返回到对象属性。在最坏的情况下,它将返回未定义的,但在最好的情况下,您可以利用对象的动态功能
  • 请注意,您当前的检查将在CarsCollection.get(0)上失败,因为0是错误的
  • 此外,isNaN处理其参数是否为null或未定义
所以你检查的东西都不是错误。如果这是一个致命错误,JavaScript本身就会抛出一个错误


现在,对于问题本身,我的观点是javascript是如此松散和不受约束,以至于大多数检查都是不必要的。如果使用函数传递了错误的参数,其他程序员应该找出原因。你不能对他们隐藏你的代码。我最看重的是好的文档(查看,然后使用它)。如果您定义好了接口,程序员就可以使用它。不过,这只是我的想法。

您将通过单元测试了解您的方法的健壮性。如果你编写了好的测试,你会很快发现你的方法需要能够处理各种古怪的输入

要走多远取决于您自己,但需要明确的是:不要仅仅假设输入是有效的

就我个人而言,我对来自另一个类/模块/任何东西的任何东西都进行了验证,即使它不是第三方。您需要确保每个模块的入口点都是健壮的。在给定的类/模块中,我会稍微放松一下,但仍然要确保足够的验证以防止错误


在示例代码中,它看起来像是
carscolection
之外的其他代码片段将调用
get
方法。所以,您肯定要验证索引

尽量多疑。不要相信任何人,尤其是你自己。这个问题很有趣。在使用private/public/protected修饰符的语言中,通常是public->check everythings,private/protected->relax;但是由于javascript的所有内容都是公开的,所以请遵循最小期望的规则。我希望类似列表的对象上的
.get(null)
抛出一个错误,而不是返回
undefined
。它更容易返回
undefined
(然后在尝试访问
undefined
的属性时抛出错误)。在javascript的其他地方,容器会抛出错误吗?如果您期望它返回null/undefined,那么这很好(它应该返回null还是undefined,这有关系吗?)。我的期望不是你的期望,也不是你同事的期望。不管是谁,我都要提醒你根据JavaScript中的选择来建模,因为并不是所有的部分都被创建得同样优雅。我可以对此做更多的阐述。当你有一个
数组
时,有一个
长度
属性,你可以检查
数组[5]
是否会给你一个好值,或者总是
未定义
。但是在DOM API中,无法检查具有特定id的元素是否存在,因此您将使用
document.getElementById(“myid”)===null
(注意,它返回
null
,而不是
未定义的
)。我的观点是,如果你能(事先)检查一个电话是否会成功,你应该抛出一个错误
argument("index", index).of_type("number").required();