Navascript检查Javascript(使用三元运算符)

时间:2015-10-08 06:34:28

标签: javascript performance

想要检查空值。 any()方法返回null或匹配结果数组(实际上返回的是match()方法)。

$scope.isMobileBrowser = !isMobile.any() ? false : true;

如果any()方法返回null,我希望将false分配给$scope.isMobileBrowser变量,否则true。在任何可能的情况下,过度提到的片段会失败吗?还有其他更有效的解决方法吗?

了解isMobile对象的更多详细信息:

var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

4 个答案:

答案 0 :(得分:3)

空字符串也是一个假值 如果any()返回空字符串,!isMobile.any() ? false : true将返回false,但您可能需要true

这意味着您的代码在这种情况下不正确。

我只是做isMobile.any() !== null之类的事情。

答案 1 :(得分:1)

根据any()函数,您将返回以下表达式的值:

(isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() 
                             || isMobile.Opera() || isMobile.Windows())

这些功能中的每一项都可以返回Arraynull,如doc for match

中所示

因此,在评估OR时,它将 评估为 遇到的第一个truth值,并且由于表达式已经适合,因此无法进一步评估是真实的。因此,例如,如果浏览器是android,则表达式的计算结果为["Android"]。如果是Windows,它将是["Windows"]。如果不是这些,它将是null。这表明any()只能返回Arraynull

isMobileBrowser如果是这些移动浏览器,则应为true,这意味着isMobileBrowser如果符合true

any()评估为Array

或以其他方式

如果any()未评估为null

是:

$scope.isMobileBrowser = isMobile.any() instanceof Array;//looks messy
$scope.isMobileBrowser = (isMobile.any()).constructor === Array;//looks messy
$scope.isMobileBrowser = Array.isArray(isMobile.any());//looks messy
$scope.isMobileBrowser = Object.prototype.toString.call(isMobile.any()) 
                                   === "[object Array]";//looks messy

或者另一种方式:

$scope.isMobileBrowser = isMobile.any() !== null;
$scope.isMobileBrowser = !(isMobile.any() === null);
isMobileBrowser = !(Object.prototype.toString.call(isMobile.any()) 
                                   === "[object Null]");//looks messy

因此,我们讨论了检查nullArray的不同方法。您有两组可能的输出

  1. null值始终为false
  2. 始终为Array的{​​{1}}(您可以查看此empty array scenario,但这不适用于此处)
  3. 因此,您只需执行以下操作即可转换为精确true,而无需担心:

    boolean

    @rossipedia在答案中解释了isMobileBrowser = Boolean(isMobile.any()); //to convert value to boolean isMobileBrowser = !!isMobile.any(); //another way to convert to boolean //!!["Android"] is true //!!null is false

答案 2 :(得分:0)

一种表达你想要的简洁方式:

$scope.isMobileBrowser = !!isMobile.any();

!!有两件事:

  1. 第一个!评估isMobile.any()的返回值的“真实性” 1 ,然后否定它。
  2. 第二个!再次否定了这个价值。
  3. 所以,如果false返回.any(),则nulltrue,否则为.any()

    但是,在null返回“麻痹”的边缘情况下,这可能会失败。在这种情况下,具体检查isMobile.any() !== null 是您想要的:

    {{1}}

    1 :“真实”:

      

    在JavaScript中,truthy值是在布尔上下文中求值时转换为true的值。所有值都是真实的,除非它们被定义为假(即,除了false,0,“”,null,undefined和NaN)。

    来自MDN

答案 3 :(得分:-1)

试试这个:

$scope.isMobileBrowser = isMobile.any() === null;