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]
}
【完】
