L.A*_*Ann 5 javascript operator-precedence underscore.js
我正在阅读 Underscore.js 的源代码,然后有些事情让我困惑:
// Its code, check the passed-in parameter obj
_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
Run Code Online (Sandbox Code Playgroud)
我对运算符的表达顺序感到困惑。
我认为运算符优先级
return type === 'function' || type === 'object' && !!obj;
Run Code Online (Sandbox Code Playgroud)
将从left到right;我的意思是等于:
return (type === 'function' ) || ( type === 'object' && !!obj);
Run Code Online (Sandbox Code Playgroud)
如果 回报type相等;否则操作;如果返回相等,则与; 否则返回;functiontruetype === 'object' && !!objtypeobject!!objBoolean(obj)false
我举了一些例子:
var a = alert(1) || alert(2) && alert(3);
alert(a); //result : 1, 2 undefined;
var a = alert(1) || alert(2) && 0;
alert(a); //result : 1, 2 undefined;
Run Code Online (Sandbox Code Playgroud)
让我困惑的是:
为什么!!obj应该存在?如果我们删除!!obj,代码也会运行。
这段代码的运算符顺序?我知道&&运算符高于||,所以我猜测!!objobj 为 null 时的效果,但当我练习时,这不是我想要的;
false如果该对象是 ,他们希望返回null。通常,当我们需要知道某物是否是对象时,这null并不是我们要寻找的。这是因为尝试访问null的属性(null[propName]例如)会引发错误。
console.log(typeof null);Run Code Online (Sandbox Code Playgroud)
表达式的执行顺序type === 'function' || type === 'object' && !!obj;是从左到右:
type === 'function'- 如果这是true表达式将返回
true而不计算其余部分type === 'object'- 如果这是false表达式将返回
false而不计算最后一部分!!obj-null将返回false,任何其他对象都会返回true该片段演示了流程:
step(false, 1) || step(true, 2) && step(true, 3)
function step(ret, step) {
console.log(step);
return ret;
}Run Code Online (Sandbox Code Playgroud)
使用
!!我们可以将值转换为布尔值 - 因此,真值将转换为 true,例如!!{} === true,而 false 值将转换为 false,例如!!null === false。