JS中数据类型有哪几种?null 是对象吗?基本数据和复杂数据类型有什么区别?

本题地址:https://github.com/YvetteLau/Step-By-Step/issues/5

JS中基本数据类型

  • 原始数据类型 (不是对象且没有方法)

    Boolean、Null、Undefined、Number、String、Symbol(ES6 新增)、BigInt(ES10)

    1. Boolean 类型
      表示一个逻辑实体,有两个值:true 和 false。
    2. Null 类型
      表示缺少的标识,指示变量未指向任何对象。
    3. Undefined 类型
      一个没有被赋值的变量会有个默认值 undefined。
    4. Number 类型
      根据 ECMAScript 标准,Number 基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(263 -1) 到 263 -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。
    5. String 类型
      用于表示文本数据。它是一组16位的无符号整数值的“元素”。
    6. Symbol 类型
      表示独一无二的值。
    7. BigInt 类型
      BigInt 是 JavaScript 中的一个新的原始数值类型,它可以以任意精度表示整数。使用 BigInt 可以安全地存储和操作大型整数,甚至超过数字的安全整数限制。一个 BigInt 数据可以通过将 n 附加到 Integer 的末尾或通过调用构造函数创建。
  • 复杂数据类型
    Object
    (emmm 这个内容太多了)

null 是对象吗?

不是。null 值表示缺少的标识,指示变量未指向任何对象。

The value null is written with a literal: null. null is not an identifier for a property of the global object, like undefined can be. Instead, null expresses a lack of identification, indicating that a variable points to no object.

---------- 下面是刘小夕的答案 -----------

null 不是一个对象,尽管 typeof null 输出的是 Object,这是一个历史遗留问题,JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,null 表示为全零,所以将它错误的判断为 Object 。

基本数据和复杂数据类型有什么区别?

  • 基本数据类型: 存放在栈内存中,它们是按值存放的
  • 引用数据类型: 存放在堆内存当中,它们是按引用地址存放的
    在变量赋值或函数传参时,数据传递的方式会有不同,基本类型是复制一份值进行传递,引用类型则是传递了内存地址。

---------- 下面是刘小夕的答案 -----------

  1. 内存的分配不同

基本数据类型存储在栈中。
复杂数据类型存储在堆中,栈中存储的变量,是指向堆中的引用地址。

  1. 访问机制不同

基本数据类型是按值访问。
复杂数据类型按引用访问,JS不允许直接访问保存在堆内存中的对象,在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值。

  1. 复制变量时不同

基本数据类型:a=b;是将b中保存的原始值的副本赋值给新变量a,a和b完全独立,互不影响。
复杂数据类型:a=b;将b保存的对象内存的引用地址赋值给了新变量a;a和b指向了同一个堆内存地址,其中一个值发生了改变,另一个也会改变。

  let b = {
    age: 10
  }
  let a = b;
  a.age = 20;
  console.log(a); // { age: 20 }
  1. 参数传递的不同(实参/形参)

函数传参都是按值传递(栈中的存储的内容):基本数据类型,拷贝的是值;复杂数据类型,拷贝的是引用地址。

  // 基本数据类型
  let b = 10
  function change(info) {
    info=20;
  }
  // info=b; 基本数据类型,拷贝的是值得副本,二者互不干扰
  change(b);
  console.log(b); // 10

  // 复杂数据类型
  let b = {
    age: 10
  }
  function change(info) {
    info.age = 20;
  }
  // info=b; 根据第三条差异,可以看出,拷贝的是地址的引用,修改互相影响。
  change(b);
  console.log(b); // { age: 20 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容