Javascript布尔操作不起作用

时间:2017-03-23 01:26:27

标签: javascript angularjs if-statement session-storage

我有一个非常奇怪的问题。我有一个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;
};

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

true false
false

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

有谁知道什么是错的?

3 个答案:

答案 0 :(得分:5)

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

更改getUserLoggedIn以返回布尔值。

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

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

答案 1 :(得分:1)

因为会话存储返回的值是字符串而不是布尔值

console.log(!"false");

您需要与字符串进行比较,或将字符串转换为布尔值。

答案 2 :(得分:1)

那是因为你的LoginService.getUserLoggedIn()返回“false”,而不是布尔值false。请参阅以下代码段。

var a="false";
console.log(a);//prints false
console.log(!a);//prints false as well.

所以替换

if(next.requireLogin && !LoginService.getUserLoggedIn()) {

<强>与

if(next.requireLogin && (LoginService.getUserLoggedIn() == "false")) {