Javasript数据类型

Javasript基本数据类型

  1. 几种?

    包括BooleanNullNaNundefinedNumberStringSymbol七种基本数据类型,一个引用类型Object

    • Boolean 布尔类型

      true / false

    • Null 空

    • NaN 非数值

      ES5中(不可配置、不可写),一般在Math的某个计算失败时,作为返回值出现或在字符串解析数字失败时会出现

    • undefined undefined类型

      一个没有被赋值的变量的默认值

    • Number 数字类型

      可表示NaN和带符号的浮点、整数

    • String 字符串类型

    • Symbol 符号类型

      唯一且不可修改,可用来作为Object的key值

  2. 怎么判断和区分?

  • typeof

    typeof null          //object  无效
    typeof NaN           //number  无效
    typeof []            //object  无效
    typeof new Date()    //object  无效
    typeof function      //function 有效
    typeof Symbol()      //Symbol   有效
    typeof 1             //Number   有效
    typeof ''            //String   有效
    typeof undefined     //undefined  有效
    

    null 返回object

    NaN 返回 number

    除了function之外的引用类型,统一返回object

    除了null之外的基本类型,均可正确返回类型

    function 返回 function

    对于引用类型变量及特殊情况判断不准确

    • instanceof

      instanceof检测的是原型,A instanceof B ,当A时B的实例时,返回true,否则返回false

      [] instanceof Array         //true
      [] instanceof Object        //true
      new Date() instanceof Date  //true
      

      现象:[]既是Array的示例,也是Object的实例

      原因[]._proto_Array._proto_Object.__proto_null形成一条原型链

      instanceof只能用来判断两个对象是否属于实例关系,而不能判断一个对象实例具体属于那种类型。当一个网页中包含多个框架,存在两个以上不同的全局执行环境,会存在两个不同版本的构造函数,导致判断存在问题,可以使用Array.isArray()方法

    • constructor

      function F(){}
      var f = new F();
      f.constructor == F   //true
      

      F被当成构造函数,f是F的实例,F原型链上的constructor传递给了f,因此f.constructor == F

      细节问题

      1. null和undefined是无效的对象,因此不会有constructor存在,这两种类型的数据需要通过其他方式判断。
      2. 函数的constructor是不稳定的,当开发者重写prototype后,原有的constructor引用会丢失,constructor会默认为Object
    • toString

      toString()是Object的原型方法,调用该方法,默认返回当前对象的[[Class]],这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。

      Object.prototype.toString.call('') ;   // [object String]
      Object.prototype.toString.call(1) ;    // [object Number]
      Object.prototype.toString.call(true) ; // [object Boolean]
      Object.prototype.toString.call(Symbol()); //[object Symbol]
      Object.prototype.toString.call(undefined) ; // [object Undefined]
      Object.prototype.toString.call(null) ; // [object Null]
      Object.prototype.toString.call(new Function()) ; // [object Function]
      Object.prototype.toString.call(new Date()) ; // [object Date]
      Object.prototype.toString.call([]) ; // [object Array]
      Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
      Object.prototype.toString.call(new Error()) ; // [object Error]
      Object.prototype.toString.call(document) ; // [object HTMLDocument]
      Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
      
  1. 实现一个 instanceof
function instanceOf(A,B){
    let proto = A._proto_;
    const prototype = B.prototype;
    while(true){
        if(proto === null) return false;
        if(proto === prototype) return true;
        proto = proto._proto_;
    }
}

实现思路:判断A._proto_是不是强等于B.prototype,不等于再找A._proto_._proro,直到_proto_为null

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值