如何获取JavaScript对象的大小?

437

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

请看以下函数:

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

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

现在我实例化student

var stud = new Student();

这样我就可以做类似以下的事情

stud.firstName = "new Firstname";

alert(stud.firstName);

stud.marks.maxMarks = 200;

现在,stud对象将占用一些内存空间。它有一些数据和更多的对象。

我该如何找出stud对象占用了多少内存?类似于JavaScript中的sizeof()吗?如果能够像sizeof(stud)这样进行单个函数调用来查找,那就太棒了。

我已经搜索了几个月的互联网 - 找不到答案(在一些论坛上发过帖子 - 没有回复)。


关于这个问题提出的答案怎么样:https://dev59.com/qm855IYBdhLWcg3wXC5- - csturtz
1
另一个内存近似函数在Github上(https://gist.github.com/zensh/4975495)。 - Rafael Emshoff
22个回答

-3

我相信你忘记了包含“数组”。

  typeOf : function(value) {
        var s = typeof value;
        if (s === 'object')
        {
            if (value)
            {
                if (typeof value.length === 'number' && !(value.propertyIsEnumerable('length')) && typeof value.splice === 'function')
                {
                    s = 'array';
                }
            }
            else
            {
                s = 'null';
            }
        }
        return s;
    },

   estimateSizeOfObject: function(value, level)
    {
        if(undefined === level)
            level = 0;

        var bytes = 0;

        if ('boolean' === typeOf(value))
            bytes = 4;
        else if ('string' === typeOf(value))
            bytes = value.length * 2;
        else if ('number' === typeOf(value))
            bytes = 8;
        else if ('object' === typeOf(value) || 'array' === typeOf(value))
        {
            for(var i in value)
            {
                bytes += i.length * 2;
                bytes+= 8; // an assumed existence overhead
                bytes+= estimateSizeOfObject(value[i], 1)
            }
        }
        return bytes;
    },

   formatByteSize : function(bytes)
    {
        if (bytes < 1024)
            return bytes + " bytes";
        else
        {
            var floatNum = bytes/1024;
            return floatNum.toFixed(2) + " kb";
        }
    },

1
在JS中,数组是一个对象。在实现上可能会有一些优化,但从概念上讲,数组和对象是相同的。 - Kris Walker

-7

我知道这不是正确的做法,但在过去几次中,它帮助了我几次来获取近似的目标文件大小:

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


6
完全错误。例如,考虑数字1/3 = 0.3333333333333333。使用您的方法将需要18个字节。 - korCZis
5
我说过这只是“大约的”。有时候你并不关心是1MB还是1.00001MB,你只想知道一个估算值,那么这种方法就完全可以。 - Jeffrey Roosendaal
3
调皮的解决方案 X] - Lapys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接