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

相关文章
相关标签/搜索