分割字符串在保存到变量和console.log-ing时会产生不同的结果

时间:2014-04-18 20:11:24

标签: javascript angularjs

我有一个非常简单的函数,在$location更改时执行(见下文)。 问题是,在$location.path().split("/")时,分配中["browser"]的出现会返回$location.path() == "/browser",但直接在console.log内运行会返回["", "browser"]。如何合理地解释这种差异?

angular.module("blah", [])
.controller("navigation", function($scope, $location) {
    var updatePage = function() {
        var temp = $location.path().split("/");
        console.log($location.path(), $location.path().split("/"), temp);
        $scope.page = temp.splice(0,1)[0];
        $scope.args = temp;
        //console.log($scope.page);
    };
    $scope.changePage = function(path) {
        if (path.match("^https?:")) {
            window.location = path;
        } else {
            $location.path(path);
        }
    };
    $scope.args = [];
    $scope.$on("$locationChangeSuccess", function(event, data) {
        updatePage();
    });
    updatePage();
});

1 个答案:

答案 0 :(得分:1)

您可能会看到"问题"用这样的代码:

var temp = $location.path().split("/");
$scope.page = temp.splice(0,1)[0];
...
console.log($location.path(), $location.path().split("/"), temp);

在记录时,temp已经 splice d splice (与 slice 不同)也从原始数组中移除了元素。


<强>更新

另一个可能的原因是:
Firefox(与Chrome不同)在记录时不会记录对象的,而是对象的引用(数组也是对象)。因此,对阵列的任何后续修改(例如拼接)也将影响记录的对象/阵列。

如果您改为记录JSON.stringify(temp),则应该会看到预期结果。