This question already has answers here:
JavaScript IF statement boolean strict
                                
                                    (3个答案)
                                
                        
                3年前关闭。
            
        

我有一个很奇怪的问题。我有一个if语句,如下所示:

$rootScope.changeView = function(view){
    $location.path(view); // path not hash
};

$rootScope.$on('$routeChangeStart', function (event, next) {
    console.log(next.requireLogin + " " + LoginService.getUserLoggedIn());
    console.log(next.requireLogin && !LoginService.getUserLoggedIn());

    if(next.requireLogin && !LoginService.getUserLoggedIn()) {
        console.log("No access to panel: not logged in.");

        alert("You need to be logged in as an administrator to see this page!");
        event.preventDefault();

        $timeout(function () {
            $rootScope.changeView("/");
        }, 500);
    }
});


其中LoginServer.getUserLoggedIn和setUserLoggedIn是:

this.setUserLoggedIn = function(value){
    sessionStorage.userIsLoggedIn = value;
};

this.getUserLoggedIn = function() {
    return sessionStorage.userIsLoggedIn;
};


问题很简单。即使next.requireLogin为true和LoginService.getUserLoggedIn()为false,也不会调用If语句。控制台中的输出如下:

true false
false


因此,显然“ next.requireLogin &&!LoginService.getUserLoggedIn()”的计算结果为false,但这两个值都是正确的吗?如果有帮助,则在Chrome控制台中,带有“ false”的最后一行将突出显示为紫色。

有人知道怎么了吗?

最佳答案

sessionStorage存储字符串,而不是布尔值。因此,getUserLoggedIn返回字符串"true""false",并且所有非空字符串都是真实的。

更改getUserLoggedIn以返回布尔值。

this.getUserLoggedIn = function() {
    return sessionStorage.userIsLoggedIn == 'true';
};


如果使用console.log(next.requireLogin, LoginService.getUserLoggedIn()),您会看到第二个值附近的引号,也许您已经意识到了问题所在。串联时,将丢失类型信息。

09-26 13:07