• JavaScript 检测类型


    检测原始值

    若检测一个值是字符串、数字、布尔值或undefined,选择使用typeof运算符

    • 对于字符串,typeof返回"string"
    • 对于数字,typeof返回"number"
    • 对于布尔值,typeof返回"boolean"
    • 对于undefind,typeof返回"undefind"

    typeof 基本语法

    typeof '123123'

    注意:"typeof null"返回的是"object"

    检测引用值

    若检测一个值是引用类型,选择使用instanceof运算符;如:Object、Array、Date和Error

    instanceof 基本语法

    value instanceof Object (返回结果true或false)
    // 检测日期
    if (value instanceof Data) {
        console.log(value.getTime())
    }
    // 检测正则表达式
    if (value instanceof RegExp) {
    
    }
    instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 instanceof不仅能检测构造这个对象的构造器,还能检测原型链;默认情况下,每个对象都继承Object,因此每个对象的 value instanceof Object都会返回true,如:
    let now = new Date()
    console.log(now instanceof Object); // true
    console.log(now instanceof Date); // true
    
    // instanceof运算符也可以检测自定义的类型
    function Person(name) {
          this.name = name
    }
    let me = new Person('Jack')
    console.log(now instanceof Person); // true
    在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。
    假设一个frame或window (frameA)里的一个对象被传入到另一个frame或window (frameB)中。这两个里面都定义了构造函数Person。如果来自frameA的对象 是frameA的Person的实例,则:
    frameA instanceof frameAPerson // true 
    frameA instanceof frameBPerson // false
    会出现这种情况是因为每个帧(frame)都拥有Person的一份拷贝,它被认为是改帧(frame)中的Person的拷贝的实例。 这个问题不仅出现在自定义类型身上,函数和数组 也有这个问题,不过对于这两个类型一般用不着使用instanceof.
     

    检测函数

    检测函数最好的方法是使用typeof

    function fn() {}
    console.log(typeof fn === 'function') // true

    检测数组

    检测数组可以使用ECMASript5中的Array.isArray()

    function isArray(value) {
         if (typeof Array.isArray === 'function') {
             return Array.isArray(value)
         } else {
             return Object.prototype.toString.call(value) === "[object Array]"
         }
    }

    检测属性

    判断属性是否存在使用in运算符,in运算符仅仅会简单的判断属性是否存在,而不会去读取属性的值;如果实例对象的属性存在、或者继承自对象的原型,in运算符 都会返回true,如:

    let obj = {
          id: 10,
         name: 'abc'
    }
    if ('name' in obj) {
          console.log(obj.name)
    }

    如果只想检查实例对象的某个属性是否存在,则使用hasOwnProperty()方法。所有继承自Object的JavaScript对象都有这个方法,如果实例中存在 这个属性则返回true(如果这个属性只存在于原型里,则返回false),如:

    let object = {
         id: 10,
         name: 'abc'
    }
    if (object.hasOwnProperty('name')) {
         console.log(object.name)
    }

    参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof 

  • 相关阅读:
    清除浮动的集中方式
    css动画
    [Asp.net]c#中的斜杠和反斜杠
    C# ASPX页面做上传提示:超过了最大请求长度,解决方法
    在asp.net中用客户端上传控件上传文件( 需要注意的)
    jquery clone 与 clone(true) 的区别
    【转载】用div+css模拟表格对角线
    .net2.0中的Json序列化数据
    jquery操作checkbox的选中与不选中,解决只有一次有用。
    转:不同服务器数据库之间的数据操作[含远程数据库备份]
  • 原文地址:https://www.cnblogs.com/wjz-page/p/13340291.html
Copyright © 2020-2023  润新知