Javascript 如何防止访问尚不存在的对象属性
我经常遇到这种情况:Javascript 如何防止访问尚不存在的对象属性,javascript,Javascript,我经常遇到这种情况: var obj={field:2} 在守则中: 做某事(obj.fiel);//注意:字段拼写错误 属性键入错误。我想尽早发现这些bug 我想把这个东西封起来 obj=Object.seal(obj) 但这似乎只能防止像obj.fiel=2这样的错误且仅读取字段时不会引发错误 有没有办法锁定对象,以便检测并抛出对丢失属性的任何读取访问 谢谢, 保罗 编辑:有关情况的更多信息 纯javascript,没有编译器 没有经验的程序员用于数学计算的库。我想限制他们的错误。我可以发现
var obj={field:2}代码>
在守则中:
做某事(obj.fiel);//注意:字段拼写错误
属性键入错误。我想尽早发现这些bug
我想把这个东西封起来
obj=Object.seal(obj)代码>
但这似乎只能防止像obj.fiel=2这样的错误代码>且仅读取字段时不会引发错误
有没有办法锁定对象,以便检测并抛出对丢失属性的任何读取访问
谢谢,
保罗
编辑:有关情况的更多信息
纯javascript,没有编译器
没有经验的程序员用于数学计算的库。我想限制他们的错误。我可以发现一个错误的变量,但他们不能
希望尽早检测尽可能多的错误。ie在编译时(最好),在运行时遇到拼写错误时立即抛出错误(ok),或者在分析结果和发现不正确的计算输出时抛出错误(非常糟糕)
单元测试实际上不是一种选择,因为数学的目的是发现新的知识,因此数学的答案通常是事先不知道的。同样,没有经验的程序员很难教他们单元测试
我认为这在Javascript中不起作用,因为对象是像JSON一样编写的,因此属性将是未定义的或空的,但不会抛出错误
解决方案是编写本机getter/setter
var obj = {
vars: {},
set: function(index, value) {
obj.vars[index] = value;
},
get: function(index) {
if (typeof(vars[index]) == "undefined") {
throw "Undefined property " + index;
}
return vars[index];
}
};
目前javascript中没有可靠的getter/setter。你必须手动检查。下面是一种方法:
if (!('key' in object)) {
// throw exception
}
请注意,对未定义变量的任何取消引用都是类型错误。您是在开发期间还是在运行时尝试检测此错误?如果您正在寻找编译ish类型的静态工具,请查看Typescript。对于响应延迟,很抱歉,限制在主要问题中,这不是真的,请看这个小把戏:当您使用不存在的属性时,Javascript不会抛出错误。如果将未定义的属性用作对象,它将抛出错误,例如:obj.test不会抛出错误。然而,obj.test.x将从顶部。。。alex23-我不需要try/catch块,因为我希望它抛出并死掉,所以错误将被检测到,并且不会被忽略,特别是在开发过程中。在运行时,用户也会报告问题。然而,obj.test.y(其中y不存在)不会抛出。不幸的是。那太好了,你不觉得吗?最后,我认为这是首选的答案,但有两个问题:1。性能,虽然没有我想象的那么差:2。干净的代码。没有经验的程序员不想键入obj.get('x')而不是obj.x,这会使代码更难阅读。但是,我看不到任何其他方式,所以这就是答案!谢谢:)这将是一个巨大的打字和性能成本:(我在寻找打字错误检测,而不是明确的检查。谢谢你,布莱恩,这与迪伦的答案相似,但速度慢了很多,请看:非常酷,你在上面做了一个jsperf。我从来没有意识到in操作符这么慢。很高兴看到