String.prototype.replace 的 javascript 兑现比较

String.prototype.replace 的 javascript 实现比较?chrome :?? 以前初学java时,总是被建议多看 jdk源码可

String.prototype.replace 的 javascript 实现比较

?

chrome :

??

以前初学java时,总是被建议多看 jdk源码可以大大增强功力,后来想把这套也搬到javascript的学习过程中,无奈发现本来应该算作javascript 基础api范畴的 String , Array ... 等都是 native code ,但现在不一样了,chrome V8 来了,我不懂他是怎么实现的,但是 javascript 中的基础 api 都是用 javascript 自身实现的(alert(String.prototype.replace);),和 java 越来越接近了,大概由于 v8 的作者以前就是搞jvm的,觉得这些东西还是像 java 一样作为工具包提供比较好吧。

?

V8 源码@google code

?

V8 作者的解释:

?

All library functions are implemented in JavaScript
Examples: Array.prototype.join, String.prototype.replace


The benefits of not implementing it inside the engine:
1.Keeps the core engine cleaner
2.Easier to change and extend
3.Capitalizes on the performance of the JavaScript compiler


One drawback is startup time ~30 ms ...(每次启动编译库代码)


启动慢的解决之道:

V8 allows saving the initial heap in a snapshot
1.Serialized form is very fast to read
2.Includes pre-compiled code for JavaScript builtins
3.Integrated in the build system and embedded directly in V8


With snapshots, the startup time is reduced to 4-8 ms


???? String.prorotype.replace 应该还算复杂,特别是 replacement可以为函数这个特性是java等静态没有的。


????? 看一下String的replace的主要框架实现吧(最复杂的正则表达式 + 函数替换),加了点注释便于理解。详见:String.js

?

?

谢谢    3 楼    yiminghe    2010-10-23              @lucane

我这里chrome8 返回是 function 类型,firefox 是 object
这个typeof 确实有点奇怪,不过一般还是推荐用 Object.prototype.toString来判断
都是 [object regexp]

callable 好像是精粹那本书说的,有一定道理,可能chrome v8引擎对正则表达是编译成函数来进行后面匹配了,但是这取决不同引擎,好像也没有规范

关于为什么不一样,则要看chrome引擎了(注意墙):

http://www.chromium.org/


我也是一直没有找到入门方法,你可以试试,有结果告诉我

4 楼 lucane 2010-10-23   @yiminghe
谢谢你这么晚还回答了我的问题
我也是偶然看到这个东西,但找了一段时间却没有发现为什么的
要是有结果一定告诉你