提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以都转换成小写,以防出错 在JavaScript中,正确识别变量的数据类型是编程过程中非常重要的一步,因为这直接影响到代码的执行逻辑。本篇文章将深入探讨两种常见的数据类型检测方法:`typeof`和`Object.prototype.toString.call()`。 我们来看`typeof`操作符。`typeof`是JavaScript内置的全局函数,用于返回一个表达式或变量的数据类型,返回值是一个字符串。例如: ```javascript var str = 'str'; console.log(typeof str); // 输出 "string" var arr = ['1', '2']; console.log(typeof arr); // 输出 "object",注意这里对数组的误判 var num = 1; console.log(typeof num); // 输出 "number" var bool = true; console.log(typeof bool); // 输出 "boolean" var obj = {}; console.log(typeof obj); // 输出 "object" var nullObj = null; console.log(typeof nullObj); // 输出 "object",对null的误判 var undefinedObj; console.log(typeof undefinedObj); // 输出 "undefined" var reg = /reg/; console.log(typeof reg); // 输出 "object",对正则表达式的误判 var fn = function() { /*...*/ }; console.log(typeof fn); // 输出 "function" var user = new User('user'); console.log(typeof user); // 输出 "object",对自定义对象的误判 ``` 如代码所示,`typeof`在处理某些数据类型时会出现误判,例如数组、null、正则表达式、自定义对象等,都会被识别为"object"。此外,未定义的变量会返回"undefined"。 接下来,我们讨论`Object.prototype.toString.call()`方法。这种方法更加灵活,能够准确地识别大多数数据类型,包括数组、null、自定义对象等。`Object.prototype.toString.call()`实际上是利用了JavaScript原型链的特性,将目标对象的`toString`方法应用于`Object.prototype`,从而得到表示其类型信息的字符串。例如: ```javascript var jsonStr = '{"key":"value"}'; console.log(Object.prototype.toString.call(jsonStr)); // 输出 "[object String]" var arr = ['1', '2']; console.log(Object.prototype.toString.call(arr)); // 输出 "[object Array]" var num = 1; console.log(Object.prototype.toString.call(num)); // 输出 "[object Number]" var bool = true; console.log(Object.prototype.toString.call(bool)); // 输出 "[object Boolean]" var obj = {}; console.log(Object.prototype.toString.call(obj)); // 输出 "[object Object]" var nullObj = null; console.log(Object.prototype.toString.call(nullObj)); // 输出 "[object Null]" var undefinedObj; console.log(Object.prototype.toString.call(undefinedObj)); // 报错,因为不能对undefined调用方法 var reg = /reg/; console.log(Object.prototype.toString.call(reg)); // 输出 "[object RegExp]" var fn = function() { /*...*/ }; console.log(Object.prototype.toString.call(fn)); // 输出 "[object Function]" var user = new User('user'); console.log(Object.prototype.toString.call(user)); // 输出 "[object User]"(假设User是自定义构造函数) ``` 需要注意的是,`Object.prototype.toString.call()`返回的字符串中,`class`部分通常是首字母大写的,如"Array"、"Function"等。在实际使用中,为了避免大小写敏感的问题,可以将`class`部分转换为小写来进行比较。例如: ```javascript var dataType = Object.prototype.toString.call(arr).toLowerCase(); if (dataType === '[object array]') { console.log('It is an array'); } ``` 总结来说,`typeof`操作符简单易用,但对某些特定类型的判断有误;而`Object.prototype.toString.call()`方法更为精确,能正确识别大多数数据类型,但不能用于未定义的变量。在实际开发中,根据具体需求选择合适的方法进行数据类型检查。
- 粉丝: 1
- 资源: 967
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助