我正在重新开始进行Web开发,并且最近一直试图重新审视jscript的细微差别。我正在倾注在Three.JS之上构建的THREEx扩展库的源代码,并注意到了这个函数
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,他们的逻辑运算符列表中没有包含这个。我不确定这是否拼写错误,浏览器只是将其视为!=或者它是否有其他含义。另外我想知道这实际上是一个逻辑运算符还是它是某种组合,比如! + ==?
答案 0 :(得分:85)
您也可以在其他几种动态类型的语言中找到===
和!==
运算符。它总是意味着这两个值不仅通过它们的“隐含”值进行比较(即,可以转换其中一个或两个值以使它们具有可比性),还可以通过它们的原始类型进行比较。
这基本上意味着如果0 == "0"
返回true,0 === "0"
将返回false,因为您正在比较数字和字符串。同样,当0 != "0"
返回false时,0 !== "0"
返回true。
答案 1 :(得分:18)
没有类型强制的!=
。请参阅MDN documentation for comparison operators。
另请参阅this StackOverflow answer,其中包含有关==
和!=
问题的“JavaScript:好部分”的引用。 (null == undefined
,false == "0"
等。)
简短回答:始终使用===
和!==
,除非您有令人信服的理由不这样做。 (JSLint,JSHint,ESLint等工具会给你同样的建议。)
答案 2 :(得分:8)
从正式规范复制: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 true ,请返回 false 。否则,请返回 true 。
醇>11.9.6严格的等式比较算法
比较 x === y ,其中 x 和 y 是值,产生 true 或 false 。这样的比较如下进行:
- 如果Type( x )与Type( y )不同,请返回 false 。
- 类型( x )未定义,返回 true 。
- 类型( x )为空,返回 true 。
- 类型( x )是Number,然后
- 如果 x 为NaN,请返回 false 。
- 如果 y 为NaN,请返回 false 。
- 如果 x 与 y 的数字值相同,请返回 true 。
- 如果 x 为+0且y为-0,则返回 true 。
- 如果 x 为-0且y为+0,则返回 true 。
- 返回 false 。
- 如果Type( x )是String,那么如果 x 且 y 完全相同,则返回 true 字符序列(相应位置的长度和字符相同);否则,返回 false 。
- 如果Type( x )为布尔值,则返回 true ,如果 x 且y都 true 或两者都是的假强>;否则,返回 false 。
- 如果 x 且 y 引用同一个对象,则返回 true 。否则,请返回 false 。
醇>
答案 3 :(得分:2)
!==
opererator测试值是否相同或不相同。
即。
var x = 5;
var y = '5';
var 1 = y !== x; // true
var 2 = y != x; // false
答案 4 :(得分:2)
答案 5 :(得分:0)
!==
这是严格的不等于运算符,只返回值true 如果两个操作数不相等和/或不相同。该 以下示例返回一个布尔值true:
a !== b
a !== "2"
4 !== '4'