JavaScript中运算符的顺序(| |,&;)
我正在阅读Underline.js的源代码,然后有一些东西让我困惑:JavaScript中运算符的顺序(| |,&;),javascript,underscore.js,operator-precedence,Javascript,Underscore.js,Operator Precedence,我正在阅读Underline.js的源代码,然后有一些东西让我困惑: // Its code, check the passed-in parameter obj _.isObject = function(obj) { var type = typeof obj; return type === 'function' || type === 'object' && !!obj; }; 我对表达式的运算符顺序感到困惑 我认为运算符优先于 return type ===
// Its code, check the passed-in parameter obj
_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
我对表达式的运算符顺序感到困惑
我认为运算符优先于
return type === 'function' || type === 'object' && !!obj;
将从左侧
到右侧
;我的意思是等于:
return (type === 'function' ) || ( type === 'object' && !!obj);
如果类型
等于函数
返回真
;else operatetype==='object'&&!!obj
;如果类型
相等对象
返回!!obj
,与布尔值(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;
让我困惑的是:
// Its code, check the passed-in parameter obj
_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
!!obj
是否应该存在?如果我们删除!!obj
,代码也可以运行&&
运算符比|
高,所以我猜!!obj
当obj为空时生效,但当我练习时,这不是我想要的如果对象为
null
,他们希望返回false
。通常,当我们需要知道某个东西是否是对象时,null
不是我们想要的。这是因为试图访问null
的属性(例如null[propName]
)会抛出错误
console.log(typeof null)代码>最后一个
!!obj
强制将返回值设置为布尔值,是的,这是必要的,因为typeof null
是object
首先,表达式不是从左到右读取的,因此它可以以任意方式写入--a和&b|c
与c|a和&b
相同。运算符优先级决定父项在表达式中的位置,因此a&&b|c
将是(a&&b)|c
。只有在每个运算符具有相同优先级的表达式中,运算符才会从左向右求值
关于你的实际问题——在javascript中,typeof null==“object”
,所以!!obj
表达式的一部分是防止null
值计算为true。问题是,既然null
是Javascript中的一个对象,为什么他们希望他们的.isObject
方法在null
上返回false
?@connexo嗯,因为在绝大多数情况下,您需要检查得到的是一个具有值的对象,而不是一个表示没有值的对象。此外,如果我们真的要把这个论点变成真的(我不确定你是否只是在这里扮演魔鬼代言人),那么我要指出,null instanceof Object//false
,而{}
和function(){}
都会返回true
。因此,isObject
函数与这些函数完全一致。同样,哪一个恰好是这种检查最常见的用例。@dv,要不要评论一下?您应该提到truthy falsy
在OP的情况下,a | | b
确实相当于b | a
,因为每个操作数都是布尔值。但JavaScript中的所有内容都不是这样,因为的“test”| |“2”
返回“test”
,的“test”
返回“2”
。