我正在为非常资源有限的嵌入式设备(http://www.espruino.com)编写JavaScript解释器,每当我认为我已经正确实现了一些JavaScript时,我意识到我错了。JavaScript []如何真正起作用?
我现在的问题是关于[]
。你将如何正确实现JavaScript的最基本的一点?
我已经浏览了JavaScript规范,也许我没有找到合适的位,但我找不到合适的答案。
我以前认为你实际上有两个“地图” - 一个用于整数,另一个用于字符串。数组长度是最高整数加1的值。然而,这似乎是错误的,根据jsconsole对铬:
var a = [];
a[5] = 42;
a["5"]; // 42
a.length; // 6
也:
var a = [];
a["5"] = 42;
a[5]; // 42
a.length; // 6
所以......伟大的 - 一切都转换成字符串,并表示一个整数的最高值字符串用(加一)得到长度?错误。
var a = [];
a["05"] = 42;
a.length; // 0
"05"
是一个有效的整数 - 即使在八进制。那为什么它不影响长度?
您是否必须将字符串转换为整数,然后检查转换回字符串时是否匹配?
是否有人提及用于存储和获取数组或对象中的项目的确切算法?它看起来应该很简单,但它看起来实际上不是!
【标准】(http://www.ecma-international.org/ecma-262/5.1/#sec-15.4)说:“*属性名称'P'(形式为'String'值)是当且仅当'ToString(ToUint32(P))'等于'P'且'ToUint32(P)'不等于'2 ** 32-1'。*“的数组索引。 – DCoder 2013-04-11 19:29:42
如果您正在撰写口译员,则不应使用假设。你应该阅读规范。 – 2013-04-11 19:45:54
为什么不使用现有的,功能强大且符合标准的JS实现,比如V8?我在http://www.espruino.com/Performance上读到的东西听起来很可怕: -/ – Bergi 2013-04-11 20:11:51