2015-10-08 55 views
0

想要检查空值。 any()方法返回null或匹配结果数组(实际上有一个match()方法返回)。在Javascript中检查空值(使用三元运算符)

$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()); 
    } 
}; 
+0

*是否有其他更有效的解决方法?* - 您确定您的程序由于此行而变得缓慢吗? – thefourtheye

+0

不,它不慢。我想知道正确性,如果还有其他更好的选择。 – fatCop

+1

如果您确实不需要返回的数组,请使用'test()'而不是'match()'。 – Teemu

回答

3

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

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

我只是做一些像isMobile.any() !== null

+0

为什么'any'返回一个空字符串?正如@Salman在最初的问题中所说的那样? – sabithpocker

+2

@sabithpocker OP状态*'any()'方法返回'null'或'string' *。这是唯一确定的事情。附加*“实际上有一个'match()'方法返回内部”*提示了一些实现细节,但非常含糊。 @萨勒曼还表示,那里还有更多。 因此,现在制定的问题是,我们返回了'null'或'string',并且没有任何东西禁止这个字符串为空。 – lexicore

+0

@lexicore请参阅编辑 – fatCop

-1

试试这个:

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

+1

我认为'==='是错误的:*如果any()'方法返回'null'我想'false'被赋值给'$ scope.isMobileBrowser'变量... * – lexicore

+0

@lexicore然后只是使用!== ... – Bardo

+0

请考虑编辑您的帖子以添加更多关于您的代码的解释以及为什么它可以解决问题。一个主要包含代码的答案(即使它正在工作)通常不会帮助OP了解他们的问题。如果这只是猜测,也建议您不要发布答案。一个好的答案会有一个合理的理由解释为什么它可以解决OP的问题。 – SuperBiasedMan

0

表示要会是怎样的一种简洁的方式:

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

!!有两件事:

  1. 第一!评估“感实性”的isMobile.any()返回值的,然后取消它。
  2. 第二个!再次否定该值。

所以,你最终以什么为false如果.any()回报null,否则true

但是,这可能会在.any()返回“虚假”的边缘情况下失败。在这种情况下,检查null特别是你想要什么:

isMobile.any() !== null 

:“感实性”:

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

MDN

+1

'!! isMobile.any()'如果any()'返回''“''将成为'false'。根据问题应该是真的。 – lexicore

1

作为每any()功能,正在返回以下表达式的值:

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

这些函数可以返回一个Arraynulldoc for match

看出所以当评估OR它会评估为第一个truth值遇到并没有任何进一步评估作为表达已经适合是真实的。因此,例如,如果浏览器是android,表达式的计算结果为["Android"]。如果窗口将是["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这始终是true(您可以检查此empty array scenario虽然说在这里不适用)

所以你可以简单地做到以下几点转换那些到确切的boolean而不用担心:

isMobileBrowser = Boolean(isMobile.any()); //to convert value to boolean 
isMobileBrowser = !!isMobile.any(); //another way to convert to boolean 
            //!!["Android"] is true 
            //!!null is false 

@rossipedia在他的回答中解释了!!