这个JavaScript表达式的结构是什么?为什么它的求值为'true'?(HTML5音频标签和canP

What is the structure of this JavaScript expression and why does it evaluate to 'true'? (HTML5 audio tag and canPlayType() function)

本文关键字:true 音频 canP 标签 HTML5 结构 表达式 JavaScript 是什么 为什么 这个      更新时间:2023-09-26

我正在阅读一本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按如下方式求值:

  • lrefEqualityExpression的求值结果。
  • lval 是GetValue ( lref )。
  • rrefRelationalExpression求值的结果。
  • 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');