if(true || true || false)语句在javascript中是真的吗?

时间:2014-02-15 05:40:00

标签: javascript if-statement boolean conditional-statements

我有一些代码来保护我的页面不被iframed。

window.onload = function(){
 try
  {
   if (window.parent && window.parent.location.hostname !== "app.herokuapp.com"){
      throw new Error();
   }
   catch (e){
   //do something
   }
  }

在我尝试添加更多值来比较主机名之前,它完全正常。我想添加自定义域名。我试过这个:

window.onload = function(){
 try
  {
   if (window.parent && (window.parent.location.hostname !=="app.herokuapp.com" 
   || window.parent.location.hostname !== "www.app.com"
   || window.parent.location.hostname !== "localhost")){
      throw new Error();
   }
   catch (e){
   //do something
   }
  }

这总是返回true,因此会抛出错误。我怎样才能做到这一点?除非主机名匹配这些字符串,否则我想抛出一个错误,无论如何都会抛出错误。我是新手,非常乐意帮忙!谢谢。

聚苯乙烯。我添加了“localhost”,因为我希望能够在推送到heroku之前在本地测试它。

2 个答案:

答案 0 :(得分:6)

如果任何操作数评估为||,则

true会将结果评估为true。也许您的意思是使用&&代替:

if (window.parent 
    && window.parent.location.hostname !== "app.herokuapp.com" 
    && window.parent.location.hostname !== "www.app.com"
    && window.parent.location.hostname !== "localhost")

De Morgan's Law

if (window.parent 
    && !(window.parent.location.hostname === "app.herokuapp.com" 
         || window.parent.location.hostname === "www.app.com"
         || window.parent.location.hostname === "localhost"))

如果操作数的所有评估为true,则评估为true

进一步阅读

答案 1 :(得分:0)

由于已经有一个非常完整的答案,我建议采用不同的方法。当你有这样的长语句时,我发现使用高阶函数更容易阅读。以这种方式考虑您的情况:“检查主机名是否与任何给定的字符串不匹配”。这就是我想要阅读代码的方式,其他一切都是样板文件:

function not(y) {
  return function(x) {
    return x !== y;
  };
}

var hosts = ['app.herokuapp.com','www.app.com','localhost'];
var parent = window.parent;

if (parent && hosts.some(not(parent.location.hostName))) {
  ...
}