Javascript 谁能给我解释一下这行突出显示的代码吗? var根=[],子={}; //查找顶级节点并基于父节点散列子节点 对于(变量i=0,len=arry.length;itarget=root 否则 如果children[p]不为空,则target=children[p] Else子[p]=[]然后目标=子[p]这是一个空数组 相等的

Javascript 谁能给我解释一下这行突出显示的代码吗? var根=[],子={}; //查找顶级节点并基于父节点散列子节点 对于(变量i=0,len=arry.length;itarget=root 否则 如果children[p]不为空,则target=children[p] Else子[p]=[]然后目标=子[p]这是一个空数组 相等的,javascript,Javascript,我的理解是,如果p为null,那么该父级的childrens应该为空,但是为什么需要使用此代码中使用的| |表达式呢 (children[p]|(children[p]=[])如果未定义children[p](或此值为false、未定义、null、0…),则使用新数组进行设置 逻辑OR运算符(| |)返回其第二个操作数的值,如果第一个操作数为falsy,则返回第一个操作数的值 e、 一, 这是一个带有反向检查的p,它是父项 如果p不存在,则采用根,否则采用父级的子级或为其分配一个空数组作为默认值

我的理解是,如果p为null,那么该父级的childrens应该为空,但是为什么需要使用此代码中使用的| |表达式呢


(children[p]|(children[p]=[])

如果未定义
children[p]
(或此值为false、未定义、null、0…),则使用新数组进行设置

逻辑OR运算符(| |)返回其第二个操作数的值,如果第一个操作数为falsy,则返回第一个操作数的值

e、 一,

这是一个带有反向检查的
p
,它是父项

如果
p
不存在,则采用
,否则采用父级的子级或为其分配一个空数组作为默认值,然后采用它

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

|是逻辑运算符或条件运算符。它返回第一个或第二个操作数,具体取决于第一个操作数是truthy还是false。truthy值表示除0未定义的null之外的任何值,“”或


这个
root:(children[p]|(children[p]=[])
意味着如果
children[p]
truthy那么root是
children[p]
否则root将是
children[p]=[
children[p]
将被分配一个空数组,而不是一个

这是一种更简洁的描述

target = !p                                // condition
    ? roots                                // true part
    : (children[p] || (children[p] = [])); // else part
一步一步地
  • target=!p?x:y
    表示
    如果不是p
    target=x
    。否则
    target=y
  • (children[p]=[])
    表示将空数组分配给
    children[p]
  • (children[p]|(children[p]=[])
    表示如果
    children[p]
    不为空,则返回该值。否则,为
    children[p]
    分配一个空数组,然后返回它
结合它
  • 如果
    p为空或未定义
    =>
    target=root
  • 否则
    • 如果
      children[p]不为空
      ,则
      target=children[p]
    • Else
      子[p]=[]
      然后
      目标=子[p]
      这是一个空数组
相等的
有一个三元运算符来检查
p
是否不是父项,然后将目标设置为子项,将p元素数组设置为新的空数组

target = !p                                // condition
    ? roots                                // true part
    : (children[p] || (children[p] = [])); // else part
if (!children[p]) {
  children[p] = [];
}
if (!p) {
  target = roots;
} else if (children[p]) {
  target = children[p];
} else {
  children[p] = [];
  target = children[p];
}