Array.prototype.toString方法重写

来源:互联网 发布:鲜活的数据 英文 编辑:程序博客网 时间:2024/06/05 23:04

我们在写JavaScript时,如果要调试某个数组对象,会借助数组的toString方法。

这种写法,对于一维数组来说,很方便。

但如果对象是二维或多维数组,就显得不那么直观了。

下面有个二维数组的例子,我们来看看会是什么样的结果。

var matrix = [    [1,2,3],    [4,5,6],    [7,8,9]];//1,2,3,4,5,6,7,8,9console.log(matrix.toString());
在这个结果,你甚至无法区分到底是几维数组以及数组元素的包含关系。

这显然是很不利于调试的。

我们可以对数组的toString方法进行一个小小的改进,让它能够体现包含及层次关系。

Array.prototype.toString = function(){var result = "[";for(var i=0;i<this.length;i++){var e = this[i];result += e.toString();if(i < this.length - 1){result += ",";}}result += "]";return result;};//[[1,2,3],[4,5,6],[7,8,9]]console.log(matrix.toString());
可以看到,在方法重写后,打印出了清晰直观的结果。

甚至连多维数组也能准确无误地表示。

var array3D = [ [ [ 1, 2, 3 ] ], [ [ 4, 5, 6 ] ], [ [ 7, 8, 9 ] ] ];//[[[1,2,3]],[[4,5,6]],[[7,8,9]]]console.log(array3D.toString());

--------------------------------修改的分割线------------------------------------

昨天有专家指出,我上面这个实现不够健壮。

我本意是想写一个方便自己调试JS的程序,所以没有详细地考虑。

如果有环引用(自己引用自己的情况),原先的代码会死循环。

那么如何避免呢?

我的解决方案是:利用一个列表,记录已访问过的对象,已访问过了的话,就返回空字符串,避免死循环。

如下所示:

//存放已访问的对象var hasVisited = [];Array.prototype.toString = function(){//如果没有访问过if(hasVisited.indexOf(this) < 0){hasVisited.push(this);var result = "[";  for(var i=0;i<this.length;i++){  var e = this[i];result += e.toString();  if(i < this.length - 1){  result += ",";  }  }  result += "]";  return result;}return "";}; var a = [1,2,3];a.push(a);a.push([a]);//[1,2,3,,[]]console.log(a.toString());hasVisited = [];//[[1],[2]]console.log([[1],[2]].toString());

如果还有不足之处,欢迎大家指点!^_^




0 0
原创粉丝点击