美文网首页前端基础:H5、CSS3、JS
JavaScript之数据类型及类型判断

JavaScript之数据类型及类型判断

作者: js_hcl | 来源:发表于2019-04-15 12:00 被阅读6次

    目录

    • 7种基本数据类型
    • 类型判断(基本类型、引用类型、自定义类型)
    • 类型转换
    • 值相等比较(==、===、Object.is())

    一、7种基本数据类型

    1.Null
    只有一个 值 : null 
    ①声明一个对象为null,则为:销毁该变量
    ②返回null,则为该对象不存在。typeof Null  === 'Object'
    
    2.Undefined
    只有一个 值 : undefined 
    代表对象存在,但未赋值
    当声明的变量未初始化时,该变量的默认值是 undefined
    函数没有明确返回值时,返回undefined
    
    3.Boolean
    只有两个 值 : true、false 
    
    4.Number
     值 : 数字 
    特殊的Number值:Number.MAX_VALUE 和 Number.MIN_VALUE、NaN
    NaN;//表示非数(Not a Number)一般说来,这种情况发生在类型(String、Boolean 等)转换失败时返回的值 或 数字/0 
    
    5.String
    值 : 字符串 
    
    6.Symbol
    可以用于命名冲突及私有属性 
    
    7.Object
    所有对象都是继承Object.prototype
    
    image.jpg

    二、类型判断

    1.基本类型判断 typeof

    a.语法:typeof 变量;eg:typeof "zzz";//string
    
    b.返回的是字符串:"undefined","number","boolean","string","function","object"
    
    c.判断方式:typeof 变量==="undefined"/"number"等基本数据类型
    
    总结:
    1.对于基本类型,除 null 以外,均可以返回正确的类型。typeof null为objecct(null表示空引用,即不存在)
    
    2.对于引用类型,除 function 以外,一律返回 object 类型。typeof 函数名为function
    

    2.引用类型判断

    • constructor
    • Object.prototype.toString.call(变量)
    • instanceof
    1.constructor
    语法:obj.constructor;//返回的是对象的构造函数
    使用:obj.constructot===Class;//进行"==="判断,或is判断。
    例子:child.constructor===Child;
    console.log((2).constructor === Number);
    console.log((true).constructor === Boolean);
    console.log(('str').constructor === String);
    console.log(([]).constructor === Array);
    console.log((function() {}).constructor === Function);
    console.log(({}).constructor === Object);
    问题:要确保原型的constructor指向了该对象的父类
    用costructor来判断类型看起来是完美的,然而,如果我创建一个对象,更改它的原型,这种方式也变得不可靠了
    
    2.Object.prototype.toString.call()
    a.语法:Object.prototype.toString.call(变量)  
    b.返回的是字符串:"[object String]","[object Number]","[object Boolean]"
    "[object Object]","[object Array]","[object Date]","[object Function]"
    c.判断方式:Object.prototype.toString.call(a) === '[object String]'/ '[object Number]'等原生引用类型 
    总结:对于引用对象,相对于typeof可以更具体的判断引用的具体类型
    相对于constructor就算我们改变对象的原型,他依然会显示正确的数据类型。
    可以用于原生引用的判断(js有17种内置对象)
    
    
    3.instanceof
    语法:obj instanceof Class;
    //返回,布尔值。如果为true,说明Class.prototype是obj祖先原型
    //instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上
    instanceof模拟代码 
    function instance_of(obj,arg_Class){
        while(true){
           if (obj===null) return false;  //如果对象为空,或者找到对象的最后原型为空,函数返回,为false
           if (obj===arg_Class.property) return true;  //如果和祖先类相等,函数返回,为true
           obj =obj.__proto__; //查找原型链 
        }
    }
    Function instanceof Function;//true   Function它的父类是Function               Function._proto_=Function.prototype
    Object instanceof Function;  //true   Object它的父类是Function                 Object._proto_=Function.prototype
    Function instanceof Object;  //true   Function它的祖先原型是Object.prototype   Function._proto_._proto_=Object.prototype
    Object instanceof Object;    //true   Object它的祖先原型是Object.prototype     Object._proto_._proto_=Object.prototype
    Number instanceof Number;    //false  其它类型它的父类是Object  
    总结:
    1.用于引用对象的类型检查, t  instanceof Array
    2.用于判断是不是某个类的实例
    
    

    3、总结

    a.原生基本类型判断:     √
    typeof 变量==="number";
    //"undefined","number","boolean","string","function","object"
    优点:简单
    缺点:针对引用对象只能识别object及function
    识别不出null类型。typeof null为'object'
    
    b.原生引用原型判断:    
    Object.prototype.toString.call(obj)==="[object Number]";
    "[object String]","[object Number]","[object Boolean]"
    "[object Object]","[object Array]","[object Date]","[object Function]"
    优点:可以准确的识别出引用对象类型
    缺点:写法稍微复杂,适用于原型会改变的情况。
    
    c.自定义及原生类判断父类:    √
    obj.constructor===Class;
    //String,Number,Boolean,Object,Array,Date,Function
    优点:简单
    缺点:如果继承链中换了原型,则会出错,不稳定
    
    d:自定义及原生类判断父原型:  
    obj._proto_===Class.prototype;如果为true,说明Class.prototype是obj父原型
    
    
    e:自定义及原生类判断祖先原型: √
    obj instanceof Class;如果true,说明Class.prototype是obj的祖先原型
    //String,Number,Boolean,Object,Array,Date,Function
    
    

    三、类型转换

    1.转Boolean

    显示语法:Boolean(value)//转换函数
    隐式方式:条件语句中
    1.Null       // null 
    2.Undefined  // undefined  
    3.Boolean    // false 
    4.Number     // +0,-0,NaN 
    5.String     // ""  以上这部分为false 
    6.Object     // 引用类型转换为布尔,始终为true 
    

    2.转Number

    显示语法:Number(value)//转换函数。。。其它方法:parseFloat(),parseInt() 
    隐式方式:一元运算符 +。eg:{var x="5",var y=+x;//则x为number类型}
    1.Null      // 0 
    2.Undefined // NaN 
    3.Boolean    // false为0,true为1 
    4.Number     //  可以转其它进制
    5.String     // 有其它字符,则返回NaN,如只有连续数字(首位允许有空格),则返回数字 
    6.Object     // NaN,除了[]为0,[15]为15,[15,20]也为NaN 
    
    总结:如果没办法转化为数字,则为NaN
    其中,Null表示空对象,为0
    Undefined 表示没有定义值,值是未知的,为NaN
    

    3.转String

    显示语法:String(s);    //转换函数
    隐式方式:"+"运算符
    1.Null        // "null" 
    2.Undefined   // "undefined" 
    3.Boolean     // false为"false",true为"true" 
    4.Number      // "对应数字" //0,+0,-0为0
    5.String      //
    6.Object      // Object为:"[object Object]"; function为:"function(){}";数组为:"数组内容1,数组内容2" 
    

    四、值相等判断

    前面有说到类型种类,类型判断及类型转换。
    这里再补充对于值相等的判断

    • == :相等运算法
    • ===严格相等运算符:对比==增加了类型的判断(typeof)。都一致才相等
    • Object.is():对比==、===修复了特殊值的相等判断:NaN、+0,-0
    1.== 
    a.比较的是值 
    b.如果类型不同,会自动转换成同一类型进行比较值。[]==0为true
    c.null和undefined尽管有不同,但是都表示“值的空缺”。用“==”认为两者相等
    总结:
    会自动类型转换
    站在值的角度,null和undefined都表示“值的空缺”,用“==”认为两者相等
    适用于只是值的比较,比如后台给的数据(对类型并不知情),刚好==会忽略类型
    
    2.===
    a.比较的是值和类型,先对比类型,类型不一样,为false。类型相同则对比值 
    b.+0和-0或0,虽然看起来不一样,因为类型相同值也相等,为true
    c.NaN和NaN之间,为false 
    d.基础类型和引用类型之间:因为类型不同,为false。
    e.引用类型之间:尽管object,array,function不一样,但都是属于引用类型,对比值(物理地址)即同一对象的引用为true,否则为false
    总结:
    对比==只是增加了个类型判断。类型判断方式为typeof
    适用于严格的判断
    
    3.Object.is()
    ==缺点:会进行类型转换eg:"10"==[10]==10类似问题,及[]==0为true
    ===缺点:没办法区分0===-0为true及NaN===NaN为false
    Object.is()修复了===的缺点:Object.is(+0,-0)为false 及 Object.is(NaN,NaN)为true
    

    相关文章

      网友评论

        本文标题:JavaScript之数据类型及类型判断

        本文链接:https://www.haomeiwen.com/subject/rvzywqtx.html