【问题标题】:Javascript boolean operation not working [duplicate]Javascript布尔运算不起作用[重复]
【发布时间】:2017-03-23 09:34:43
【问题描述】:

我有一个非常奇怪的问题。我有一个像下面这样的 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”会以紫色突出显示。

有谁知道怎么回事?

【问题讨论】:

    标签: javascript angularjs if-statement session-storage


    【解决方案1】:

    sessionStorage 存储字符串,而不是布尔值。所以getUserLoggedIn返回字符串"true""false",所有非空字符串都是真值。

    更改 getUserLoggedIn 以返回布尔值。

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

    如果您使用了console.log(next.requireLogin, LoginService.getUserLoggedIn()),您会看到第二个值周围的引号,并且您可能已经意识到问题所在。连接时,您会丢失类型信息。

    【讨论】:

      【解决方案2】:

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

      console.log(!"false");
      

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

      【讨论】:

        【解决方案3】:

        那是因为您的 LoginService.getUserLoggedIn() 返回“false”,而不是布尔值 false。请参阅以下 sn-p。

        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")) {

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多