js数据类型

72 阅读2分钟

原始类型和对象类型

js分为原始类型和对象类型.

原始类型

  • Null:只包含一个值:null
  • Undefined:只包含一个值:undefined
  • Boolean:包含两个值:truefalse
  • Number:整数或浮点数,还有一些特殊值(-Infinity+InfinityNaN
  • String:一串表示文本值的字符序列
  • Symbol:一种实例是唯一且不可改变的数据类型
  • BigInt

对象类型

  • Object:自己分一类丝毫不过分,除了常用的ObjectArrayFunction等都属于特殊的对象

不可变性

原始类型具有不可变性, 即原始类型值不可改变. 而引用类型可以改变.

如下字符串的一系列方法都不会改变原字符串,而是产生一个新的字符串.

var str = 'ConardLi';
str.slice(1);
str.substr(1);
str.trim(1);
str.toLowerCase(1);
str[0] = 1;
console.log(str);  // ConardLi

存储

原始类型存储在栈内存中;对象类型(引用类型)的值实际存储在堆内存中,而在栈中存着一个固定长度的地址指向堆内存.

截屏2022-03-22 下午3.39.41.png

我们执行了str += '6' 的操作,实际上是在栈中又开辟了一块内存空间用于存储'ConardLi6',然后将变量str指向这块空间,所以这并不违背不可变性的特点。

截屏2022-03-22 下午4.15.58.png

复制

当把一个变量复制到另一个变量上时,原始类型和对象类型表现是不一样的.

原始类型复制时创建新空间存储,虽然值相同,但指向的内存空间完全不同.两个变量互不影响.

var name = 'jack';
var name2 = name;

截屏2022-03-22 下午3.47.02.png

引用类型实际上复制的是栈中的地址,两者指向堆中的同一个对象,改变其中一个值另一个也会随之改变.

var obj = {name:'peter'};
var obj2 = obj;

截屏2022-03-22 下午3.47.43.png

比较

原始类型直接比较它们的值;

引用类型会比较它们的引用地址.

截屏2022-03-22 下午3.54.03.png

值传递和引用传递

注意: ECMAScript中所有函数的参数都是值传递!

即传递的并不是变量的引用,而是变量拷贝的副本.当变量是原始类型时,这个副本是值本身,当变量是引用类型时,这个副本是指向堆内存的地址

let obj = {name:'ConardLi'};
function changeValue(obj){
  obj.name = 'code秘密花园';
}
changeValue(obj);
console.log(obj.name); // code秘密花园


let obj = {};
function changeValue(obj){
  obj.name = 'ConardLi';
  obj = {name:'code秘密花园'};
}
changeValue(obj);
console.log(obj.name); // ConardLi