console.log、toString方法與js判斷變量類型


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

相關文章
相關標籤/搜索