gpt4 book ai didi

Javascript for..in 遍历参数 ie.for(arg in arguments) 在 IE8 中不起作用,但在 Chrome 8 中有效

转载 作者:数据小太阳 更新时间:2023-10-29 04:00:25 25 4
gpt4 key购买 nike

我遇到了这种奇怪的情况,其中 foreach 之类的 javascript 构造在 IE 中不起作用,但在 FF 中有效。不是所有的 for..in 只是这个特殊的函数不起作用。我会发布代码。在IE8中测试。还使用 XHTML DTD 进行了测试。

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Test </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<script type="text/javascript">
<!--
String.prototype.format = function() {
var formatted = this;
var mycars = new Array(); //some
mycars[0] = "Saab";
mycars[1] = "Volvo";
mycars[2] = "BMW";
var arg;
for (arg in mycars) { alert('it comes here');
formatted = formatted.replace("{" + arg + "}", arguments[arg]); }
return formatted;
};

String.prototype.format2 = function() {
var formatted = this;
var arg;
for (arg in arguments) { alert('it does not come here');
formatted = formatted.replace("{" + arg + "}", arguments[arg]); }
return formatted;
};

function fn() {
var s = 'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');
alert('format:'+s);
var s2 = 'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format2('ASP', 'PHP');
alert('format2:'+s2); //does not replace {0}s and {1}s
}
//-->
</script>
<BODY>
<input type="button" value="click " onclick="fn();" />

</BODY>
</HTML>

更新 我发布了一个错误的问题,它在 FireFox 中有效但在 IE8 中无效,这是错误的。它在 FireFox 中也不起作用。实际上我从帖子 JavaScript equivalent to printf/string.format 得到了这段代码.

最佳答案

首先,虽然 arguments函数中可用的对象不是数组,它足够“类似数组”,因此增量循环 (for (var i = 0, len = arguments.length; i < len; i++) { ... }) 更可取——不仅因为它运行得更快,而且因为它避免了其他陷阱——其中之一这正是你陷入的境地。

要真正回答为什么第二个循环不起作用的问题,重要的是要了解 for ... in 循环的作用:它遍历所有可枚举 在对象中找到的属性。现在,我在该声明中加粗了 2 个词,因为我有目的地使用这两个词来表示一些细微差别,虽然它们看起来很微妙,但如果您没有意识到发生了什么,可能会极大地影响代码的行为.

首先让我们关注所有 - 我的意思是说,不仅仅是对象本身的属性,还有对象从其原型(prototype)继承的潜在属性,或者它的原型(prototype)的原型(prototype)等等在。出于这个原因,通常建议您通过立即附加条件 if (obj.hasOwnProperty(p)) 来“保护”任何 for ... in 循环。 (假设你的循环写成 for (var p in obj) )。

但这不是您在这里遇到的问题。为此,让我们关注第二个词,可枚举。 JavaScript 中对象的所有属性要么是可枚举的,要么是不可枚举的,这几乎直接关系到该属性是否出现在 for ... in 循环中。结果表明,在 Firefox 和 IE 等浏览器中,arguments对象的数字属性不可可枚举(它的 length 也不是可枚举的),这正是您不迭代任何内容的原因!

但实际上,最后,要遍历数组或类数组的任何内容,最好使用增量循环(正如 M. Kolodny 也指出的那样),并完全避免这些恶作剧(更不用说潜在的跨浏览器不一致 - 我似乎注意到在 Chrome 10 中,arguments 对象的数字属性 是可枚举的!)

关于Javascript for..in 遍历参数 ie.for(arg in arguments) 在 IE8 中不起作用,但在 Chrome 8 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4824207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com