js_检测数据类型

[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)

img

  • [2]当检测[111]是否为函数—false
    • 因为[111]的原型链上没有Function.prototype
  • [3]当检测[111]是否为对象–true(结果错误)
    • [111].proto.protp=Object.prototype

img

[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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值