JavaScript的数据类型
文章目录
JavaScript的数据类型
JavaScript的基本数据类型有7种,number,string,boolean,undefined,null以及ES6中添加的 symbol 和 bigint。
JavaScript的引用数据类型有一种,object。
1. number
1.1 整数类型
常见的为十进制,0开头可以设置为8进制,0x开头可以设置为16进制。
let intNum = 55 // 10进制55
let num1 = 070 // 8进制56
let hexNum1 = 0xA //16进制10
1.2 浮点类型
数值汇总的时候必须包含小数点,可以用科学计数法表示。
let floatNum1 = 1.1;
let floatNum2 = 0.1;
let floatNum3 = .1; //有效,但不推荐
let floatNum = 3.125e7;//科学计数法
有一个特殊的数值类型 NAN,意为“不是数值”,用来表示本来要返回数值的操作失败了,而不是抛出错误。
console.log(0/0); // NaN
console.log(-0/+0); // NaN
console.log('aniu' - 100); // NaN 非数字 Not a Number
// isNaN()这个方法用来判断非数字 并且返回一个值如果是数字返回的是 false,如果不是数字返回的是 true
2. undefined
undefined类型只有一个值,就是特殊值undefined。当用var或者let声明变量但是没有初始化,这个变量的值就是undefined。
包含undefined值的变量和没有定义的变量是不一样的,后者会报错。
3. string
字符串是不可变的。
let lang = "Java";
lang = lang + "Script"; // 先销毁再创建
var str = 'abc' ;
str = 'hello';
//当重新给str赋值的时候,常量'abc'不会被修改,依然在内存中
//重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变
//由于字符串的不可变,在大量拼接字符串的时候会有效率问题;
var str= ‘’;
for(var i=0;i<100000;i++){
str += i;
}
console.log(str); //这个结果需要花费大量时间来显示,因为需要不断的开辟新的空间
4. null
null类型只有一个值,就是null。
null值表示一个空指针对象,所以给typeof传null会返回一个"object"。
undefined是由null值派生而来的。
console.log(null == undefined); // true
常用于变量需要保存一个暂时没有定义的对象时,用来填充变量。
5. boolean
布尔值只有两个,true 和 false。
6.symbol 和 bigint
占位以后写
7.object
主要包含object,array,function。
还包括Date,RegExp,Map,Set等。
8.区别
基本数据类型都保存在栈中,引用类型的对象保存在堆中,在栈中会保存堆内的引用地址。
把一个变量赋值给另一个变量时,解析器首先要确认这个值是几本类型还是引用类型。
let a = 10;//栈内存中只有a
let b = a;//赋值操作,b = 10,占内存中添加b并把a复制一份给b
b = 20;//栈内存中的b保存了另一个值
console.log(a);//10
将一个object赋值给另一个object的时候,只是将栈中保存的引用地址给了新的object,这个时候两个object共用相同的引用地址,修改任意object都会造成两个object的变化。
var obj1 = {};//栈内存中obj1保存了一个指向堆内存的指针
var obj2 = obj1;//栈内存中添加obj2,同时将栈中obj1保存的指针复制给obj2
obj2.name = "Xxx";//修改的是堆内存中的对象属性
console.log(obj1.name);//Xxx,栈中obj1保存的指针指向的堆内存中的对象属性已经被修改了
9.总结
声明变量时,内存地址分配不同:
- 简单类型的值存放在栈内存中,栈内存中存放的是相应的值。
- 引用类型对应的值存放在堆内存中,在栈中存放的是指向堆内存的地址。
赋值变量时:
- 简单类型赋值,是生成相同的值,两个对象对应不同的地址。
- 复杂类型赋值,是将保存对象的内存地址赋给另一个变量。也就两个变量指向堆内存中同一个对象。