JavaScript的数据类型
JavaScript简单数据类型(基本数据类型,值类型)
- Boolean
- String
- Number
- Undefined
- Null
- Symbol
Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
Undefined 这个值表示变量不含有值。
可以通过将变量的值设置为 null 来清空变量。
Javascript复杂数据类型(引用数据类型)
- Object
Object 本质上是由一组无序的明值组成的。
Array、Function
等都属于特殊的对象
声明变量类型
当您声明新变量时,可以使用关键词 "new" 来声明其类型:
var carname=new String;
var x = new Number;
var y = new Boolean;
var cars = new Array;
var person = new Object;
JavaScript 变量均为对象。当您声明一个变量时,就创建了一个新的对象。
为什么要区分基本类型和复杂类型
不可变性
基本类型本身是不可变的。以字符串为例,我们在调用操作字符串的方法时,没有任何方法是可以直接改变字符串的:
var str = 'ConardLi';
str.slice(1);
str.substr(1);
str.trim(1);
str.toLowerCase(1);
str[0] = 1;
console.log(str); // ConardLi
在上面的代码中我们对str
调用了几个方法,无一例外,这些方法都在原字符串的基础上产生了一个新字符串,而非直接去改变str
,这就印证了字符串的不可变性。
但是:
str += '6'
console.log(str); // ConardLi6
你会发现,str
的值被改变了,这不就打脸了字符串的不可变性么?其实不然,我们从内存上来理解:
- 在
JavaScript
中,每一个变量在内存中都需要一个空间来存储。 - 内存空间又被分为两种,栈内存与堆内存。
- 栈内存
- 存储的值大小固定
- 空间较小
- 可以直接操作其保存的变量,运行效率高
-
由系统自动分配存储空间
JavaScript中的原始类型的值被直接存储在栈中,在变量定义时,栈就为其分配好了内存空间
image.png
由于栈中的内存空间的大小是固定的,那么注定了存储在栈中的变量就是不可变的。
在上面的代码中,我们执行了str += '6'
的操作,实际上是在栈中又开辟了一块内存空间用于存储'ConardLi6'
,然后将变量str指向这块空间,所以这并不违背不可变性的特点。
复杂类型
- 堆内存
- 存储的值大小不定,可动态调整
- 空间较大,运行效率低
- 无法直接操作其内部存储,使用引用地址读取
- 通过代码进行分配空间
复杂类型的值实际存储在堆内存中,它在栈中只存储了一个固定长度的地址,这个地址指向堆内存中的值。
var obj1 = {name:"ConardLi"}
var obj2 = {age:18}
var obj3 = function(){...}
var obj4 = [1,2,3,4,5,6,7,8,9]
image.png
当然,引用类型就不再具有不可变性了,我们可以轻易的改变它们:
obj1.name = "ConardLi6";
obj2.age = 19;
obj4.length = 0;
console.log(obj1); //{name:"ConardLi6"}
console.log(obj2); // {age:19}
console.log(obj4); // []
以数组为例,它的很多方法都可以改变它自身。
-
pop()
删除数组最后一个元素,如果数组为空,则不改变数组,返回undefined,改变原数组,返回被删除的元素 -
push()
向数组末尾添加一个或多个元素,改变原数组,返回新数组的长度 -
shift()
把数组的第一个元素删除,若空数组,不进行任何操作,返回-undefined,改变原数组,返回第一个元素的值 -
unshift()
向数组的开头添加一个或多个元素,改变原数组,返回新数组的长度 -
reverse()
颠倒数组中元素的顺序,改变原数组,返回该数组 -
sort()
对数组元素进行排序,改变原数组,返回该数组 -
splice()
从数组中添加/删除项目,改变原数组,返回被删除的元素
还有哪些复杂对象
在ECMAScript
关于类型的定义中,只给出了Object
类型,实际上,我们平时使用的很多引用类型的变量,并不是由Object
构造的,但是它们原型链的终点都是Object
,这些类型都属于引用类型。
-
Array
数组 -
Date
日期 -
RegExp
正则 -
Function
函数
网友评论