模仿console自写函数打印js的对象

本以为写个递归函数就可以将js的对象打印出来。

当然第一个想到的估计是JSON.stringify() 这个函数。但这个函数打印到浏览器 显示效果不友好。最友好的显示肯定是 控制台打印咯。

结果尝试打印window的时候,直接挂逼。原因就是对象循环引用。

经过几次修改,还是禁止了window里的某几个属性。

 1 function parseObjToString(obj){
 2     var filter = ['top', 'window', 'document', 'localStorage', 'sessionStorage', 'cookie'], //不会解析该属性。
 3      x         = null, //没用的临时变量
 4      n         = '
<br/>', //换行
 5      Parse     = {
 6         parse_obj : function(obj, blank, parse_obj_times){//解析对象和数组
 7             !parse_obj_times && (parse_obj_times = 0);
 8             if (parse_obj_times > 20) {return '';}
 9             switch(typeof obj){
10                 case 'object':
11                     var temp   = '{',
12                         isobj  = true;
13                         temp  += n;
14                         blank  = blank || 1;
15                     ''+{}.toString.call(obj) === "[object Array]" && (isobj = false);
16                     isobj ? temp = '{'+ n : temp = '['+ n;
17                     for (x in obj) {
18                         if (typeof obj[x] == 'object') {
19                             if(filter.indexOf(x) !== -1 ) continue;
20                             parse_obj_times ++;
21                             temp += this.get_blank(blank)+ x+ ' : '+ this.parse_obj(obj[x], blank+1, parse_obj_times)+ ',' + n;
22                         }else{
23                             temp += this.get_blank(blank)+ x+ ' : '+ this.parse_sign(obj[x]) +',' + n;
24                         }
25                     }
26                     temp = temp.substr(0, temp.length - (',' + n).length)+ n;
27                     return temp + this.get_blank(blank - 1) + (isobj ? '}' : ']') ;
28                 default : 
29                   return obj;
30             }
31         },
32         parse_sign: function(str){//解析特殊符号
33             return (''+str).replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/
|

/g, '<br>')
34                            .replace(/	/g, '&nbsp;&nbsp;').replace(/ss/g, '&nbsp;');
35         },
36         get_blank : function(num){//返回相应num的空白
37             for (var i = 0, blank=''; i < num; i++) {
38                 blank += '&nbsp;&nbsp;&nbsp;&nbsp;';
39             }
40             return blank;
41         }
42     };
43     return Parse.parse_obj(obj);
44 }

测试数据:

 1 var obj = {
 2         test : {
 3             a : 'hello',
 4             b : 'world',
 5             c : {
 6                 d : {
 7                     e: {
 8                         f: {
 9                             g: {
10                                 h : {
11                                     i : {
12                                         shit : 'yes shit'
13                                     }
14                                 }
15                             }
16                         }
17                     }
18                 }
19             }
20         },
21         arr : [
22             'what',
23             'a',
24             'abc',
25             '<aaa><bbb>',
26             'a<asdfsafd>'
27         ],
28         func : function(e){
29             console.log('aaaa');
30         },
31         func2: function(e){
32             console.log('bbbb');
33         },
34         func3: function(e){
35             console.log('asdfs');
36         }
37     };
38 
39 var str = parseObjToString(obj);;
40 document.write(str);

测试结果:

原文地址:https://www.cnblogs.com/songbyjson/p/5139196.html