美文网首页
JS 数据类型

JS 数据类型

作者: my木子 | 来源:发表于2021-04-14 08:02 被阅读0次

基础数据类型,存放在栈(stack)中,存值

  • String
  • Number
  • Boolean
  • Null
  • Undefined
  • Symbol 代表创建后独一无二且不可变的数据类型,主要是为了解决可能出现的全局变量冲突的问题
  • BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围
// Symbol
    let num1 = Symbol(1);
    let num2 = Symbol(1);
    console.log(num1 === num2); // false
// BigInt
    let num1 = Number(10000000000000000000000);
    let num2 = Number(10000000000000000000000);
    console.log(num1 + num2); // 2e+22

    let num3 = BigInt(10000000000000000000000);
    let num4 = BigInt(10000000000000000000000);
    console.log(num3 + num4); // 20000000000000000000000n

堆和栈

  • 堆和栈的概念存在于数据结构中和操作系统内存中
  • 在数据结构中,栈中数据的存取方式为先进后出。而堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。完全二叉树是堆的一种实现方式
  • 在操作系统中,内存被分为栈区和堆区
  • 栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
  • 堆区内存一般由程序员分配释放,若程序员不释放,程序结束时可能由垃圾回收机制回收

引用类型,存放在堆(heap)中,指向栈中的地址,存址

  • ObjectRegExpMathMapSet
  • Array
  • Function

类型转换

  • 强制转换 parseInt()parseFloat()Number()
  • 隐式转换 ==!!
let str = '99';
let num = 99;
// 强制转换
console.log(parseInt(str))  // 99
console.log(parseFloat(str))  // 99
console.log(Number(str))  // 99
// 隐式转换
console.log(str == num)  // true
console.log(!!num)  // true

类型判断

1. typeof
  • 基础数据类型中除了 null,其它类型都可以通过 typeof 来判断。
  • 不同的对象在底层都表示为二进制,在 javascript 中要是二进制前三位都是 0 的话就表示对象,而 null 的二进制都是 0,那么前三位自然也是 0,就被认为是 object,所以 typeof null 返回的是 object。
    console.log(typeof 1)  //  number
    console.log(typeof undefined) // undefined
    console.log(typeof null)  // object
    console.log(typeof true) // boolean
    console.log(typeof '字符串') // string
    console.log(typeof Symbol('1')) // symbol
    console.log(typeof BigInt(10000))  // bigint
    console.log( typeof function fun (){}) // function
    console.log(typeof NaN);      // number

    // 判断当前脚本运行在浏览器还是node环境中
    if (typeof process !== 'undefined') {
      console.log("node");
    } else {
      console.log("浏览器");
    }
2. instanceof
  • 内部通过原型链的方式来判断是否为构建函数的实例,常用于判断具体的对象类型。
 console.log([] instanceof Array)  // true
3. constructor
  • 通过构建函数来判断类型。
 console.log([].constructor === Array)  // true
4. Object.prototype.toString(推荐)
    console.log( Object.prototype.toString.call(null) )  //  [object Null]
    console.log( Object.prototype.toString.call(true) )  //  [object Boolean]
    console.log( Object.prototype.toString.call(1) )  //  [object Number]
    console.log( Object.prototype.toString.call('字符串') ) // [object String]
    console.log( Object.prototype.toString.call(1n) )  // [object BigInt]
    console.log( Object.prototype.toString.call([]) )  //  [object Array]
    console.log( Object.prototype.toString.call({}) )  // [object Object]
    console.log( Object.prototype.toString.call(function fun(){}) )  //  [object Function]
5. 判断特定类型的 API
    console.log( isNaN(1) )  //  false
    console.log( Array.isArray([]) )  //  true

数值格式化(每三位增加一个逗号)

    // 方法一
    function formatString(str) {
      return str && str.replace(/(?!^)(?=(\d{3})+\.)/g, ",");
    }
    // 方法二
    function formatNumber1(number) {
      return Intl.NumberFormat().format(number)
    }
    // 方法三
    function formatNumber2(number) {
      return number.toLocaleString('en')
    }

    console.log(formatString('1002300.102')); // 1,002,300.102
    console.log(formatNumber1(1002300.102)); // 1,002,300.102
    console.log(formatNumber2(1002300.102)); // 1,002,300.102

