JavaScript中运算符的顺序(| |,&;)

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 ===

我正在阅读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 === 'function' || type === 'object' && !!obj;
将从
左侧
右侧
;我的意思是等于:

return (type === 'function' ) || ( type === 'object' && !!obj);
如果
类型
等于
函数
返回
;else operate
type==='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”