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,2console.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]}
【完】