Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,string/array.length属性是否进行任何处理?_Javascript - Fatal编程技术网

在JavaScript中,string/array.length属性是否进行任何处理?

在JavaScript中,string/array.length属性是否进行任何处理?,javascript,Javascript,在对字符串或数组(或任何其他具有length属性的对象)进行迭代时,我总是使用如下循环: var foo = [...]; var i; for(i=0; i<foo.length; i++) { // do something } var foo=[…]; var i; 对于(i=0;i可能与“常规”数组没有太大区别,但对于“node.children.length”之类的数组,我会出于安全考虑出错,只调用一次。CoffeeScript会自动为您这样做 请注意,如果长度在循环过

在对字符串或数组(或任何其他具有length属性的对象)进行迭代时,我总是使用如下循环:

var foo = [...];
var i;
for(i=0; i<foo.length; i++) {
    // do something
}
var foo=[…];
var i;

对于(i=0;i可能与“常规”数组没有太大区别,但对于“node.children.length”之类的数组,我会出于安全考虑出错,只调用一次。CoffeeScript会自动为您这样做


请注意,如果长度在循环过程中发生变化,则行为会有实际差异。

可能与“常规”数组没有太大差异,但对于“node.childrence.length”之类的数组,我会出于安全考虑出错,只调用它一次。CoffeeScript会自动为您这样做

for(i=0, L=foo.length;i<L; i++) {
    // do something to foo[i]
}
请注意,如果在循环过程中长度可能发生变化,则行为会有实际差异。

for(i=0, L=foo.length;i<L; i++) {
    // do something to foo[i]
}
for(var i=0;i
在查找“长度”属性时,这有点效率低下 每次循环一次。改进如下:

for(var i=0,len=a.length;i
来自

for(var i=0;i
在查找“长度”属性时,这有点效率低下 每次循环一次。改进如下:

for(var i=0,len=a.length;i
在某些情况下,将长度放入局部变量比访问
.length
属性要快,并且它随浏览器的不同而变化。在这里已经有过关于这一点的性能讨论和大量的jsperf测试。在现代浏览器中,差异并不像我想象的那样大,但它们是不同的在某些情况下确实存在(我似乎找不到以前的线程)

还有不同类型的对象可能具有不同的性能特征。例如,javascript数组的性能特征可能不同于从某些DOM函数(如
getElementsByClassName()
)返回的类似数组的对象


而且,在某些情况下,您可能要将项添加到数组的末尾,而不希望遍历所添加的项,以便在开始之前获得长度。

在某些情况下,将长度放入局部变量比访问
.length
属性更快,并且它随浏览器而异。关于这一点,这里已经有过很多关于性能的讨论,也有很多jsperf测试。在现代浏览器中,差异并不像我想象的那么大,但在某些情况下确实存在差异(我似乎找不到以前的线程)

还有不同类型的对象可能具有不同的性能特征。例如,javascript数组的性能特征可能不同于从某些DOM函数(如
getElementsByClassName()
)返回的类似数组的对象


而且,在某些情况下,您可能会将项目添加到数组的末尾,而不希望迭代所添加的项目,以便在开始之前获得长度。

这取决于您是否正在更改foo的长度

var foo = [1,2,3];
  while(foo.length){
  foo.shift();
}
显然,代码是跟踪foo的长度,而不是简单地记住一个值

可以将长度指定为循环中的数字

for(i=0, L=foo.length;i<L; i++) {
    // do something to foo[i]
}

对于(i=0,L=foo.length;i它取决于您是否正在更改foo的长度

var foo = [1,2,3];
  while(foo.length){
  foo.shift();
}
显然,代码是跟踪foo的长度,而不是简单地记住一个值

可以将长度指定为循环中的数字

for(i=0, L=foo.length;i<L; i++) {
    // do something to foo[i]
}

(i=0,L=foo.length;i相关信息:
for(var i=0,len=foo.length;i
在我的经验中,是使用这个想法的一种更常见的方式。它更整洁而且(我认为)更容易阅读,因为它将赋值保持在初始化的范围内-当然,这假设在循环开始之前不需要数组的长度。很多人都是这样做的;很多人不这样做是因为他们没有考虑它;少数人故意避免这样做是因为他们不喜欢尝试过早地优化或猜测JS解释器可能会为您优化什么。顺便说一句,仅仅因为属性在语法上没有用作函数并不意味着它不是动态的。最臭名昭著的是
innerHtml
,它被视为一个值,但在分配给时实际调用浏览器的HTML编译器。@nnnnnn:另一个常见的(如果顺序不重要的话,我最喜欢的)是
for(var i=foo.length-1;i>=0;i--{}
相关信息:
for(var i=0,len=foo.length;i
在我的经验中,是使用这个想法的一种更常见的方式。它更整洁而且(我认为)更容易阅读,因为它将赋值保持在初始化的范围内-当然,这假设在循环开始之前不需要数组的长度。很多人都是这样做的;很多人不这样做是因为他们没有考虑它;少数人故意避免这样做是因为他们不喜欢尝试过早地优化或猜测JS解释器可能会为您优化什么。顺便说一句,仅仅因为属性在语法上没有用作函数并不意味着它不是动态的。最臭名昭著的是
innerHtml
,它被视为一个值,但在分配给时实际调用浏览器的HTML编译器。@nnnnnn:另一个常见的(如果顺序不重要,我最喜欢的)是(var i=foo.length-1;i>=0;i--){}