想要检查空值。 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());
}
};
答案 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())
这些功能中的每一项都可以返回Array
或null
,如doc for match
因此,在评估OR
时,它将 评估为 遇到的第一个truth
值,并且由于表达式已经适合,因此无法进一步评估是真实的。因此,例如,如果浏览器是android,则表达式的计算结果为["Android"]
。如果是Windows,它将是["Windows"]
。如果不是这些,它将是null
。这表明any()
只能返回Array
或null
。
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
因此,我们讨论了检查null
和Array
的不同方法。您有两组可能的输出
null
值始终为false
Array
的{{1}}(您可以查看此empty array scenario,但这不适用于此处)因此,您只需执行以下操作即可将转换为精确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();
!!
有两件事:
!
评估isMobile.any()
的返回值的“真实性” 1 ,然后否定它。!
再次否定了这个价值。 所以,如果false
返回.any()
,则null
为true
,否则为.any()
。
但是,在null
返回“麻痹”的边缘情况下,这可能会失败。在这种情况下,具体检查isMobile.any() !== null
是您想要的:
{{1}}
1 :“真实”:
在JavaScript中,truthy值是在布尔上下文中求值时转换为true的值。所有值都是真实的,除非它们被定义为假(即,除了false,0,“”,null,undefined和NaN)。
来自MDN
答案 3 :(得分:-1)
试试这个:
$scope.isMobileBrowser = isMobile.any() === null;