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

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

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

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

 function parseObjToString(obj){
var filter = ['top', 'window', 'document', 'localStorage', 'sessionStorage', 'cookie'], //不会解析该属性。
x = null, //没用的临时变量
n = '\n<br/>', //换行
Parse = {
parse_obj : function(obj, blank, parse_obj_times){//解析对象和数组
!parse_obj_times && (parse_obj_times = 0);
if (parse_obj_times > 20) {return '';}
switch(typeof obj){
case 'object':
var temp = '{',
isobj = true;
temp += n;
blank = blank || 1;
''+{}.toString.call(obj) === "[object Array]" && (isobj = false);
isobj ? temp = '{'+ n : temp = '['+ n;
for (x in obj) {
if (typeof obj[x] == 'object') {
if(filter.indexOf(x) !== -1 ) continue;
parse_obj_times ++;
temp += this.get_blank(blank)+ x+ ' : '+ this.parse_obj(obj[x], blank+1, parse_obj_times)+ ',' + n;
}else{
temp += this.get_blank(blank)+ x+ ' : '+ this.parse_sign(obj[x]) +',' + n;
}
}
temp = temp.substr(0, temp.length - (',' + n).length)+ n;
return temp + this.get_blank(blank - 1) + (isobj ? '}' : ']') ;
default :
return obj;
}
},
parse_sign: function(str){//解析特殊符号
return (''+str).replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n|\n\r/g, '<br>')
.replace(/\t/g, '&nbsp;&nbsp;').replace(/\s\s/g, '&nbsp;');
},
get_blank : function(num){//返回相应num的空白
for (var i = 0, blank=''; i < num; i++) {
blank += '&nbsp;&nbsp;&nbsp;&nbsp;';
}
return blank;
}
};
return Parse.parse_obj(obj);
}

测试数据:

 var obj = {
test : {
a : 'hello',
b : 'world',
c : {
d : {
e: {
f: {
g: {
h : {
i : {
shit : 'yes shit'
}
}
}
}
}
}
}
},
arr : [
'what',
'a',
'abc',
'<aaa><bbb>',
'a<asdfsafd>'
],
func : function(e){
console.log('aaaa');
},
func2: function(e){
console.log('bbbb');
},
func3: function(e){
console.log('asdfs');
}
}; var str = parseObjToString(obj);;
document.write(str);

测试结果:

模仿console自写函数打印js的对象的更多相关文章

  1. js中console在一行内打印字符串和对象

    在前端开发中,大多数的调试一般都是F12中的console和network中查看请求数据和响应数据,也有一部分人喜欢用debugger. 在开发大一些的项目时,在开发环境下,打开着控制台,切换一下页面 ...

  2. 【JS】#001 JS定义对象写法(原型、JSON方式)

    下面主要写两种 JS 定义对象的 常用写法 写法1:[很像面向对象语言中的写法] function zhongxia(age) { this.age = age; } zhongxia.name = ...

  3. 常见的JS手写函数汇总(代码注释、持续更新)

    最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name ...

  4. JS调用函数时候加括号与只写函数名字的区别 fn与fn()的区别

    经常见插件里面函数调用的时候只写个函数名字,不写函数参数,甚至连括号也不写,比如说: <!DOCTYPE html> <html> <head> <meta ...

  5. JS函数 函数调用 函数定义好后,是不能自动执行的,需要调用它,直接在需要的位置写函数名。

    函数调用 函数定义好后,是不能自动执行的,需要调用它,直接在需要的位置写函数名. 第一种情况:在<script>标签内调用. <script type="text/java ...

  6. JavaScript的使用以及JS常用函数(JS 遍历数组和集合)

    JavaScript入门 学习总结 1. 什么是 JavaScript 2. JavaScript 的特点 3. JS的使用 编写位置 基本语法 变量 打印变量 数据类型 innerHTML和inne ...

  7. 从window.console&&console.log(123)浅谈JS的且运算逻辑(&&)

    一.JS的且运算记得最开始看到window.console&&console.log(123),当时知道能起什么作用但是没有深入研究,最近在研究后总算弄明白了.要理解这个,首先得明白三 ...

  8. JS 字符串对象 数组对象 函数对象 函数作用域

    一.内置对象 object对象:ECMAScript 中的所有对象都由这个对象继承而来:Object 对象中的所有属性和方法都会出现在其他对象中 ToString() : 返回对象的原始字符串表示.V ...

  9. 自定义Chrome的console(样式、打印图片、开关)

    1.常用console类型 console.log() 常规打印 console.warn() 打印警告信息 console.error() 打印错误信息 console.time() 和 conso ...

随机推荐

  1. java字符串大小写字母互改

    import java.util.Scanner; public class Test { /** * 测试数据 * * @param args */ public static void main( ...

  2. MYSQL5.7无法启动服务原因及解决方案

    mysql5.7安装完成后,想要把它发布成windows服务: 首先,应该配置新的配置文件,然后将cmd打开到安装目录的bin文件,键入: mysqld --default-file="D: ...

  3. JDK安装与环境变量配置

    1.安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目 ...

  4. Linux内核分析—完成一个简单的时间片轮转多道程序内核代码

    ---恢复内容开始--- 20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...

  5. difference between forward and sendredirect

    Difference between SendRedirect and forward is one of classical interview questions asked during jav ...

  6. Excel 改变列表头显示方式, Excel显示列数字

    '显示数字列号 Sub showCellNumber() Application.ReferenceStyle = xlR1C1 End Sub '显示字母列号 Sub showCellZimu() ...

  7. hibrenate @ManyToOne(fetch = FetchType.EAGER) 和 lazy 区别

    项目中在spring定时器中定时扫描订单想修改订单详细和会员信息时老是报错,说no session...但是在正常的后台操作action中又能用. 对hibernate一直不是很熟悉,只知道用. 如果 ...

  8. java 实现一个简易计算器

    import java.util.Scanner;public class Test { public static void main(String[] args) { count(); } pub ...

  9. 手机web页面开发-第一弹

    毕业设计题目<基于three.js的太阳系全景漫游>,项目开发运行在手机端,开始学习手机端页面开发. 新建index.html,写meta标签.meta标签分为两大部分:http标题信息( ...

  10. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...