js数据类型

js中的数据类型

  • 数据类型的分类

    • 基本数据类型
      • number
      • string
      • boolean (0, NaN, null, undefined, 空字符串转换为布尔为假)
      • null (空对象指针)
      • undefined (未定义)
      • Symbol
      • bigint
    • 引用数据类型
      • object
      • function
  • 检测数据类型 (其他的 Array.isArray)

    • typeof 检测数据类型的逻辑运算符
    • instanceof 检测是否为某个类的实例
      //A instanceof B //B的prototype属性 是否在 A的原型链上
       function myInstanceof(A,B) {
          let proto = Object.getPrototypeOf(A);//获取对象的原型
          let prototype = B.prototype;//获取到右侧的prototype对象
          while(true) {
              if(!proto) return false;
              if(proto === prototype) return true;
              proto = Object.getPrototypeOf(proto)
          }
       }
    
    • constructor 检测构造函数
    • Object.prototype.toString.call 检测数据类型的逻辑运算符
  • typeof [value] 返回当前值的数据类型 '数据类型'

    • typeof 返回的结果都为字符串 结果有 "number" "string" "boolean" "underfined" "object" "symbol" "bigint" "function"
    • typeof null => "object" 所以的值在内存中都是按照二进制来存储的,对象的前三位时000,但null存储时前三位也是000,所以检测数量为object
    • typeof 不能识别对象的类型(检测普通对象或者数组对象时都是object)
    let a = typeof typeof typeof [1,2];
    console.log(a)//"string"   typeof [1,2]=>"object" typeof "object"=>"string"

number(数字类型)

+ NaN 不是一个有效数字 NaN和谁都不相等包括它自己
+ isNaN() 用来检测是不是有效的数字 如果不是有效数字返回true,如果是返回false
+ Infinity 无穷大的值
+ parseInt() 处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找)-> 如果处理的不是字符串,需要先转换为字符串然后再开始查找
+ parseFloat() 处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找)-> 如果处理的不是字符串,需要先转换为字符串然后再开始查找(包括小数点)
+ Number() 直接调用浏览器最底层的数据类型检测机制来完成
    - true => 1  false => 0
    - null => 0  underfiend => NaN
    - 字符串必须保证都是有效数字才会转为数字,否则都为NaN 
    let res = parseFloat("left:200px"); //=> NaN
    if(res === 200) {
        alert(200)
    }else if(res === NaN) {
        alert(NaN)
    }else if(typeof res === "number") {//typeof NaN => "number"
        alert("number")
    }else {
        alert('Invalid Number')
    }   => "number"

把其他数据转换为数字的方法

+ 强转换(基于底层机制转换的) Number([value])
    + 一些隐式转换都是基于Number完成的
        - isNaN("12px") 先把其他类型转换为数字再检测
        - 数学运算  (加号遇到字符串和对象是拼接)
            - 加号什么时候是字符串拼接:在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接 => 对象本身是要转换为数字进行运算的,只不过在转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,就变成了字符串拼接了(被拦截了)
        - 两个等号比较的时候
            - []==true => false 都转换为数字Number([])=>Number("")=>0
            - 对象==字符串 对象转化为字符串
            - null==undefined true  但是和其他任何值都不相等 0==false false
            - 剩下的两边不同都是转换为数字
            - 在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后再进行比较
+ 弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])
    parseInt(""); //=> NaN
    Number("");//=> 0
    isNaN("");//=> false
    parseInt(null);//=> NaN
    Number(null);//=> 0
    isNaN(null);//=> false
    parseInt("12px");//=> 12
    Number("12px");//=> NaN
    isNaN("12px");//=> true
    parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null); //=> "2.6number"
         |                      |                       |
        1.6                     1                      "number"
    isNaN(Number(!!Number(parseInt("0.8"))));//=> false
        - parseInt("0.8") => 0  
        - Number(0)=> 0
        - Number(false) => 0
        - isNaN(0) => false
    typeof !parseInt(null) + !isNaN(null);//=> "booleantrue"
                |                   |
            "boolean"       !isNaN(null)=>!isNaN(0)=>!false => true
    let result = 10 + false + undefined + [] + "Tencent" + null + true 
    + {};
    10+false=>10+undefined=>NaN+[]=>"NaN"+'Tencent'=>"NaNTencent"+null=>"NaNTencentnull"+true=>"NaNTencentnulltrue"+{}=>"NaNTencentnulltrue[object object]"
    console.log(result);//=>"NaNTencentnulltrue[object Object]"
    []==false =>true  [].toString()='' => ''==false
    ![]==false =>true  运算有效级,先算 ![]  再比较 ![] = false
    //把其他类型转换为布尔类型遵循的规律:只有0/null/NaN/undefined/''五个值是false,其余的都是true(遵循的是浏览器底层运行的时候,有自己的转换规则)
    {}+0 => 0 //大括号在js中太特殊了:对象,代码块(块级作用域) 此处把大括号当作一个代码块  后面是+0  +值 这个操作是数学运算(不论加谁)  这个{}认为是单独的一块
    0+{} => '0[object Object]'
    ({}+0) => '[object Object]0'
    {}+0+{} => '[object Object]0[object Object]'

大括号在运算符前后

- 在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
- 出现在运算符的后面,认为是数学运算

补: 规则

- 对象==字符串  对象转换为字符串 [10] == "10" true
- null==undefined (三个等号下不相等),但是和其他任何的值都不相等 0==null false
- NaN和谁(包括自己)都不相等
- 剩下的情况都是转换为数字再做比较
- 把其他类型转换为布尔类型遵循的规律:只有0/null/NaN/undefined/''五个值是false,其余的都是true

在js中对象的属性是什么格式的?

- 普通对象的属性名只能是 "字符串" (普通对象的属性名可以是基本数据类型值)
- Map 这种数据结构支持 对象作为属性名
- 但是普通对象的属性名不能是对象,如果是对象,需要转换为字符串存储
    var a={},b={n:'12'},c={m:'13'};
    a[b] = "nihao"; => a['[object Object]']
    a[c] = "xiaohua"; => a['[object Object]']
    console.log(a[b])//"xiaohua"

js之所以能在浏览器中运行,是因为浏览器给js提供了执行环境 => 栈内存(Stack) (浏览器中有专门的线程(js引擎)来执行)

+ 堆(Heap)  栈(Stack)内存
+ ECStack(Execution Context Stack)和EC(Execution Context)
+ GO(Global Object)
+ VO(varibale Object)
+ AO(Activation Object)

栈内存:提供代码执行的环境
堆内存:存放东西(存放的是属性和方法)

posted @ 2022-09-28 14:21  兜兜~  阅读(46)  评论(0)    收藏  举报