January 6, 2015
Computate
size of Javascript object
The computation of the object size of Javascript needs grasping all the properties which compose an object. All the properties which compose an object can be gotten by the processing of "for(var key in obj)console.log(key);".
To the type of each property, I add up the size that I found and get size of the whole object. If the property is a primitive types (Number type, String type, Boolean type), it is possible to add up simply but at the reference types (Array type, Object type), the primitive type doesn't appear when not seeing the lower layer.
The reference type property distinguishes between inner [[Class]] property of the object using "Object.prototype.toString". It processed a recursion in the object when the inner property of the object was [object Array] and the value of the object was [object Object].
When the inner property was an object except these, it thought as the binary data and it got the size. Also, the Function type serialized and got the size.
Source code
function objectSize(data,tb){ var size=0; for( var key in data ) { var objType=typeof data[key]; var sp=""; for(var i=0;i<tb*4;i++)sp+=" "; if(objType=="function")console.log(sp+"type="+objType+" key="+key+" size="+(new String(data[key])).length*2); else console.log(sp+"type="+objType+" key="+key+" val="+data[key]); size+=key.length*2;// key size if(!data[key])continue;// value is null if(objType=="boolean")size+=4; else if(objType=="number")size+=8; else if(objType=="string")size+=data[key].length*2; else if(objType=="function")size+=(new String(data[key])).length*2; else if(objType=="object"){ var objClass=Object.prototype.toString.call(data[key]); if(objClass=="[object Array]"||data[key]=="[object Object]"){ tb++; size+=objectSize(data[key],tb); tb--; } else{// binary data size+=data[key].length; } } } return size; }
Calculation example (contains function type)
function len(s){ return s.length; } var fam={ "name" : "Marry", "age" : 48, "children" : [ { "name" : "John", "age" : 25, "interests" : ["running","programming"], "hasChildren" : 1 }, { "name" : "Bob", "age" : 17, "interests" : "fishing", "hasChildren" : null, "func" : len, "tel" : {"home" : "000-111-222", "mobile" : "000-999-888"} } ] }; console.log("size="+objectSize(fam,0)); type=string key=name val=Marry type=number key=age val=48 type=object key=children val=[object Object],[object Object] type=object key=0 val=[object Object] type=string key=name val=John type=number key=age val=25 type=object key=interests val=running,programming type=string key=0 val=running type=string key=1 val=programming type=number key=hasChildren val=1 type=object key=1 val=[object Object] type=string key=name val=Bob type=number key=age val=17 type=string key=interests val=fishing type=object key=hasChildren val=null type=function key=func size=72 type=object key=tel val=[object Object] type=string key=home val=000-111-222 type=string key=mobile val=000-999-888 object size=402
Calculation example (contains binary data)
var buf = new Buffer('0123abcd', 'utf-8'); var param = { 'a': 1, 'b': "2", 'c': { 'd': true, 'e': flase, 'f': buf } }; console.log("size="+objectSize(param,0)); type=number key=a val=1 type=string key=b val=2 type=object key=c val=[object Object] type=boolean key=d val=true type=boolean key=e val=false type=object key=f val=0123abcd object size=52
wrote by T. Osaka