为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]

Posted

技术标签:

【中文标题】为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]【英文标题】:Why use /*, */ around arguments and why use >>> when extracting the length of an array? [duplicate]为什么在参数周围使用 /*、*/ 以及为什么在提取数组长度时使用 >>>? [复制] 【发布时间】:2010-11-26 00:13:32 【问题描述】:

我在developer.mozilla.org站点的indexOf页面上查看javascript参考手册,注意到他们的indexOf实现代码中有一些东西,希望有人能给我解释一下。

为了节省大家往返 Mozilla 网站的时间,这里是整个功能:

if (!Array.prototype.indexOf)

  Array.prototype.indexOf = function(elt /*, from*/)
  
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    
      if (from in this &&
          this[from] === elt)
        return from;
    
    return -1;
  ;

我不明白的是函数声明中的/*, from*/,以及提取长度的零填充右移&gt;&gt;&gt;数组 (var len = this.length &gt;&gt;&gt; 0;)。

【问题讨论】:

【参考方案1】:

/*, from */ 是一个注释掉的参数。但是,它似乎已留在 cmets 中以表明可以可选地为函数指定此参数。

var from = Number(arguments[1]) || 0;

我相信 arguments[1] 将是 from 如果传入的值。

参数数组特别 有用的功能,可以 以可变数量调用 论据,或有更多的论据 他们被正式宣布接受。 http://www.devguru.com/Technologies/Ecmascript/Quickref/arguments.html

&gt;&gt;&gt; 是无符号右移。它在这里被用来将可能有符号的数字length 转换为无符号的数字。

Extract from Professional JavaScript for Web Developers

http://www.c-point.com/javascript_tutorial/jsoprurshift.htm

【讨论】:

谢谢,现在明白了。我没有意识到长度属性可以是无符号的,javascript有时让我感到困惑:)【参考方案2】:

/*, from */ 是可选参数。之后通知var from = Number(arguments[1]) || 0;。如果在函数调用中传递了第二个参数,则变量 from 将设置为它。

不确定无符号右移。对我来说没有任何意义。

【讨论】:

【参考方案3】:

函数声明中的/*, from*/只是作者的一个注释,说明还有第二个可选参数from。它是作为注释写的,因此它不是签名的一部分(Array.prototype.indexOf.length 返回 1)。

而右移可能总是用来得到一个整数值this.length

【讨论】:

以上是关于为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从字符串中提取数字 - 为啥在使用捕获组时会得到两个数组?

堆栈周围的变量损坏。为啥会这样? [关闭]

为啥 SOAP 参数的顺序在 PHP SOAP 中很重要,以及如何解决它?

在 UITableView 中使用 Auto Layout,为啥周围有这么多多余的空间?

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥在 Bash 中的 '[' 和 ']' 周围应该有空格?