Java调用system.print.out()是会调用toString方法打印
js里的console.log也是控制台打印,很多时候,我们以为也是调用toString方法,其实并不是。我们在chrom下测试
var obj={'a':2}; console.log(obj); console.log(arr.toString());{'a':2} console.log(obj.toString());[object Object] console.log(obj+'');[object Object]
以上我们是对一个对象字面量进行的打印。如果是数组呢?
var arr=[1,2]; console.log(arr);//[ 1, 2 ] console.log(arr.toString());//1,2 console.log()//1,2
我们再看字符串的:
str = new String("hello") console.log(str) //chrome下:String {[[PrimitiveValue]]: "hello"} console.log(str.toString())//hello
这是为什么?
stackoverflow有个回答(https://stackoverflow.com/questions/36215379/does-console-log-invokes-tostring-method-of-an-object),console并不是一个标准的API,跟浏览器有关,实现细节不一致。
不过这并不影响我们的编程,console只在我们调试的时候使用,何况还有debugger可以跟完整的调试
再说回toString方法:我们参考https://github.com/jkchao/blog/issues/8
我们判断数组的用什么方法:
答案是Object.prototype.toString.call(arr);以下3种都会有问题:
Array.isArray(arr)(浏览器兼容性) arr instanceof Array(iframe下有问题) arr.constructor === Arrayiframe下有问题)
事实上,我们借助Object.prototype.toString.call()可以获取任何变量[[Class]]属性,[[Class]]可以理解为变量的类型标准,定义在ECMA里。获取的方法可以这么写:
function getClass (a) { const str = Object.prototype.toString.call(a) return /^[object (.*)]$/.exec(str)[1] }
【完】