Javascript 布尔运算无效
Javascript boolean operation not working
我有一个非常奇怪的问题。我有一个如下所示的 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 为真且 LoginService.getUserLoggedIn() 为假。控制台输出如下:
true false
false
显然 "next.requireLogin && !LoginService.getUserLoggedIn()" 的计算结果为假,但两者都是正确的值?如果有帮助,在 Chrome 控制台中,带有 "false" 的最后一行突出显示为紫色。
有人知道怎么回事吗?
因为会话存储返回的值是字符串而不是布尔值
console.log(!"false");
您需要与字符串进行比较,或者将字符串转换为布尔值。
sessionStorage
存储字符串,而不是布尔值。所以 getUserLoggedIn
return 是字符串 "true"
或 "false"
,并且所有非空字符串都是真实的。
将 getUserLoggedIn
更改为 return 布尔值。
this.getUserLoggedIn = function() {
return sessionStorage.userIsLoggedIn == 'true';
};
如果您使用过 console.log(next.requireLogin, LoginService.getUserLoggedIn())
,您会看到第二个值周围的引号,并且您可能已经意识到问题所在。连接时,会丢失类型信息。
那是因为你的LoginService.getUserLoggedIn()
returns"false",不是boolean 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")) {
我有一个非常奇怪的问题。我有一个如下所示的 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 为真且 LoginService.getUserLoggedIn() 为假。控制台输出如下:
true false
false
显然 "next.requireLogin && !LoginService.getUserLoggedIn()" 的计算结果为假,但两者都是正确的值?如果有帮助,在 Chrome 控制台中,带有 "false" 的最后一行突出显示为紫色。
有人知道怎么回事吗?
因为会话存储返回的值是字符串而不是布尔值
console.log(!"false");
您需要与字符串进行比较,或者将字符串转换为布尔值。
sessionStorage
存储字符串,而不是布尔值。所以 getUserLoggedIn
return 是字符串 "true"
或 "false"
,并且所有非空字符串都是真实的。
将 getUserLoggedIn
更改为 return 布尔值。
this.getUserLoggedIn = function() {
return sessionStorage.userIsLoggedIn == 'true';
};
如果您使用过 console.log(next.requireLogin, LoginService.getUserLoggedIn())
,您会看到第二个值周围的引号,并且您可能已经意识到问题所在。连接时,会丢失类型信息。
那是因为你的LoginService.getUserLoggedIn()
returns"false",不是boolean 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")) {