一 JavaScrip的数据类型
JS在某种意义上来说,只包含基本类型(原始值类型,简单类型)和引用类型(复杂类型)。number,string,boolean是基本类型中的特殊引用类型。
简单类型
1.number:包含整数或浮点数
-
JS不分整形和浮点型
这句话的意思就是说当浮点数输出时会自动转换成整数。 -
两个浮点值相加,精度不够
let num1=1,num2=2.1;
console.log(num2+0.2)//输出: 2.3000000000000003
- string:一串表示文本值的字符序列
在JS中没有字符类型,字符可以表示为含有一个字符的字符串
(刚刚才知道在string类型中单双引号的作用是一样的 ) - 布尔值 boolean:包含两个值false和true
- null:只包含一个值null
- undefined:只包含一个值undefined
引用类型
- 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这三个是特殊的引用类型,因为它们的类型一定条件下可以变为对象(在上面问题的最后一段已有说明),但是也不能直接说它们是对象。