如何使用类型化数组来模拟对象
How to use typed arrays to simulate objects?
JavaScript 中的对象包含键值对。 典型对(使用 DevTools 探查器)的成本是对键名称的引用,8 个字节和对象的开销:小整数为 4 个字节,数字、引用等为 8 个字节。
键的成本加起来,尤其是在具有数百万个对象的数组中。
有没有一种 asm.js 方法可以将类型化数组用于相同对象的数组?
是的,我知道这似乎很痛苦,但对于特定的项目,这可能是必需的。
我正在考虑的方法是使用模板 JS 对象,该对象的键将每个键的值及其类型描述为类型化数组的偏移量。 对于这些对象的数组,这些对象跨度将有多个。
因此有两个问题:
1 - 我的假设是否正确......并且Chrome/现代浏览器中没有优化关键成本的优化? 可能使用此处使用的约束:http://www.2ality.com/2013/08/protecting-objects.html
2 - 如果是这样,是否有用于将类型化数组作为对象处理的库? 或任何文章或要点等?
如果你有数百万个对象,所有对象都有相同的已知键集,并且你有很多对象,内存是一个问题,那么你可能根本不想把你的数据存储为javascript对象。
您可能想将其视为数据库问题。 你想要:
- 半紧凑的存储格式
- 一种以存储格式查找正确记录的方法(这取决于数据是什么以及您需要如何访问它。
- 一种读取半紧凑存储格式并将其转换为实时 JavaScript 对象的方法,仅当您想在代码中实际使用该对象时。
- 一种将更改写回半紧凑存储格式的方法。
如果你有七个键(例如字段),三个是数字,四个是字符串,其中一个数字是你的查找键,那么你可以这样做:
- 创建三个类型化数组(每个数值一个)
- 创建一个常规数组。这将保存所有字符串值,并用唯一的分隔符连接在一起。
- 创建主密钥查找对象
当您读取数据(可能来自多个 ajax 调用)时,执行以下操作:
- 请注意其中一个数组的长度(它们都是相同的长度),因为这将是您的新记录编号。
- 将查找密钥添加到主密钥对象,并将密钥的值设置为记录编号。
- 将每个数值添加到每个类型化数组(每个数值将是数组中的记录编号索引) 按
- 键顺序将所有字符串值与它们之间的分隔符连接在一起,然后将相关字符串值放入字符串数组中。
现在,您拥有了半紧凑的存储格式和密钥查找方式。 如果要查找值,请使用主密钥查找对象。 键的值将是记录号,它是其他数组的索引。 您可以创建两个函数来查找记录并返回记录的 javascript 对象形式(对象上的键/值对中的所有数据)和另一个函数,该函数将对象(可能已更改 = 但主键无法更改)写回存储格式。
这对您的数据做了一些假设,即您有一个不会更改用于查找的主密钥,并且您可以找到一个分隔符将所有字符串值绑定在一起,然后稍后将它们分开,并且您可以知道何时存储所有这些,并且您知道键是什么,并且对象通常都具有相同的键。
如果这些假设中的任何一个不成立,那么设计将不得不进行调整以处理这个问题,但希望你能得到使用除了一个巨大的对象数组之外的东西来存储数据的想法,然后只在你需要使用该记录的数据时才构成一个给定的对象。
- Javascript中对象的每个()的模拟值
- 是否可以模拟 qUnit 测试的窗口位置对象
- 如何模拟JavaScript对象或数组中缺少的属性或元素
- 如何使用类型化数组来模拟对象
- Jasmine have createSpy() 返回模拟对象
- 仅在闭包中定义的模拟/存根对象
- 如何使用 sinon.js 来模拟/监视 javascript 函数中提到的对象
- 模拟 javascript 的数组方法.面向对象的Javascript,作者:Stoyan Stefanov
- 模拟 DOM 对象
- 浏览器对象和 HTML DOM 对象的 JavaScript 模拟库
- 使用JavaScript和setTimeout旋转HTML元素以模拟不断移动的对象
- 如何模拟鼠标点击任何HTML元素(iframe,对象等)从Firefox扩展
- 未捕获的[对象对象]被抛出- zone.js"模拟响应(Angular2)时抛出错误
- 如何模拟Js中的DOM对象
- 如何模拟“文档”对象在Meteor App中进行测试
- 模拟目录文件对象
- 如何在karma/mocha测试套件中模拟窗口对象属性
- 文档元素的模拟对象
- 如何使用javascript File对象模拟表单提交
- 在 angularjs 中全局模拟对象,用于茉莉花/业力测试