等式运算符为什么会= =导致未定义的异常并且==按预期工作?

时间:2014-02-19 09:50:35

标签: javascript angularjs type-conversion equality

昨天我的手机应用程序出了问题。我正在使用angularjs,起初我以为是角度故障,所以我尝试了所有可以尝试的东西。最后,解决方案是将等于运算符从===更改为==(类型检查)。好吧,我对发生的事情感到困惑。我不太了解javascript,但我必须知道。由于我的旧SO问题(AngularJS How to get data to controller via $rootScope?)只有angularjs标签,我将这个问题带到javascript。 为什么此代码(===)会返回错误"TypeError: Cannot read property 'ID' of undefined"

dndetail.controller('dndetailCtrl', ['$rootScope', '$scope', '$routeParams', '$localStorage', function ($rootScope, $scope, $routeParams, $localStorage) {

    var mjav = [];
    $scope.$storage = $localStorage;
    var lslist = $scope.$storage.dnlist;
    var id = $routeParams.dnid;
    $scope.$storage.test1 = $scope.$storage.dnlist[1].ID;

    for (var i = 0; i <= $scope.$storage.dnlist.length; i++) {
        if ($scope.$storage.dnlist[i].ID === id) {
            $scope.data = $scope.$storage.dnlist[i];
            break;
        }
    }
    //$scope.data = $rootScope.dnlist[$rootScope.getIndex($routeParams.dnid)];
}]);

==的代码按预期工作。在我使用VB / C#.net之前,我是一个相对较新的Javascript用户(3个月)。

编辑:忘了提及我用typeof测试了两个变量,它们都返回整数。

3 个答案:

答案 0 :(得分:2)

让我们稍微分解一下以理解它。

  • 错误 - TypeError: Cannot read property 'ID' of undefined适用于同时使用==(类型转换比较)和===(严格比较),因为$scope.$storage.dnlist[i].ID似乎存在问题{1}}。但是由于两次比较之间的差异,使用==(类型转换比较)时问题被掩盖了。

  • ==松散等于非严格检查,它会在检查前使用类型转换将两个值转换为相同的类型如果他们是平等的。在您的方案中,因为$scope.$storage.dnList[i].ID正在返回undefinedundefined在JavaScript中被视为虚假值(强制转换为false),因此当==比较使用类型转换时,在此实例中,undefined被强制(强制)为{ {1}}因为这是另一个假值。现在两个值都是整数,它可以执行它的等式检查

  • 另一方面,
  • 0是一个严格等式检查,意味着不会进行类型转换。它只会检查两个值在类型和值中是否完全相等。在这种情况下不是,一个是===,一个是integer,因此会抛出您的错误。

有关平等检查的更多信息 here 以及真实和虚假的值 here

答案 1 :(得分:1)

在for循环中,您似乎从0开始索引并使用&lt; =而不是使用:

for (var i = 0; i < $scope.$storage.dnlist.length; i++) { ... }

答案 2 :(得分:0)

您是否了解$ scope。$ storage.dnlist [i]未定义(不存在),因此您无法引用它的id属性?

对我来说,问题是你经历的循环太多次了,最后一次通过$ scope。$ storage.dnlist [i]不存在,当你试图引用时,js抛出异常不存在的对象的id属性。

你的for语句中的比较应该是“i&lt;”而不是“i&lt; =”所以你不要超过数组的末尾。