zoukankan      html  css  js  c++  java
  • js 类型

    类型分类

        js中数据类型 一共有八种。分别是 7种原始类型 ( undefined,Null Number,String,Boolean,Symbol,BigInt)和对象 (Object)
       除了Object 其他的类型的值本身都是无法被改变的。
       Object 其实又可以细分为 function, Arrary,Date,RegExp

    类型判断

     typeOf

      基本类型都可以用typeof来判断,function 也可以通过typeof来判断
      但是基本类型中有例外-null 直接用typeof null 会返回 object 需要使用String(null)来判断null
      typeof NaN  会返回 number 需要用isNaN来判断是否是NaN类型。
      Object 类型直接用typeof判断会返回object,没办法细分,所以我们要用其他办法判断

      Object.property.toString.call() 

       因为js一切皆对象,所以每个对象上都有一个这个toString方法。这个方法几乎支持所有的类型的判断。 这里的NaN类型也会返回为number,所以要精确的判断的是否是NaN 只能用isNaN
      比如
    let arr = new Array()
    Object.prototype.toString.call(arr) //'[object Array]'
     
    let a = 1
    Object.prototype.toString.call(a) //'[object Number]'
     
    Object.prototype.toString.call(NaN) //'[object Number]'
     
    Object.prototype.toString.call(null)//'[object Null]’
     
    function fn(){
    Object.prototype.toString.call(fn)//'[object Function]’
    

      

     

     instanceof

     
    instanceof 是用来判断一个对象是不是另一个对象的原型链中 所以我们可以用来判断引用类型的类型。
    如:
     
    [1,2] instanceof Array //true
     
    ({a:1}) instanceof Object //true
     
    (new Date) instanceof Date //true
     
    //值类型直接用instanceof 会返回false ,null 和 NaN 用instanceof 会报错
    "a" instanceof String //false
     
    null instanceof null
    // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
        at <anonymous>:1:6
     
    NaN instanceof NaN
    // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
        at <anonymous>:1:5
     
     *如果非要用instanceof 判断值类型 可以这么判断 需要明确的定义一下如:
    let a = new String("a")
    a instanceof String //true
    

      

     

    instanceof的实现原理

     
    instanceof就是去遍历左边函数的原型链,判断右边的对象 是否能在左边的原型链中,如果是就返回true,否则返回false。 手动实现一个instanceof
    手写instanceof
    function myInstanceof(left,right){
       //let proto = Object.getPrototypeOf(left);
       let proto = left.__proto__
       let prototype = right.prototype;
       while(true){
         if(proto === null){
           return false;
         }else if(proto === prototype){
           return true;
         }else{
           //proto = Object.getPrototypeOf(proto);
           proto = proto.__proto__
         }
       }
    }
    

      

     

    类型转换

    类型转换有显式的转换方式,也有隐式的转换方式。

    显示

     
    转换类型 函数 当值为null时 特性 备注
    转为字符串 toString 报错  
    [1].toString() //“1”
    [1,4].toString()//“1,4"
      String() 'null'    
    转为数字 Number()  0 转为数字 如果x无法转成数字 会返回NaN
      parseInt() NaN 转为整数 如果x无法转成数字 会返回NaN
       parseFloat() NaN 转为浮点数 如果x无法转成数字 会返回NaN
    转为布尔值 Boolean() false
    字符串,数字(除0以外)等转为true
    undefined转为false
    0转为false
     

    隐式

     
     隐式转换就是通过一些运算符号或者对比符号进行隐式转换。
     
    -(减号)*(乘号)/(除号)%(取余) 一律转成数值计算。
    +(加号)
    • 数字+字符串 = 字符串
    •  数字+对象 先调用对象的valueof再调用tostring 进行拼接 举几个例子
    1+{"a":"2”}  //'1[object Object]’
     
    1+(function a(){}) //'1function a(){}’
     
    1+ (new Date()) //'1Thu Oct 21 2021 18:21:27 GMT+0800 (中国标准时间)’
     
    1+["a","b”]  //'1a,b'
    

      

    • 数字+boolean = 数字
    1+true //2
    1+false //1
    

      

    • 数字+null = 数字
    1+null //1
    

      

    • 数字+undefined ==NaN   /  +undefined ==NaN
         NaN !== NaN
  • 相关阅读:
    罗马数字
    逆序对
    等价串
    郊区春游
    贝壳找房函数最值
    Educational Codeforces Round 45 Editorial
    Codeforces Round #486 (Div. 3)
    checkbox保存和赋值
    oninput和onchange的区别
    cookie路径概念理解
  • 原文地址:https://www.cnblogs.com/ada-blog/p/15434655.html
Copyright © 2011-2022 走看看