console.log、toString方法与js判断变量类型

本文探讨了JavaScript中console.log函数的行为及其与toString方法的关系。通过示例展示了不同数据类型(如对象、数组和字符串)在控制台打印时的表现,并解释了为何console.log并非总是调用toString方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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]
}

 【完】



转载于:https://www.cnblogs.com/xiaochongchong/p/7941424.html

### JavaScript 中使用 `Object.prototype.toString.call` 方法判断变量类型JavaScript 中,`Object.prototype.toString.call()` 是一种非常精确的方式来判断变量的数据类型。该方法会返回一个表示对象类型的字符串,其形式为 `[object Type]`。 以下是具体实现: #### 实现代码 ```javascript // 定义测试变量 var num = 123; var str = 'abcdef'; var bool = true; var arr = [1, 2, 3, 4]; var json = { name: 'wenzi', age: 25 }; var func = function () { console.log('this is function'); }; var und = undefined; var nul = null; var date = new Date(); var reg = /^[a-zA-Z]{5,20}$/; var error = new Error(); // 使用 Object.prototype.toString.call 来检测变量类型 console.log(Object.prototype.toString.call(num)); // [object Number][^1] console.log(Object.prototype.toString.call(str)); // [object String] console.log(Object.prototype.toString.call(bool)); // [object Boolean] console.log(Object.prototype.toString.call(arr)); // [object Array] console.log(Object.prototype.toString.call(json)); // [object Object] console.log(Object.prototype.toString.call(func)); // [object Function] console.log(Object.prototype.toString.call(und)); // [object Undefined][^1] console.log(Object.prototype.toString.call(nul)); // [object Null][^1] console.log(Object.prototype.toString.call(date)); // [object Date][^1] console.log(Object.prototype.toString.call(reg)); // [object RegExp][^1] console.log(Object.prototype.toString.call(error)); // [object Error][^1] ``` 这种方法的优势在于它能够区分一些特殊类型(如数组、正则表达式等),而这是单纯依靠 `typeof` 所无法做到的[^2]。 --- ### 注意事项 虽然 `Object.prototype.toString.call` 非常强大,但在某些情况下需要注意以下几点: - 对于自定义类的实例,默认返回的是 `[object Object]`,除非重写了 `toString` 方法。 - 如果目标环境不支持严格模式或者存在扩展行为,则可能会影响结果的一致性。 因此,在实际开发过程中可以根据需求选择合适的类型判断方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值