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