javascript - 在循环中出现错误的juju

  显示原文与译文双语对照的内容
0 0

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


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

当我在调试器中运行它时,一切都非常合理。 我在第一行列表中放置了一个断点。 按"单步执行下一个函数调用"按钮将"hideElements"变量初始化为以下值:

enter image description here

这就是我所期望的,然后完成第一个( 应该是唯一的) 迭代后,在 0开始的"迭代器"已经变成了"移除"。 啊不知道从哪里来的。 但是在 console.log 消息中可能会有一个提示。 它将以下内容打印到控制台:

enter image description here

这是一个叫做--的函数,你猜它是 --"移除"。 我最近添加了一个不同的原因,但是它没有直接或者间接地被调用,因这里我在这里失去了。 对于任何对"移除"的完整代码感兴趣的人,这里是:


//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);
}

添加:

我忽略之前添加的代码是参数 array的初始化。 下面是( 。注意我已经将名称改为"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();

时间: 原作者:

0 0

arguments 对象不是实际的array 。 因此它没有 shift() 函数。 如果需要 array 中的第一个对象,则获取索引 0 ( 第一个对象) 处的元素。 此外,使用正则表达式来遍历参数对象。


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

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

arguments 不是真正的array,但如果你想使用它像是一个 array,那么使用 Array.prototype.slice.call( arguments ); :


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

从那里可以使用hideElements作为 array 。

原作者:
0 0

@Yoshi 是正确的:for in 将列出对象中的所有字段- 这就是 array 实际上是什么。

尝试使用 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 in 遍历数组并使用普通 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 ) 将不会。

...