Javascript 条件语句未按预期工作

Javascript 条件语句未按预期工作,javascript,if-statement,Javascript,If Statement,我有以下代码,应该首先检查navigator.platform,如果用户是从iPhone或iPad以外的设备进入页面,请重定向到给定页面。然而,它目前正在将iPad和iPhone设备重定向到该页面 var param = document.location.search.split("?link="); //IF DEVICE IS NOT IPHONE, REDIRECT USER TO OTHER PLATFORM PAGE if (navigator.platform !

我有以下代码,应该首先检查
navigator.platform
,如果用户是从iPhone或iPad以外的设备进入页面,请重定向到给定页面。然而,它目前正在将iPad和iPhone设备重定向到该页面

    var param = document.location.search.split("?link=");

//IF DEVICE IS NOT IPHONE, REDIRECT USER TO OTHER PLATFORM PAGE
    if (navigator.platform != 'iPhone' || navigator.platform != 'iPad')
    {
        window.location.replace("other-platform.html");
    }

    else if(param[1] === 'faq-link' && navigator.platform === 'iPhone' || 'iPad' )
    {
        window.location.replace("#");
    }

    else if (param[1] === 'footer-link' && navigator.platform === 'iPhone' || 'iPad')
    {
        window.location.replace("#");
    }

    else if(param[1] === 'share-page-A-getapp' && navigator.platform === 'iPhone' || 'iPad')
    {
        window.location.replace("#");
    }

    else if(param[1] === 'share-page-B-getapp' && navigator.platform === 'iPhone' || 'iPad')
    {
        window.location.replace("#");
    }

    else if(param[1] === 'share-page-C-getapp' && navigator.platform === 'iPhone' || 'iPad')
    {
        window.location.replace("#");
    }

想想这里的逻辑:

if (navigator.platform != 'iPhone' || navigator.platform != 'iPad')
如果
navigator.platform
等于“iPhone”,那么它就不等于“iPad”。如果它等于“iPad”,那么它就不等于“iPhone”。因此,
if
测试总是
true
,因为所有字符串要么不等于“iPhone”,要么不等于“iPad”

|
应该是
&&

随后,您的测试涉及到
“iPhone”| |“iPad”
并没有按照您的想法进行。以第一个为例:

else if (param[1] === 'faq-link' && navigator.platform === 'iPhone' || 'iPad' )
我们可以添加括号来显示JavaScript如何解释表达式:

else if (((param[1] === 'faq-link') && (navigator.platform === 'iPhone')) || 'iPad' )
也就是说,它首先将
param[1]
与字符串“faq link”进行比较。如果成功,那么它会将
navigator.platform
与字符串“iPhone”进行比较。如果这也成功了,那么测试就是真的。但是,如果这两个测试中的一个失败,
|
操作符的另一侧是字符串常量
'iPad'
,它将始终被解释为
true
。因此,这些比较从句中的每一个都有一个始终为真的条件

要解决这些问题,您所需要做的就是摆脱对“iPhone”和“iPad”的测试,因为一旦您修复了上述第一个测试,其他测试就可以安全地假定
navigator.platform
是“iPhone”或“iPad”。所以这个测试就是:

else if (param[1] === 'faq-link')
看看这个:

 else if(param[1] === 'faq-link' && navigator.platform === 'iPhone' || 'iPad' )
will allways return true because 'iPad' is true.
这样改变:

 else if(param[1] === 'faq-link' && navigator.platform === 'iPhone' || navigator.platform ==='iPad' )

您的if条件有一个错误,最后一个: 例如 (参数[1]=“常见问题解答链接”和&navigator.platform==“iPhone”| |“iPad”) 应该是 (参数[1]=“常见问题解答链接”和&navigator.platform==“iPhone”| | navigator.platform==“iPad”)

为了清楚起见,最好用附加括号将条件分组,即,
((param[1]=='faq link')&&(navigator.platform=='iPhone')| |(navigator.platform=='iPad'))

一个解决主要问题的答案。关于进一步简化的开关想法(对问题的评论)如何?@BillWoodger当然,使用开关会很好,或者因为每个选项都做完全相同的事情,只需检查列表或地图,看看
param[1]
是否是查找的值之一。最后3个字,很好。第一个字:有点多。他有200个因果报应,可能是一个新的程序员。友善一点。最后三个字表达了一个转变也可能是件好事。第一个词表达了现有的代码是令人厌恶的,马特应该像一个溺水的人一样跳起来换一个开关。足够的精确会让Matt自豪地向未来的雇主展示这一点,作为他优秀JavaScript排印的一个例子。在成年人的陪伴下,稍微把他当作成年人对待,从长远来看,这会更好。因为每个备选方案中的代码都能做完全相同的事情,我不认为一个
开关
会让它变得更好。它可以是一个正则表达式或一组可能的值,如果,则只有一个
。除了第一条注释是非建设性的之外,我也不是一个新的程序员。我没喝多少咖啡,也没睡多少觉,我承认代码很难看。不过,问题在于它的基本形式:如果用户不是来自iPhone或iPad,请重定向到名为
other platform.html
的页面。否则,如果查询参数是以下参数之一,并且用户来自iPhone或iPad,则重定向到相应的链接(window.location.replace链接中的每个链接都指向不同的位置,但示例中的链接已被删除)。我通过更改(navigator.platform!=“iPhone”| navigator.platform!=“iPad”)到if(navigator.platform!=“iPhone”&&navigator.platform!=“iPad”),我可以稍后用switch语句使它更漂亮。