如果我对'无法读取属性'****'未定义'怎么办?

时间:2016-02-11 10:06:54

标签: javascript angularjs

我有一些代码如下:

$scope.query.toLowerCase() != 1

如果未定义查询 - 控制台中存在错误。实际上代码仍然会产生我想要的结果,但处理错误的正确方法是什么?当然我可以提前检查变量 - 但这将导致更多代码,不确定通过阅读更多代码隐藏错误的好处。

3 个答案:

答案 0 :(得分:3)

  

当然我可以提前检查变量 - 但这将导致更多代码

编写更多代码并不会使您的代码变坏,除非您参加代码高尔夫比赛。如果您没有处理错误和边缘情况,那么您的程序将不可靠。如果一行代码抛出错误,您的代码甚至可能会过早终止。

处理可能的未定义属性的另一种方法是定义默认值,而不是检查它是否为undefined

($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

Shortcircuiting在某些情况下非常有用,但请确保您确切知道它是如何工作的,因为滥用它会产生意外行为。

答案 1 :(得分:1)

这是不好的做法...

try {
    $scope.query.toLowerCase() != 1
} catch(e) {
    // do nothing
}

因为这会掩盖错误,如果发生意外错误,你就不会知道它会让调试成为一场噩梦。

批准的做法是写一些额外的防御性代码,以防止导致错误的情况。 是的,它更冗长,但它比拥有代码库更好,这是调试的噩梦。

答案 2 :(得分:0)

总的来说:我将这项任务外包给了一个小帮手:

function string(v){ return v==null? "": String(v) }

我可以肯定,输出始终是String(Type-safety)。

string($scope.query).toLowerCase() != 1

在这种特殊情况下?你正在检查一个号码,你不需要toLowerCase()

+$scope.query !== 1
在这种情况下,

会更好;无需处理null或undefined。