检测数据类型
检测数据类型
- [1]typeof
- [2]isNaN
- [3]instanceof
- [4]isArray
- [5]万能检测数据类型
[1]typeof
typeof一般是用于检测简单数据类型的;
(1)语法:
- typeof(数据)
- typeof 数据
(2)缺点:
- 结果具有不准确性–>对于null、array数据 检测结果为object
(3)举例说明
console.log(typeof 0) // number
console.log(typeof '0') // string
console.log(typeof true) // boolean
console.log(typeof undefined) // undefined
console.log(typeof null) //object
typeof [] // object
typeof function(){} // function
let sy=Symbol('xx')
console.log(typeof sy); //symbol
[2]isNaN
-
isNaN是window的方法,可以用于检测数据是否为数字类型;
-
语法
-
window.isNaN(value)
-
-
举例说明
-
isNaN(111) // false
-
-
缺点
-
结果存在不准确性
-
数字、(转化为Number类型不为NaN的)字符串、(转化为Number类型不为NaN的)的数组、null都会被认作数字
-
isNaN('11') // false isNaN('a') // true isNaN(11) // false isNaN(null) // false isNaN(undefined) // true isNaN([11]) // false isNaN([11.,12]) // true
-
-
[3]instanceof
(1)语法: 数据 instanceof 构造函数
(2)执行原理(本质):检测右面构造函数的原型对象是否在左侧数据地原型链上;
(3)缺点:结果存在不准确性;
(4)以检测数组为例(前提:数组的构造函数为Array)
console.log([111] instanceof Array); // true
console.log([111] instanceof Function); // false
console.log([111] instanceof Object); // true
- [1]当检测[111]是否为数组----true(原因是因为Array.prototype==[111].proto)
- [2]当检测[111]是否为函数—false
- 因为[111]的原型链上没有Function.prototype
- [3]当检测[111]是否为对象–true(结果错误)
- [111].proto.protp=Object.prototype
[4]isArray
Array原型上存在isArray方法,用于检测数据是否为数组;
(1)语法:Array.isArray(value)
(2)举例说明:
console.log(Array.isArray([111])) //true
console.log(Array.isArray({ 1: '111' })) //false
[5]万能检测数据类型
(1)语法:Object.prototype.toString.call(数据)
(2)优点:
- (1)对于任何数据都适用;
- (2)没有错误情况;
(3)原理:
- 前提:
- 很多构造函数的原型对象都具有toString方法,eg:Array.toString();
- 但是只有Object构造函数的toString方法的作用是检测数据类型的;
- 执行原理:
- 检测数据类型,修改toString方法的this指向;
- 相当于此数据去调用Object原型对象上的toString方法;
- 这样就检测出此数据的数据类型了!
- 注意点:
- 原理上null与undefined是不能够修改this指向的(修改是失败的);
- 但js是弱语言,很多地方不太完整(很多时候null,undefined是当作对象的)
(4)举例说明
console.log(Object.prototype.toString.call(1)) // [object Number]
console.log(Object.prototype.toString.call('1')) // [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(Symbol('xx')))// [object Symbol]
console.log(Object.prototype.toString.call([111])) // [object Array]
console.log(Object.prototype.toString.call({ 1: '11' }))// [object Object]
console.log(
Object.prototype.toString.call(function a () {
console.log('11')
})
) // [object Function]