1.5 版本 for in 循环乱了

首先在1.4.2版本是正常的,更新到1.5版本后,首先是很多代码在运行时报错,集中在for(var i in xxx)里面(xxx是数组),i会出现类似于’post’的字符串,然后把所有for(var i in xxx)改为for(var i=0;i<xxx.length;++i)后,这个问题不报了,但是对象里面记录的很多数据都是乱的,导致原来正常消息发送到服务器端变成异常消息

服务器大量异常消息

1赞

for in好像有问题

如果不prototype array就没有问题

我也出现这问题 也是使用for (var i in xxx)

xxx这个array length只有1 可是他会跑两次 第二次就乱掉了

目前找不到任何问题, 倒是editor一直出现
Introduced global variable while editing: i
Introduced global variable while editing: l

求解

1赞

数组本来就不能用 for in
这个 bug 是 box2d 引入的,不过我们不打算帮它擦屁股了,反正有这个 bug 还能逼着你们写出更正规的代码。

3赞

个人感觉作为游戏开发引擎,还是应该考虑修复的。

数组不能用for in在很多帖子里说过吧,为什么是bug还要用,难道不应该用本来就正确的东西么

语言上没有限制不能这样用,你说这样写不行,是因为知道数组Array对象被污染了,但对于一个不知情的开发者来说他是不知道的,在他自己没有修改Array对象前,你感觉这样写也有问题吗?

就算没有被污染,也不应该这样用

是的,有问题

JS 的自由度很大,如果引擎要对各种情况做防御性措施,会造成性能损耗过高,伤害了引擎的核心价值。用任何一种语言和框架,都难免有需要避免的使用方式,并不是可以编译通过/可以运行的姿势就一定是正确的,就好像体位一样,不同的人适合的体位不同,磨合好了,才能有最好的感受。引擎用好了,才能发挥最大效能~

我建议这位不知情的开发者趁早改行, 不管引擎有没有问题, 都是不应该用fo in去遍历Array

就事论事,改不改行你说了不算。 动不动上升到人身层面,呵呵~~

如果明确知道Array对象没有污染,哪种写法都不能被否定。

JS的很大一部分部分魅力不也是因为这些吗?

就像可以随意给this对象添加属性一样,这样写是不严谨的,但即使如果,即使知道不对,就不能这样写吗?

我觉得没有必要这样激动,数组不能用for in 那就不用呗,这有什么呢,而且本来也不应该用for in,虽然原来支持,这就像c语言里,你用了一个释放的内存,之前一直没问题,忽然有一天,系统不让用了,那你还要投诉微软,mac,linux么?

你不否定也行,但是放到 box2d 这就不干了,是吧?一下子就被教做人。

这不是魅力,这是弊端

你可以随意添加属性。但是, for in 数组就不能这样写,因为你明知道有 for 循环,改成 for 循环也不会多多少代码,既然有更标准的写法,性能更高,大家看得更直白,为何不呢?

OK,请问如下代码要怎么写好,我不想加 hasOwnProperty

var requestHeaders = [];
requestHeaders[‘Test-Tag’] = “test”;

for(var key in options.headers)
{
request.setRequestHeader(key, options.headers[key]);
}

做游戏真的不能那么随意,你知道每给对象添加一个新的属性,都会产生一个新的 hidden class 么?都会导致属性索引的时候效率降低么?

游戏的效率很重要,JS 今天的自由度是有历史原因的,很多特性其实都对性能非常不友好,比如一个变量,你一会用来存 string,一会用来存数组,就会造成巨大的性能浪费,这种浪费是完全没必要的。

如果你一定要用,造成问题,总能改把?如果一定要说服引擎去改,这个我们只能回复抱歉,我们不会去兼容这种写法。

这样遍历一个数组,不复杂吧?所有程序员一看就知道是遍历数组,没有歧义:

for (var i = 0; i < options.headers.length; ++i)
{
    request.setRequestHeader(key, options.headers[i]);
}

你非要对着干写一个 for (var key in xxx) ,鬼知道这是一个数组,人家还以为你是遍历字典呢,小心被揍

没有任何问题,但creator用的JS,如果creator用的C#,或者对格式要求更严格的golang,那么这没有任何问题,但creator恰恰用的是JS