JavaScript:麻烦理解这个while循环中的逻辑

时间:2016-04-10 16:47:55

标签: javascript

Noob警报! 我似乎无法理解这个while循环中的逻辑。它取自O'Reilly的“JavaScript:The Definitive Guide”第15.3章,例15-2。我明白它用n--递减n。但我无法理解布尔AND运算符背后的推理或理论。这循环是什么意思?当n递减并且var存在?对我来说,它似乎应该递增,但当我改变 - 到++时,函数总是返回null。帮助我更深入地了解。

var firstpara = document.getElementsByTagName("p")[0];

/**
* Return the nth ancestor of e, or null if there is no such ancestor
* or if that ancestor is not an Element (a Document or DocumentFragment e.g.).
* If n is 0 return e itself. If n is 1 (or
* omitted) return the parent. If n is 2, return the grandparent, etc.
*/
function parent(e, n) {
    if (n === undefined) n = 1;
    while (n-- && e) e = e.parentNode;
    if (!e || e.nodeType !== 1) return null;
    return e;
}


parent(firstpara, 1); //returns <body>...</body> which is the parent node in my testpage

3 个答案:

答案 0 :(得分:1)

它返回n标记的<p>父项。

假设这是示例代码。

<div class="outer">
  <div class="inner">
    <p>Sample Code</p>
  </div>
</div>

parent(firstpara,1)会为您提供第一个祖先,在此示例中为<div class="inner">...</div>

parent(firstpara,2)会为您提供第二个祖先,在此示例中为<div class="outer">...</div>

parent(firstpara,0)会为您提供相同的标记,即<p>...</p>

最后,parent(firstpara,10000)会给你null,因为这样的祖先不存在(可能)。

我希望我说清楚。

答案 1 :(得分:1)

while条件语句由两部分组成,n--e。只要两者都是真的,循环就会继续。对于第一部分,如果(n--)== 0则为假。否则它是真的。如果定义了e,则第二部分为真。第一部分可能就是你被挂掉的东西。它基本上是做两个语句的简便方法:n = n - 1;后跟if (n != 0 AND e exists) then continue looping(伪代码)。

答案 2 :(得分:0)

假设双星号试图在示例中生成粗体文本,我们留下:

  while (n-- && e) e = e.parentNode;

n--对生成进行倒计时......一旦它达到零,它就会变为假,因此会停止循环。 - 将递减零,留下-1,但这没关系,因为它是在测试的减量之前的n的值。

如果节点提前用完,“e”也会停止循环,因为没有值为false。

&amp;&amp;确保n必须仍然是正的并且存在以继续。 bing false将结束循环。

Paranoid me会将循环编码为:

 while (n-- > 0 && e) e = e.parentNode;

这确保了无论如何,代码都不会以奇怪的方式失败。这是我很久以前学到的循环的一般规则,适用于所有循环。