0

我有一个看起来像这样的小脚本:

hideElements = arguments.shift().split ( ',' );
for ( iterator in hideElements ) { 
    console.log ('  --> hiding ' + hideElements[iterator] );
    lg_transitions ( {kind:"slide-up"} , { target : hideElements[iterator] } );
}

当我在调试器中运行它时,所有事情都非常合理地开始。我在上面列出的第一行放置了一个断点。按下“跳过下一个函数调用”按钮后,将“hideElements”变量初始化为以下内容:

在此处输入图像描述

这是我所期望的,但是在完成第一次(并且应该是唯一的)迭代之后,它又回到了循环的头部,并且从 0 开始的“迭代器”现在奇怪地变成了“删除” . 嗯?不知道那是从哪里来的。但在随后的 console.log 消息中可能会有提示......它将以下内容打印到控制台:

在此处输入图像描述

这是一个叫做——你猜对了——“remove”的函数。这是我最近出于不同原因添加的一个函数,但它没有被直接或间接调用,所以我不知道为什么会在这里使用它。对于任何对“删除”的完整代码感兴趣的人,这里是:

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
   var rest = this.slice((to || from) + 1 || this.length);
   this.length = from < 0 ? this.length + from : from;
   return this.push.apply(this, rest);
}

添加:

我之前忽略添加的代码是参数数组的初始化。这是我所拥有的(注意我已经将名称改为“args”而不是参数):

function ConditionalFormatting ( key , eventObject , setOfRules ) {
console.log ("Entering conditional formatting: key is " + key + ", eventObject is " + eventObject.attr('id') + ", setOfRules is " + setOfRules );
var ruleStrings = [];
ruleStrings = setOfRules.split (';');
var targetOverride = false;
jQuery.each ( ruleStrings , function ( i , ruleString ) {
    // There is a rule, now let's find out which one
    var targetElement;
    var args = [];
    args = ruleString.split('::');
    var rule = args.shift();
4

2 回答 2

1

@Yoshi 是对的:for in将列出对象中的所有字段——这就是数组的实际情况。

尝试使用hasOwnProperty方法:

hideElements = arguments.shift().split ( ',' );
for (iterator in hideElements ) { 
    if (hideElements.hasOwnProperty(iterator))
    {
        console.log ('  --> hiding ' + hideElements[iterator] );
        lg_transitions ( {kind:"slide-up"} , { target : hideElements[iterator] } );
    }
}

这就是为什么您通常应该避免使用for into 遍历数组而使用普通for循环来代替。jsHint/ jsLint将为您发布的代码提供如下消息:

The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.

边注:

for (iterator in hideElements )将创建一个全局变量iterator,而for (var iterator in hideElements )不会。

于 2012-11-09T22:21:48.863 回答
0

arguments对象不是实际的数组。因此它没有这个shift()功能。如果您想要数组中的第一个对象,请获取索引 0 处的元素(第一个对象)。此外,使用常规 for 循环遍历 arguments 对象。

hideElements = arguments[0].split(',');

for ( var i = 0; i < hideElements.length; i++ ) {
    ...
}

arguments不是真正的数组,但是,如果您希望像使用数组一样使用它,请使用Array.prototype.slice.call( arguments );

if ( arguments.length > 0)
    hideElements = Array.prototype.slice.call( arguments ).shift();

从那里你可以使用 hideElements 作为一个数组。

于 2012-11-09T22:24:53.923 回答