javascript中名为keys的参数有什么特别之处?

时间:2011-05-01 14:46:34

标签: javascript

当我为函数keys命名参数时,我看到了奇怪的行为。在第一个函数(set)中,我将它命名为keeys,并且它按预期工作,在第二个函数(xset)中我称之为键,这没有任何意义。我看了@javascript的保留字,并没有人提到密钥或设置为关键字,但Chromium脚本控制台(和SO)颜色设置(但不是键),好像它是一个关键字,如var,return,for,true。 ..

无论如何,这是代码:

<html>
<body>
    <script type='text/javascript'> 
    function set (keeys) {
        var result = {};

        for (var i = 0; i < keeys.length; i++)
            result[keeys[i]] = true;

        return result;
    }

    function xset (keys) {
      var result = {};

      for (var i = 0; i < keys.length; i++)
        result[keys[i]] = true;

      return result;
    }

    var myset1 = set(['a','b','c','d','e']);    
    var myset2 = xset(['a','b','c','d','e']);   

    </script>
</body>
</html>

这是Chromium的调试器输出。断点@第一行集:

> keeys
> ["a", "b", "c", "d", "e"]
> keeys.length
> 5

断点@xset的第一行:

> keys
> function (object)
    {
        return Object.keys(object);
    }
> keys.length
> 1

3 个答案:

答案 0 :(得分:0)

我并不完全正面,但我最好的猜测是它与版本1.8.5中引入Javascript的Object.keys有关。

另请注意,javascript数组实际上只是javascript 对象 ,这将进一步加剧问题。

答案 1 :(得分:0)

非常好奇,在Chromium 13.0.751.0上我看到以下

> keys
bound: function (object)
    {
        return Object.keys(object);
    }
> window.keys
undefined
> (1).keys
undefined
> "asd".keys
undefined
> {}.keys
SyntaxError: Unexpected token .
> [].keys ()
TypeError: Object  has no method 'keys'

任何人都能明白这一点吗?

答案 2 :(得分:0)

这很可能是一个错误,因为以下内容对我来说正常(Chrome 11.0.696.60):

function bloop(keys) {
    console.log(keys);
}

并且,在编写此测试之后,在控制台中运行您的代码,然后在jsbin中(打开您的控制台)。完美无缺地工作。如果您愿意,report it as a bug参加Chromium项目。

如果您不想使用keys,解决问题的一种可能方法是在脚本顶部运行:

if (keys !== undefined)
    var keys = undefined;

然后你可以正常恢复。

编辑:对于那些困惑的人,ES5(闪亮的闪亮JavaScript)中添加了一个名为Object的{​​{1}}变量的新功能。它被称为:

keys

它返回Object.keys({suzy : 4, companion : 'cube', turtle : 'orange'}); //returns ["suzy", "companion", "turtle"] //or, more abstractly Object.keys(obj); 中所有键的数组。请注意,obj位于keys,而不是Object,因此没有Object.prototype"hi".keys()

现在,出于开发目的,Chromuim团队引入了一些特定于控制台的功能(如obj.keys()),这些功能只能通过控制台调用,而不能通过其他任何地方调用。其中一个是clear的快捷方式,称为Object.keys。 由于可能是一个错误,这些功能泄漏,导致问题。