前言

 

这是本学习笔记的第一篇记录,先简单说下自己为什么会写这些笔记。

其实动笔写之前是有犹豫的,觉得会不会在做无用功,因为毕竟网上现有资源这么多,遇到问题或不会的随便搜一下就可以了,觉得没必要浪费时间重复“造轮子”。

但后来仔细想想,还是决定自己动手写。主要原因是因为“学习”这件事不应该仅仅只有“输入”,更重要的应该是“输出”。 就像“费曼学习法”所提及的一样,要想真正的学会一样东西(知识、技能etc),应该要:

 

  1. Concept--确定学习目标(学什么)==>Input
  2. Teach--理解掌握并教授(口头、笔记)==>Output
  3. Review--得到反馈再次重新学习==>Input
  4. Simplify--更精炼的简化 ==>Output

 

所以,除了一味的“填鸭”输入后,我认为更重要的应该是思考的过程。正所谓:学而不思则罔!思考,特别是深层次的思考才是更有价值的。不仅仅要去了解知识的“然”,更要“知其所以然”

而记笔记,便是自己对于学习的思考反馈,也是一种很重要的输出。所以,这段话也是提醒自己,记笔记的原则不是想做流水线似的笔记,而是经过思考,觉得重要的点,才记录。

 

数据类型

 

目的

说实话,在学习语言之前,我从来没想过为什么需要区分数据类型。就很自然的接受了觉得语言虽不同,但都几乎统一的划分了不同的数据类型。实际上,区分开来的原因也很简单,就是为了充分利用存储空间,因为不同的数据所需占用的存储空间不同。

 

分类

在JavaScript中,总共有六种数据类型:

  • 基本数据类型(值类型):String 字符串、Number 数值、Boolean 布尔值、Null 空值、Undefined 未定义。
  • 引用数据类型(引用类型):Object 对象。

 

Remarks:

内置对象 Function、Array、Date、RegExp、Error等都属于 Object 类型。

也就是说,除了那五种基本数据类型之外,其他的,都称之为 Object

So引用数据类型有几种:只有一种,即 Object!

 

数据类型之间最大的区别:(关于栈内存和堆内存的区别)

  • 基本数据类型:参数赋值的时候,传数值
  • 引用数据类型:参数赋值的时候,传地址(修改的同一片内存空间)

 

举例:

基本数据类型

    let a = 123;    
    let b = a;    

    a++;    

    console.log(a); // 打印结果:124    
    console.log(b); // 打印结果:123

上面的代码中:a 和 b 都是“基本数据类型”,让 b 等于 a,然后改变 a 的值之后,发现 b 的值并没有被改变

但在引用数据类型中,情况就就不同了。

 

引用数据类型

    var obj1 = new Object();    
    obj1.name = 'Tom';    

    // 让 obj2 等于 obj1    
    var obj2 = obj1;    

    // 修改 obj1 的 name 属性    
    obj1.name = 'Jerry';    

    console.log(obj1.name); // 打印结果:Jerry    
    console.log(obj2.name); // 打印结果:Jerry

可以看出,obj1 和 obj2 都是引用数据类型,让 obj2 等于 obj1,然后修改 obj1.name 的值之后,发现 obj2.name 的值也发生了改变。

 

无论基本数据类型,还是引用数据类型,同样是赋值,为什么前者是互不干扰,而后者却彼此同步影响呢?

答案便是一开始提及的栈内存和堆内存的区别!

 

栈内存和堆内存

(栈内寸和堆内存的具体定义可自行搜索,在此先简单理解为两块不同的存储地,保存不同的东西!)

记住:在JS中,所有的变量都是保存在栈内存中的! (关键词:变量 & 栈内存

 

基本数据类型(Saved:栈内存):

基本数据类型的值,直接保存在栈内存中。值与值之间是独立存在,修改一个变量不会影响其他的变量。

由上图可见,要复制一个值时,如 b=a,是直接保存一个新值,和旧值彼此独立!

 

引用数据类型(Saved:堆内存):

对象是保存到堆内存中的。每创建一个新的对象,就会在堆内存中开辟出一个新的空间;而变量保存了对象的内存地址(对象的引用),保存在栈内存当中。如果两个变量保存了同一个对象的引用,当一个通过一个变量修改属性时,另一个也会受到影响。

由上图可见,引用数据类型(Object)创建时,其变量obj依旧保存在栈内存(只要是变量,就一定保存在栈内存)。但由于创建的是对象,所以对象就一定保存在右侧的堆内存,而左侧的变量所保存的值不过是指向该对象堆内存的地址,所以哪怕复制了一个新值:obj2=obj, 不过就是复制了地址指向(共同指向同一堆内存),当对象属性或方法改变时,都会产生共同影响!

延伸阅读
  1. 上一篇: JS笔记 | 2. 运算符的各注意事项
  2. 下一篇: Linux魅力无限

发表评论

您尚未登录,登录后方可评论~~
登陆 or 注册

评论列表

暂无评论哦~~