Javascript逻辑“!==”运算符?
我正在回到web开发中,并且一直在努力研究最近jscript的细微差别。 我正在通过Three.JS之上build立的THREEx扩展库的源代码注意到这个function
THREEx.KeyboardState.prototype.pressed = function(keyDesc) { var keys = keyDesc.split("+"); for(var i = 0; i < keys.length; i++){ var key = keys[i]; var pressed; if( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){ pressed = this.modifiers[key]; }else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){ pressed = this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ]; }else { pressed = this.keyCodes[key.toUpperCase().charCodeAt(0)]; } if( !pressed) return false; }; return true; }
我特别看这里的线:
if( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){
我不熟悉这个!==运算符。 我检查了w3schools和他们的逻辑运算符列表没有包括这一个。 我不确定这是否拼写错误,浏览器只是把它算作!=或者是否有其他含义。 还有,我想知道这是否是一个单一的逻辑运算符,或者是否是某种组合,就像! + ==?
您还可以在其他几种dynamictypes语言中find===
和!==
运算符。 它总是意味着这两个数值不仅可以通过它们的“隐含”值(也就是两个值中的任何一个或两个值可以转换成可比较的值)进行比较,而且也可以通过它们的原始types进行比较。
这基本上意味着,如果0 == "0"
返回true, 0 === "0"
将返回false,因为您正在比较一个数字和一个string。 同样, 0 != "0"
返回false, 0 !== "0"
返回true。
这是!=
没有types的强制。 有关比较运算符,请参阅MDN文档 。
另请参阅此StackOverflow答案 ,其中包含关于==
和!=
问题的“JavaScript:The Good Parts”的引用。 ( null == undefined
, false == "0"
等)
简短的回答: 总是使用===
和!==
除非你有一个令人信服的理由否则。 (像JSLint , JSHint , ESLint等工具会给你同样的build议。)
从正式规范复制: ECMAScript 5.1第11.9.5节
11.9.4严格的等号操作员(===)
生产EqualityExpression : EqualityExpression === RelationalExpression的计算如下:
- 让lref是评估EqualityExpression的结果。
- 让lval成为GetValue( lref )。
- 让rref是评估RelationalExpression的结果。
- 让rval是GetValue( rref )。
- 返回执行严格的相等比较rval === lval的结果 。 (见11.9.6)
11.9.5严格不等于运算符(!==)
生产EqualityExpression: EqualityExpression !== RelationalExpression的计算方法如下:
- 让lref是评估EqualityExpression的结果。
- 让lval成为GetValue( lref )。
- 让rref是评估RelationalExpression的结果。
- 让rval是GetValue( rref )。 设r是执行严格的平等比较rval === lval的结果 。 (见11.9.6)
- 如果r为真 ,则返回false 。 否则,返回true 。
11.9.6严格平等比较algorithm
比较x === y ,其中x和y是值,产生true或false 。 这样的比较如下进行:
- 如果Type( x )与Type( y )不同,则返回false 。
- types( x )是未定义的,返回true 。
- types( x )为空,返回true 。
- types( x )是数字,然后
- 如果x是NaN,则返回false 。
- 如果y是NaN,则返回false 。
- 如果x与y的 Number值相同,则返回true 。
- 如果x是+0,y是-0,则返回true 。
- 如果x是-0,y是+0,则返回true 。
- 返回false 。
- 如果Type( x )是String,则返回true,如果x和y是完全相同的字符序列(相同长度和相同位置的相同字符); 否则,返回false 。
- 如果Type( x )是布尔型,则返回true,如果x和y都为真或者都为假 ; 否则,返回false 。
- 如果x和y引用同一个对象,则返回true 。 否则,返回false 。
!==
opereratortesting值是否不相同或不是相同的types。 即
var x = 5; var y = '5'; var 1 = y !== x; // true var 2 = y != x; // false
参考这里
!==是严格的不等于运算符,如果两个操作数不相同和/或不是相同types,则只返回true值。 以下示例返回一个布尔值true:
a !== ba !== "2" 4 !== '4'
!==
这是严格不相等的运算符,如果两个操作数不相等和/或不是相同types,则只返回true值。 以下示例返回一个布尔值true:
a !== b a !== "2" 4 !== '4'