0.1 + 0.2 != 0.3

  • 当计算机计算 0.1+0.2 的时候,实际上计算的是这两个数字在计算机里所存储的二进制,0.1 和 0.2 在转换为二进制表示的时候会出现位数无限循环的情况。js 中是以 64 位双精度格式来存储数字的,只有 53 位的有效数字,超过这个长度的位数会被截取掉,这样会造成了精度丢失的问题
  • 在对两个以 64 位双精度格式的数据进行计算的时候,首先会进行对阶的处理,对阶指的是将阶码对齐,也就是将小数点的位置对齐后,再进行计算,一般是小阶向大阶对齐,因此小阶的数在对齐的过程中,有效数字会向右移动,移动后超过有效位数的位会被截取掉,这样也会造成了精度丢失的问题
  • 当两个数据阶码对齐后,进行相加运算后,得到的结果可能会超过 53 位有效数字,因此超过的位数也会被截取掉,这样也会造成了精度丢失的问题
    console.log((0.1 * 10 + 0.2 * 10) / 10 === 0.3)

推荐 Number-Precision

面试题

        let obj1 = {};
        let a1 = '0';
        let b1 = 0;
        obj1[a1] = '好好';
        obj1[b1] = '学习';
        console.log(obj1[a1]); // 学习
        // 引用类型,存址
        // 属性名不能重复
        // 数字属性名和字符串属性名隐式转换('0' == 0),obj[b] 覆盖 obj[a]

        let obj2 = {};
        let a2 = Symbol(1);
        let b2 = Symbol(1);
        obj2[a2] = '天天';
        obj2[b2] = '向上';
        console.log(obj2[a2]); // 天天
        // Symbol 创建唯一的值

        let obj3 = {};
        let a3 = {
            n: '1'
        };
        let b3 = {
            m: '2'
        };;
        obj3[a3] = '我爱';
        obj3[b3] = '我家';
        console.log(Object.prototype.toString.call(a3));    // [objec Obje]
        console.log(Object.prototype.toString.call(b3));    // [objec Obje]
        console.log(obj3[a3]); // 我家
        // Object.prototype.toString.call() 
        // a3 b3 都转换为[objec Obje],obj[b] 覆盖 obj[a]

相关文章

  • JS的类型转换

    JS的数据类型: 首先, JS的数据类型分为基本数据类型和引用数据类型基本数据类型: string number ...

  • js对象数组的深拷贝方法以及其他方法

    js判断数据类型是否为对象 js判断数据类型是否为数组

  • 2022前端面试题汇总(附答案)更新中

    JS相关 1.JS中的数据类型 (1)数据类型分为基本数据类型和引用数据类型基本数据类型:number、null、...

  • js深拷贝

    在写深拷贝之前,有必要说一下js的数据类型 一.js数据类型 1.1 分类 js数据类型分为两类:原始数据类型、引...

  • js数据类型

    JS基本数据类型和引用数据类型(JS 基本数据类型和引用数据类型的区别及浅拷贝和深拷贝) 再讲 js 的基本数据类...

  • js入门知识点

    * 基础知识 * js的输出方式 * js的组成 * js的命名规范 * 数据类型 * number数据类型 * ...

  • js常见知识点

    一、 js基本数据类型和引用数据类型 js基本数据类型:Number、String、Boolean、Null、un...

  • JS数据类型判断

    js中可以通过typeof来判断基本的数据类型。 数据类型 js的数据类型分为基本数据类型和引用数据类型,基本数据...

  • JS 高频面试题汇总

    # 说一下JS 中的数据类型有哪些 JS 数据类型包括 基本 / 引用 / 特殊 数据类型: 基本数据类型:Str...

  • 浅拷贝和深拷贝

    JS数据类型 在JS语言中,数据类型分为以下两种: 基本数据类型:null undefined number st...

网友评论

      本文标题:JS 数据类型

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