JavaScript数据类型的初步了解

70 阅读3分钟

JavaScript的数据类型决定了变量或常量可以存储哪种类型的值和存储位置,以及可以对这些值执行哪些操作。

1. 数据类型的划分

最新的 ECMAScript 标准定义了 7 种数据类型: 基本类型:Boolean, String, Number, Undefined, Null, Symbol 引用类型:Object(Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型等)

二者的区别:

1. 基本数据类型存储的是原始的值,而引用类型是由一个或多个值构成的对象

const a = "a"; // 原始类型,值为string类型的a
const aList = ["a","b","c"] // 引用类型,多个string类型的值组合

2. 基本数据类型二者进行的比较是值比较,而两个引用类型进行的比较是引用的比较

let a = 1;
let b = 1;
console.log(a===b); // true(因为a和b的值都是1)

let aList = ["a","b","c"]
let bList = ["a","b","c"]
console.log(aList===bList); // false(因为a和b的引用不一样都是1)

3. 基本类型的值是不可变的,引用数据类型的值是可以变的

let a = "hello World";
a[0] = "H"; // 试图将h变为H
报错:TypeError: Cannot assign to read only property '0' of string 'hello World'

let aList = ["a","b","c"]
aList.push("d") // 往aList最后一位放置字母d
console.log(aList); //["a","b","c","d"]

2. JavaScript中的变量在内存中的具体存储形式

1. 基本类型是存放在栈内存(Stack)中的

let a = 1;
let b = a;
console.log(a===b); // true(因为a和b的值都是1)
a=2;
console.log(a===b); // false(因为a和b的值不一样)

上式的赋值运算在栈中是这样的:

数据在栈中的存放方式

就是说每创建声明一个基本类型的变量,就会在栈内存中存放这个变量,当修改这个变量的值的时候旧的值会直接覆盖新的值。从这里我们就很容易明白为什么第二次比较时a不等于b,因为他们的值不一样。

2.引用类型是存放在堆内存(Heap)中的

let aList = ["a","b","c"]
let bList = aList
aList.push("d") // 往aList最后一位放置字母d
console.log(aList); //["a","b","c","d"]
console.log(bList); //["a","b","c","d"]

数据在堆中的存放方式

这个就是上面那几步值在内存中的变化过程。数组存放在堆内存中,栈内存存放的只是它的引用,也就是指向这个数组的一个内存地址。我们可以很清楚地看到aList给bList赋值付过去的只是这个数组的引用,一但aList使得这个数组发生了变化,bList也会随之变化。

3.函数参数的传递方式

函数参数的传递方式始终是按值传递的

  1. 函数的参数如果是基本类型的话是复制一个值给函数的参数,相当于在这个函数的作用域内创建一个变量,并且赋值给它,和变量赋值相似。赋值之后形参和实参相同的地方只有他们的值是一样的,其余没有任何关系。
  2. 函数的参数如果是引用类型的话是给形参赋予了这个引用类型的引用,而这个引用也是一个值,这个值是引用的内存地址,所以虽然也给形参赋值了,但是当这个形参的内容改变时实参也会跟着改变。
let a = 30;
let person = new Object();
let setName = function (person,a) {
   person.name = "Bob";
   a++;
   console.log(person.name); // Bob
   console.log(a); // 31
}
setName(person,a)
console.log(person.name); // Bob
console.log(a); // 30