JavaScript数据类型检测的四种方式

JavaScript数据类型检测的四种方式

1. typeof

返回值是字符串,有”number”,”boolean”,”string”,”undefined”,”function”,”object”

console.log(typeof typeof function () {
}); // "string"

typeof的局限性: 不能区分数组,对象,正则,因为返回的都是”object”

console.log(typeof null); // "object"
var obj = {a: 1};
var arr = [1, 2];
var reg = new RegExp();
console.log(typeof obj); // "object"
console.log(typeof arr); // "object"
console.log(typeof reg); // "object"

typeof使用场景——检测函数的参数是否传址

function fn(m, n) {
  if (typeof n === "undefined") { // 没传值
    n = 0;
  }
  console.log(m, n);
}
fn(1);

function fn(callback) {
  typeof callback === "function" ? callback() : null;
}
fn(function () {
});

2. instanceof 检测一个实例是否属于某个类

var arr = [1, 2];
console.log(arr instanceof Array); // true
console.log(arr instanceof RegExp); // false
console.log(arr instanceof Object); // true

局限性

1.只要在当前实例的原型链上,我们用其检测出来的结果都是true
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
function fn() {}
console.log(fn instanceof Function); // true
console.log(fn instanceof Object); // true
2. 对于基本数据类型,字面量方式无法检测,可以检测出实例创建方式的值。只有实例方式创建出来的才是标准的对象数据类型值,也是Number这个类的一个实例
console.log(1 instanceof Number); // false
console.log(new Number(1) instanceof Number); // true

3. constructor 构造函数

3.1 检测基本数据类型

var arr = [];
console.log(arr.constructor === Array); // true
var num = 1;
console.log(num.constructor === Number); // true

3.2 检测Object

var reg = new RegExp();
console.log(reg.constructor === RegExp); // true
console.log(reg.constructor === Object); // false

局限性:若把类的原型进行重写,若覆盖掉,检测结果就不准确

4. Object.prototype.toString.call() 最全面的方式

首先获取Object原型上的toString方法,让方法执行,并且改变方法中的this指向
Object.prototype.toString 返回当前方法的执行主体(this)所属类

var obj = {key: 1};
console.log(obj.toString()); // "[object Object]" 第一个object代表当前实例是对象数据类型,第二个object代表的是obj所属的类是Object
Math.toString() // "[object Math]" toString中的this指向Math,那么返回的是Math所属类的信息

var arr = [];
console.log(Object.prototype.toString.call(arr)); // [object Array]
console.log(Object.prototype.toString.call(/^$/)); // [object Regexp]
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call('foo')); // [object String]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(function () {
})); // [object Function]
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true

toString

toString方法不仅仅是转换为字符串

1. 对于Number、String、Boolean、Array、RegExp、Date、Function原型上的toString方法都是把当前的数据类型转换为字符串的类型

console.log((1).toString()); // "1"

2. Object.prototype.toString 不是用来转换为字符串的

({key:1}).toString(); // "[object Object]"
console.log(Math.toString()); // "[object Math]"
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值