我想知道JavaScript对象占用的大小。

取以下函数:

function Marks(){
  this.maxMarks = 100;
}

function Student(){
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

现在我实例化这个学生:

var stud = new Student();

这样我就可以做

stud.firstName = "new Firstname";

alert(stud.firstName);

stud.marks.maxMarks = 200;

etc.

现在,stud对象将在内存中占据一定大小。它有一些数据和更多的对象。

我如何找出有多少内存stud对象占用?类似于JavaScript中的sizeof() ?如果我能在一个函数调用中找到它,比如sizeof(stud),那就太棒了。

我已经在网上搜索了几个月了——没有找到它(在几个论坛上被问到——没有回复)。


当前回答

这里有一个稍微紧凑的解决方案:

const typeSizes = {
  "undefined": () => 0,
  "boolean": () => 4,
  "number": () => 8,
  "string": item => 2 * item.length,
  "object": item => !item ? 0 : Object
    .keys(item)
    .reduce((total, key) => sizeOf(key) + sizeOf(item[key]) + total, 0)
};

const sizeOf = value => typeSizes[typeof value](value);

其他回答

我知道这绝对不是正确的方法,但它在过去几次帮助我得到了大致的对象文件大小:

将对象/响应写入控制台或新选项卡,将结果复制到新的记事本文件,保存它,并检查文件大小。记事本文件本身只有几个字节,因此您将获得相当精确的目标文件大小。

我想知道我减少记忆的努力是否真的有助于减少记忆

根据这条评论,你应该这样做: 尝试产生内存问题——编写代码来创建所有这些对象,并逐渐增加上限,直到遇到问题(浏览器崩溃,浏览器冻结或内存不足错误)。理想情况下,您应该在不同的浏览器和不同的操作系统上重复这个实验。

现在有两个选择: 选项1 -您没有成功地产生内存问题。因此,你是在杞人忧天。您没有内存问题,程序也没有问题。

选项2-你确实有内存问题。现在问问自己发生问题的限制是否合理(换句话说:在正常使用您的代码时是否有可能创建这个数量的对象)。如果答案是“不”,那么你很好。否则,您现在就知道代码可以创建多少对象了。重写算法,使其不违反此限制。

有时我用它来标记非常大的对象,这些对象可能会从服务器发送到客户端。它不代表内存占用。它只会让你得到大约发送或存储它的成本。

还请注意,它很慢,仅用于开发。但是用一行代码就能得到大概的答案,这对我来说很有用。

roughObjSize = JSON.stringify(bigObject).length;

如果您主要关心的是Firefox扩展的内存使用情况,我建议您咨询Mozilla开发人员。

Mozilla在其wiki上提供了一系列分析内存泄漏的工具。

这个Javascript库sizeof.js做同样的事情。 像这样包含它

<script type="text/javascript" src="sizeof.js"></script>

sizeof函数的作用是:以对象为参数,返回对象的字节大小。例如:

// define an object
var object =
    {
      'boolean' : true,
      'number'  : 1,
      'string'  : 'a',
      'array'   : [1, 2, 3]
    };

// determine the size of the object
var size = sizeof(object);

sizeof函数可以处理包含对其他对象的多个引用和递归引用的对象。

原文发表于此。