我正在阅读一本JavaScript/HTML5书籍,遇到了一个我不理解的表达式。代码使用JavaScript的. canplaytype()函数来检查浏览器是否支持给定的HTML5音频格式(在本例中是检查mp3支持)。我混淆的特定表达式在第四行:
var audio = document.createElement('audio');
var mp3Support;
console.log(audio.canPlayType('audio/mpeg')); // returns probably
mp3Support = "" != audio.canPlayType('audio/mpeg');
console.log(mp3Support); // returns true
我使用Chrome,它支持mp3文件,所以第三行返回'probably'。然而,第五行返回'true'。在第四行中发生了什么,将"probably"的值转换为"true"?这个结构后面的表达式有名字吗?
!=
使用抽象相等比较算法对表达式进行比较,如果不同则返回true
,如果相等则返回false
。
11.9.2 Does-not-equals操作符(! =)
生成的EqualityExpression: EqualityExpression
!=
RelationalExpression按如下方式求值:
- 设lref为EqualityExpression的求值结果。
- 让 lval 是GetValue ( lref )。
- 让rref为RelationalExpression求值的结果。
- 让 rval 是GetValue ( rref )。
- 设r为执行抽象相等比较的结果rval == lval。(见11.9.3)。
- 如果r 真正,返回假。否则,返回true
在您的示例中,空字符串""
与字符串"probably"
不同。所以运算符返回true
您可能会感到困惑,因为您同时看到了赋值操作符=
和比较操作符!=
(不等于)。这是不一样的。实际上它在说:
if (audio.canPlayType('audio/mpeg') == "")
mp3Support = false;
else
mp3Support = true;
可简化为:
mp3Support = !(audio.canPlayType('audio/mpeg') == "")
再次还原为你看到的:
mp3Support = "" != audio.canPlayType('audio/mpeg');