Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

字符串下标访问的实现差异

  现代浏览器中都支持从字符串上用类似数组下标的方式取相应位置的字符,类似charAt函数的功能。它的实现有点像Getter或者说像Proxy。ES5中是直接覆写[[GetOwnProperty]]内部方法来定义,但各大引擎的实现也许和ES不同,至少在v8中的实现是不同的。
  使用的时候它像一个数组,但是它不可能在我们使用它之前就把所有元素逐个计算出来做成元素。字符串的数量有时会很大,那么做只会浪费内存和降低字符串的性能,所以要实现这个效果只能在读取时下功夫。ES5中的定义是重写了字符串对象的[[GetOwnProperty]]方法来实现(ES5#15.5.5.2)。
  这从它自己的逻辑上是完全没问题的。但是v8里面并不是这么实现,由于v8的整个类结构都没按照ES的规范来写,在v8的内核中根本没有一个字符串对象的类(只在API上有),所以它有自己的实现方式。它在所有处理元素(元素指对象上属性名为自然数的属性)访问的代码中都加入了判断,对字符串做特殊处理(/v8/src/runtime.cc#L4748)。这只是一处,还能找到许多处对字符串的特殊处理,因为v8根据元素自身的存储优化方式不同做了不同的访问方式,这只是其中一个。这样类似打补丁的做法让人感觉非常蛋疼。v8一开始就没按照ES来写,ES从3升到5,现在又在捣鼓6的草案,这就让v8就有点跟不上了。v8对ES3中的东西是实现的非常好,但是对于ES5中的东西就颤颤巍巍的了,很多东西完全没有做过优化,只是实现了而已。
  这个问题对平时的开发有什么影响吗?也许大家已经猜到了,对于新特性v8只是停留在勉强可以实现的情况上,性能就远不如原来的方法。即使在做不考虑低版本浏览器的项目或NodeJS,目前也依然推荐使用charAt,不推荐直接在字符串上使用下标取字符串。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^