如果我对‘无法读取未定义的属性‘****’’没意见怎么办?
2016-02-11
80
我有一些代码如下所示:
$scope.query.toLowerCase() != 1
如果未定义查询 - 控制台中会出现错误。实际上,代码仍然会产生我想要的结果,但处理错误的正确方法是什么?当然,我可以提前检查变量 - 但这会导致更多代码,不确定通过阅读更多代码来隐藏错误的好处。
3个回答
Of course I can check the the variable in advance - but that will lead to more code
编写更多代码不会使您的代码变坏,除非您正在参加代码高尔夫比赛。如果您不处理错误和边缘情况,那么您的程序将不可靠。如果一行代码抛出错误,您的代码甚至可能会过早终止。
处理可能未定义属性的另一种方法是定义默认值,而不是检查它是否为
未定义
。
($scope.query || "").toLowerCase() != 1 // this is enough to fix your expression
或更正式的
($scope.query === undefined ? "" : $scope.query).toLowerCase() != 1
这显然取决于您的目的。
另一个示例:
function add(a, b){
return a + (b || 0); // if b is falsy, assume b is 0
}
add(1, 2); // 3
add(1); // 1
短路 在某些情况下非常有用,但请确保您确切了解它的工作原理,因为误用它会产生意外行为。
Derek 朕會功夫
2016-02-11
这样做不好...
try {
$scope.query.toLowerCase() != 1
} catch(e) {
// do nothing
}
因为这会掩盖错误,如果发生意外错误,您将不知道,这会使调试成为一场噩梦。
认可的做法是编写几行额外的防御性代码,以防止导致错误的情况。 是的,它更冗长,但它比拥有一个调试起来很噩梦的代码库要好。
danday74
2016-02-11
一般来说:我将这项任务外包给一个小助手:
function string(v){ return v==null? "": String(v) }
我可以肯定,输出始终是一个字符串(类型安全)。
string($scope.query).toLowerCase() != 1
在这种特殊情况下?您正在检查数字,您不需要
toLowerCase()
+$scope.query !== 1
在这种情况下会更好;不需要处理 null 或 undefined。
Thomas
2016-02-11