# 十.数据判断
前言
- object 是 JavaScript 中所有对象的父对象
- 数据封装类对象:object、Array、Boolean、Number 和 String
- 其他对象:Function、Arguments、Math、Data、Error 和 RegExp
- 其他数据类型:Symbol
# 1.object
# 2.Array
var a = []
Array.isArray(a)
1
2
2
# 3.检测数据类型的方法
# 3.1 typeof
使用 typeof 检测数据类型,返回的都是一个包含了对应数据类型的字符串,"number"、"string"、"boolean"、"undefined"、"function"、"object"
1.基本数据类型
console.log(typeof "小明") //'string'
12.复杂数据类型
console.log(typeof typeof typeof function () {}) //‘string’ console.log(typeof typeof typeof typeof []) //"string"
1
23.typeof 的局限性
- typeof null -->'object'
- 不能具体的细分是数组还是正则或对象等其他的值,因为 typeof 检测数据类型,对于对象数据类型的值,最后返回的都是"object"
4.typeof 的应用
- 函数中赋给参数默认值
function fn(num1, num2) { if (typeof num2 === undefined) { num2 = 0 } }
1
2
3
4
5- 回调函数中
function fn(callback) { typeof callback === "function" ? callback() : null }
1
2
3
# 3.2 instanceof
用来检测某一个实列是否属于某个类
1.基本数据类型
console.log(new Number(1) instanceof Number) // true
12.复杂数据类型
var obj = [12, 2, 3] console.log(obj instanceof Array) // true console.log(obj instanceof RegExp) // false
1
2
3- instanceof 的特性:只要在当前实列的原型链上,我们用其检测都会有
var ary = [] console.log(ary instanceof Array) // true console.log(ary instanceof Object) // true function fn() {} console.log(fn instanceof Object) // true
1
2
3
4
53.instanceof 局限性
- 不能用来检测和处理字面量方式创建出来的基本数据类型
console.log(1 instanceof Number) // false console.log("" instanceof String) // false
1
2
# 3.3 constructor
找到其构造函数
1.基本数据类型
console.log(new Number(1).constructor === Number) //true
12.复杂数据类型
var obj = [] console.log(obj.constructor === Array) //true console.log(obj.constructor === RegExp) //false console.log(new Number(1).constructor === Number) //true
1
2
3
4constructor 检测 Object 和 instanceof 不一样,一般情况下是检测不了的
var reg = /^$/ console.log(reg.constructor === RegExp) //true console.log(reg.constructor === Object) //false
1
2
3
3.局限性:我们可以把类的原型进行重写,在重写的过程中和可能出现把之前的 constructor 覆盖
function fn() {} fn.prototype = new Array() var f = new fn() console.log(f.constructor === Array) //true
1
2
3
4- 对于特殊的数据类型 null 和 undefined,他们的所属类是 Null 和 Undefined,但是浏览器把这两个类保护起来了,不允许我们在外面访问使用
# 3.4 toString
1.基本数据类型
var ary = [] console.log(Object.prototype.toString.call("")) //"[object String]" console.log(Object.prototype.toString.call(1)) //"[object Number]" 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]"
1
2
3
4
5
62.复杂数据类型
var ary = [] console.log(Object.prototype.toString.call(ary)) //"[object Array]" console.log(Object.prototype.toString.call([])) //"[object Array]" console.log(Object.prototype.toString.call(function fn() {})) //"[object Function]" console.log(Object.prototype.toString.call(new RegExp())) //"[object RegExp]"
1
2
3
4
5返回的结果是字符串
var reg = /^\[object Array\]\$/
var ary = []
console.log(reg.test(Object.prototype.toString.call(ary))) //false
1
2
3
2
3
- toString 的理解:乍一看应该是转换为字符串,但是某些 toString 方法不仅仅是转换为字符串,对于 Number、String、Boolean、Array、RegExp、Date、Function 原型上的 toString 方法都是把当前的数据类型转换为字符串的类型(它们的作用仅仅是用来转换为字符串的)
console.log((1).toString()) //"1" Number.prototype.toString-->转换为字符串
console.log((1).__proto__.__proto__.toString()) //["Object","Object"] Object.prototype.toString
console.log((128).toString(2 / 8 / 10)) //把数字转换为 2/8/10 进制
1
2
3
2
3