JS有哪些类型?
1、Javascript有String,Number,Boolean,Null,Undefined,Symbol等6种基本类型,此外还有1种复杂类型Object,其中包括function,Array,Date。
此外在ES6种新增了一种类型叫Symbol,每一个Symbol都是不相等的,都是独一无二的,所以适合作为标识符,用在多模块的对象属性名上不会出现重复。
另外还有一种BigInt的内置对象,可以表示任意大的整数。
2、ES变量可能包含两种不同数据类型的值:基本类型值和引用类型值,其中基本类型值是简单的数据段,引用类型值是指可能由多个值构成的对象。
String,Number,Boolean,Null,Undefined属于基本数据类型。
Object,Array,Date,RegExp(正则表达式),Function(函数)都属于引用类型。
此外,为了方便操作基本类型值,ES提供了3种特殊的引用类型:Boolean,Number,String
3、ES定义了两个单体内置对象:Global和Math。
基本数据类型和复杂类型的区别
在内存中存储的方式不同
基本数据类型把数据名和值都直接存储在栈内存中
基本类型:是指存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配他们是直接按值存放的所以可以直接按值访问。
复杂数据类型把数据名和堆地址存储在栈内存中,而将属性和值都存储在堆内存中,访问时先从栈中获取地址,再到堆中拿到相应的值。
引用类型:是指存放在堆内存中的对象,变量名保存在栈内存中,而对应的值保存在堆内存中,这个变量在栈内存中实际保存的是:这个值在堆内存中的地址,也就是指针,指针指向堆内存的地址。
不同数据类型作为参数时,函数内部对参数的修改是否能够改变外部变量的值。
(1)基本数据类型作为参数时,函数内部对参数值的修改不会改变外部变量的值。
function a(v){
//定义以v为参数的函数,返回v的值
v=100;
return v;
}
var x=50;
//调用函数a,并将x作为参数传入函数a
a(x);
console.log(x);//x还是50
把x的值传给v时仅是简单的复制了一份,x与v可以单独操作,互不影响。
(2)复杂数据类型作为参数时,函数内部对参数值的修改会改变外部变量的值。
function son(age,number,grade){
this.age=age;
this.name=name;
this.grade=grade;
}
var a=new son(8,"zj",'100');//创建一个son实例
function change(v){
v.name='zg'
}
change(a);
console.log(a.name);//输出zg
复杂数据类型赋值是将栈中对象的地址赋给变量,函数内外两个变量指向同一个对象,所以只要对象的属性值改变,两个变量值都会改变。