- 主题:JavaScript的for循环是我理解错了吗?
用 hasOwnProperty 啊
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 我能理解这种现象,但是感觉javascript的这种设计很蛋疼。因为现在有些工具会在Array.prototype里面做文章,这直接让 for(elem in array) 这种形式作废了。
--
FROM 118.195.70.*
难道不是应该用forEach咩?
如果考虑浏览器兼容,jQuery / underscore 之流也有each。
【 在 a316783812 (woniuppp) 的大作中提到: 】
: 数组就应该用这个,for in是用来遍历对象的
--
FROM 118.195.70.*
... 你确定你跑过?
【 在 Eliot (好警察) 的大作中提到: 】
: $.each也要自己判断hasOwn
--
FROM 118.195.70.*
以写起来舒服为第一目的,一般也不会把密集运算给放浏览器端。
跟写C/C++程序一样,优化是需要根据profile做的,每一行代码都去考虑这里是不是多一次寻址,会不会有cache命中率低问题,最后就累死了。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 用javascript的果然都已经不考虑运行效率了。据我所知,动态语言调用函数的开销都挺大的。
--
FROM 118.195.70.*
本帖难道不是在说数组么 -.-
【 在 Eliot (好警察) 的大作中提到: 】
: 数组不用,对象要用
: 印象中有人问过开发人员,为什么不内置hasOwn,说没必要,而且有跑分的压力
--
FROM 118.195.70.*
顺便说下开销的问题:
以v8为例,一个function的调用对应到的C++:
fn->GetFunction()->Call(v8::Context::GetCurrent()->Global(), 1, args)
其实跟一个C函数的调用比,开销虽大,但也没太大了。
那些个编译型之所以敢用很小块的函数主要是源于编译器的inline优化,要不你同样发现函数调用开销大。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 用javascript的果然都已经不考虑运行效率了。据我所知,动态语言调用函数的开销都挺大的。
--
FROM 118.195.70.*
循环体里每次都整个arr[i]或者每次都加个 var item = arr[i]挺烦人的啊。
$.each(arr, function (k,v){ blabla.. }) 看着顺眼多了。
其实我用的最多的是 underscore 的 _.map 跟 _.reduce,如果profile显示是热点我才去人肉给它展开(基本没做过)
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 没觉得$.each()有多方便。JavaScript又不是函数式编程语言,能根据可重入函数的特性做惰性计算并行计算什么的。$.each与for的区别不过是写法上的不同而已。
: 而且性能这个,积少成多。咱不能像那些搞Java的那样,大家都写一坨坨,最后搞成一撮矬。
--
FROM 118.195.70.*
就是取了几个地址,至于中间的v8::Local<v8::Object>之类的临时变量的构造析构,编译器是会优化掉很多的。
测试平均下来是这种
push xxx
call fn
fn:
push ebp
mov ebp, esp
...
ret
调用的10倍多点,是可以接受的。如果是内部逻辑大的话,这点开销就可以忽略了。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 还要寻找函数对象,构造Context之类的吧。
--
修改:ttl FROM 118.195.70.*
FROM 118.195.70.*