如果我对“无法读取未定义的属性'****'”没问题怎么办

What if I am ok with 'Cannot read property '****' of undefined'?

本文关键字:怎么办 没问题 属性 未定义 读取 如果      更新时间:2023-09-26

我有一些代码,如下所示:

$scope.query.toLowerCase() != 1

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

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

编写更多的代码不会让你的代码变坏,除非你参加的是代码高尔夫比赛。如果你不处理你的错误和边缘情况,那么你的程序将不可靠。如果一行代码引发错误,您的代码甚至可能提前终止。

处理可能的未定义属性的另一种方法是定义默认值,而不是检查它是否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

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

它的不良做法...

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

由于这会掩盖错误,并且如果发生意外错误,您将不知道它,这使得调试成为一场噩梦。

批准的做法是编写几行额外的防御性代码,以防止可能导致错误的场景。是的,它更冗长,但它比拥有代码库要好,这是调试的噩梦。

一般来说:我正在将这个任务外包到一个小助手中:

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

我可以肯定,输出始终是字符串(类型安全)。

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

在这种特殊情况下?您正在检查一个数字,您不需要toLowerCase()

+$scope.query !== 1

在这种情况下会更好;不需要处理 null 或未定义。