第一篇 JS 语言基础之引用数据类型

180 阅读4分钟

1.4 JS 常用数据类型

1.4.2 引用数据类型

1.4.2.1 object 对象数据类型 - 普通对象

  1. 语法 : {[key]:[value],...}

    任何一个对象都是由零到多组键值对(属性名:属性值)组成的

    属性名不能重复

    属性名都是字符串(可不写引号,默认转换为字符串)

  2. 操作

  • 查: 获取属性名及属性值
    • 对象.属性名
    • 对象['属性名']       属性名是数字或者字符串格式
    • 如果当前属性名不存在,默认的属性值是 undefined
    • 如果属性名是数字,则不能用点的方式获取属性值
           let person = {
           name :'小明',
           age : 40 ,
           height : '185cm',  
           1: 100
           }
           console.log(person.name); // => '小明'
           console.log(person['age']); // => 40
           console.log(person.sex); // => undefined
           console.log(person[1]); // => 100
           console.log(person.1); // => 语法错误 SyntaxError: missing ) after argument list
    
  • 增: 设置属性名属性值
         let person = {
           name :'小明',
           age : 40 ,
           height : '185cm', 
           1 : 100 
           }
           person.GF = '圆圆';
           console.log(person['GF']); // '圆圆'
           console.log(person.GF); // '圆圆'  
       
  • 改:
    • 属性名不能重复
    • 如果属性名已经存在,不属于新增,属于修改
         let person = {
           name :'小明',
           age : 40 ,
           height : '185cm', 
           1 : 100 
           }
           person.name = '小刚';
           console.log(person['name']); // '小刚'
           console.log(person.name); // '小刚'      
  • 删:删除属性
    • 真删除delete: 把属性彻底删掉
    • 假删除null/undefined: 属性还在,值为空
    delete person[1];
    person.age = null;
    console.log(person);
    // {name: '小明', age: null, height: '185cm', GF: '圆圆'}
    console.log(age);
    // 报错 age is not defined
  1. 变量和属性名的区别

    变量与属性名

1.4.2.2 数组对象

  1. 数组是特殊的对象数据类型,基本结构:
  • 我们中括号中设置的是属性值,数组的属性名是默认生成的数字,从 0 开始递增,而且这个数字代表每一项的位置,我们把其称为'索引' 即
    • 从 0 开始,连续递增,代表每一项位置的数字属性名
  • 天生默认一个属性名 length , 存储数组的长度,等于元素的个数
  • 增删改查与上面普通对象一致,同时数字只能使用[]
    • 获取第一项 ary[0]
    • 获取最后一项 ary[ary.length -1]
    • 向数组末尾追加一项 ary[ary.length] = xxx
       let ary = [12, '哈哈' , true , 13];
       console.log(ary.length); // 4
       console.log(ary['length']); // 4

1.4.2.3 数据类型的区别 - 浅图解堆栈底层机制

结论

  • 基本类型: 按值操作(直接操作的是值),所以也叫值类型

    • a 和 b 无关 ,修改其中一个不影响另一个(见下)
  • 引用类型: 操作的是堆内存的地址(按引用地址操作的),所以也叫引用类型

    • m 和 n 有关,修改 n 的对象属性 m 也会联动改变(见下)

浏览器想要执行 JS 代码:

  1. 从电脑内存中分配出一块内存,用来执行代码(栈内存 Stack)(图中的上半部分)

    • 变量存储空间

    • 值存储空间

  2. 浏览器分配一个主线程用来自上而下执行 JS代码 (想象磁头)(图中的下半部分)

        let a = 12;
        let b = a;
        b = 13;
        console.log(a); // 13

        let n = { name: '可口可乐' }
        let m = n;
        m.name = '百事可乐';
        console.log(n.name); // '百事可乐'

创建变量赋值过程:

let a = 12;

@step1 创建变量,放到当前栈内存变量存储区域中

@step2 创建一个值 12,把它存储到当前栈内存值区域当中(仅基本类型值,引用类型值不是这样,见下)

@step3 =为赋值,其实赋值是让变量和值相互关联的过程

  1. 代码进栈执行

  2. 执行完出栈,下一行代码才能进栈执行

    @step4 创建变量 b

    @step5 让 b 与 12 关联

    @step6 创建一个值 13,把它存储到当前栈内存值存储空间

    @step7 让变量 b 和值 13 相互关联,并把 b 与 12 的关联取消

=========================引用类型值的存储============================ 接 4.

复杂值(引用类型值)的存储分为三个步骤

  1. 在堆内存中分配出一块新内存,用来存储引用类型值(堆内存 Heap)

    内存有一个 16 进制地址 AAAFFF000

  2. 把对象中的键值对依次存储到堆内存当中

    变量存进变量存储区,地址存进值存储区

  3. 把堆内存地址和变量关联起来 n 指向 AAAFFF000

  4. 进栈执行

  5. 出栈

  6. 创建一个变量 m,把它存储到当前栈内存变量存储空间

  7. 将 m 与刚才的对象地址相关联 m 指向 AAAFFF000

  8. 修改AAAFFF000对应对象的 name 值

本图摘自珠峰培训视频

image.png

练习

        let n = [10, 20];
        let m = n;
        let x = m;
        m[0] = 100;
        x = [30, 40];
        x[0] = 200;
        m = x;
        m[1] = 300;
        n[2] = 400;
        console.log(n, m, x);// [100,20,400][200,300][200,300]

小试牛刀练一练 习题一

1.4.2.4 函数

函数详细笔记

1.4.2.5 Math对象

Math对象及数学方法

1.4.2.6 Date 日期对象

日期对象及方法