JavaScript语言精粹学习笔记之数据类型

一 JavaScrip的数据类型

JS在某种意义上来说,只包含基本类型(原始值类型,简单类型)和引用类型(复杂类型)。number,string,boolean是基本类型中的特殊引用类型。

简单类型

1.number:包含整数或浮点数

  • JS不分整形和浮点型
    这句话的意思就是说当浮点数输出时会自动转换成整数。

  • 两个浮点值相加,精度不够

let num1=1,num2=2.1;
console.log(num2+0.2)//输出: 2.3000000000000003
  1. string:一串表示文本值的字符序列
    在JS中没有字符类型,字符可以表示为含有一个字符的字符串
    (刚刚才知道在string类型中单双引号的作用是一样的 )
  2. 布尔值 boolean:包含两个值false和true
  3. null:只包含一个值null
  4. undefined:只包含一个值undefined

引用类型

  1. Object:对象,除了常用的Object,Array、Function等,其他都属于特殊的对象 。
二 简单类型和引用类型的区别
- 区别这两种类型的直接特征是:存储位置。

简单类型:若某种变量是直接储存在栈(stack)中的简单数据段。
引用类型:储存在堆区中的对象。

准确地来说,引用类型的存储需要内存的栈区(内存中的栈内存)和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。

    var person1 = {name:'we'};
    var person2 = {name:'wr'};
    var person3 = {name:'wt'};

这三个对象在内存中的保存情况:
在这里插入图片描述
由以上可知JS内存空间分为栈内存和堆内存,它们的特点分别是:

栈内存:

  • 存储的值大小固定
  • 空间较小
  • 可以直接操作其保存的变量,运行效率高
  • 由系统自动分配存储空间

堆内存:

  • 存储的值大小不定,可动态调整
  • 空间较大,运行效率低
  • 无法直接操作其内部存储,使用引用地址读取
  • 通过代码进行分配空间
- 对象生存周期的不同

引用类型:.在使用new创建的引用类型的实例中,在执行流离开当前作用域之前对象都一直保存在内存中

简单类型:自动创建的包装类型的对象只存在于一行代码的执行瞬间,然后就会被立即销毁

#自己研究的问题# :

  • 简单数据类型的前五个貌似是对象 ,因为他们拥有方法,但是他们是不可变的?
    原始值类型 undefined 、boolean 、number 、string 、null 的值是不可改变的,这个不可改变是指改原始值类型的值本身在js中是禁止操作的。也就是说每新建一个原始值,都会开辟一块新的内存。不管使用什么方法改变的都是值指向的 地址 ,而值本身是不会变的。我找到的另一种理解就是因为栈中的内存大小是固定的,所以存储在栈内的变量就是不可变的。

  • 为什么number,string,boolean(特殊的引用类型)这三个简单数据不是对象却可以调用方法?
    因为当简单数据类型调用方法的时候,在 js内部已经实现了一系列的处理,执行第二行代码时,访问过程处于一种读取状态,也就是要从内存中读取这个字符串的值。js内部的处理:
    1. 首先创建String类型的实例
    2. 在实例上调用指定的方法
    3. 最后销毁该实例

以下是number,string,boolean调用方法的例子(这两张图片是从一个大佬那里拿的,忘了注释来源,求原谅)


var num = 123;
console.log("num = " + num + "-- type : " + typeof num);
num = new Number(123);
console.log("num = " + num + "-- type : " + typeof num);
 
var bool = true;
console.log("bool = " + bool + "-- type : " + typeof bool);
bool = new Boolean(true);
console.log("bool = " + bool + "-- type : " + typeof bool);
 
var str = "hello";
console.log("str = " + str + "-- type : " + typeof str);
string = new String("hello");
console.log("str = " + str + "-- type : " + typeof str);

在这里插入图片描述
从上面的例子可以看出,当number和boolean类型的数据,调用构造函数进行封装,它们的类型就变为object(对象)。而对于string来说,调用构造函数后类型仍然是string。所以,字符串虽然是一个基本类型,但是存储的时候是按照对象的方式存储的。

  • 简单数据类型,不是对象?
    所有的数据类型都是对象?明显不是。只有复杂数据类型是对象。
    在简单数据类型中,number,string,boolean这三个是特殊的引用类型,因为它们的类型一定条件下可以变为对象(在上面问题的最后一段已有说明),但是也不能直接说它们是对象。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值