数据类型
js中,数据类型分为两种:基本类型和复杂类型。
基本类型: 在存储时,变量中存储的是值本身,因此也叫做值类型。
复杂类型: 在存储时,变量中存储的仅仅是地址(引用),因此也叫做引用数据类型。
基本类型
基本类型分为六种:string, undefined, boolean, null, number, symbol
- string
字符串是不可变的,一旦创建,值就不会发生改变
let str1="nihao"
let str2=str1+",hi"
console.log(str2)//nihao,hi 先销毁后创建
字符串有length属性
var str3="hello"
console.log(str3.length)//5
字符串转换:转型函数String(),适用于任何数据类型(null,undefined 转换后为null和undefined;toString()方法(null,defined没有toString()方法)。
2. undefined
只有一个值,即undefined值。使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined。
var a;
console.log(a)//undefined
- boolean
该类型只有两个值,true和false - null
只有一个值,即特殊值null。
逻辑上,null类型被看做空对象指针,null类型也是空的对象引用。
console.log(typeof(null))//object
- number
Number类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一位数字)两种值。
NaN:非数字类型。特点:① 涉及到的 任何关于NaN的操作,都会返回NaN ② NaN不等于自身。
console.log(0/0)//NaN
console.log(0/0==NaN)//false
isNaN() 函数用于检查其参数是否是非数字值。
console.log(isNaN("hello")) //true
- symbol
是一种基本数据类型。它是ES6引入的新特性,用于创建唯一的标识符。
Symbol函数的参数是可选的,主要用于描述Symbol值的字符串。但是,这并不意味着Symbol值就是这个字符串,两个相同描述的Symbol值是不相等的。
let sym1 = Symbol("key1");
let sym2 = Symbol("key2");
console.log(sym1 == sym2); // false
//Symbol值不能与其他类型的值进行运算操作,会抛出TypeError。
console.log(Symbol("key")+"Hello"); // TypeError
复杂类型
复杂类型分为三种:array, object, function
- object
Object类型是JavaScript中使用最多的一种类型。对于在应用程序中存储和传输数据而言,它是非常理想的选择。
创建Object实例的方式有两种,第一种是使用new操作符后跟Object构造函数。
var person = new Object();
person.name = "xuzhihong";
person.age = 24;
console.log(person)//{name: 'xuzhihong', age: 24}
另一种方式是使用对象字面量表示法。这是最常用的方式,属性名可以是字符串或数值
let obj={
name:"xuzihong",
"age":24,
2:true
}
访问对象属性
点表示法
console.log(obj.name)//xuzhihong
方括号表示法
console.log(obj[2])//true
方括号语法的主要优点是可以通过变量来访问属性。
var propertyName = 'age';
console.log(obj[propertyName])//24
- array
数组是一组有序的数据,但跟其他语言不同的是,数组中每个槽位可以存储任意类型的数据,并且数组也是动态大小的,会随着数据添加而自动增长
let arr1=["xuzhihong",24,{sex:2}]
//创建数组的基本方式有两种。第一种是使用Array构造函数。
let arr2=new Array('name','age','sex')//['name', 'age', 'sex']
//创建数组的第二种基本方式是使用数组字面量表示法。
var arr3 = ['name','age','sex'];
//在读取和设置数组的值时,要使用方括号并提供相应值的基于0的数字索引。
console.log(arr3[2])//sex
arr3[1]=24
console.log(arr3)//['name', 24, 'sex']
//数组的长度保存在其length属性中
console.log(arr3.length)//3
- function
函数实际上是对象,每个函数都是function类型的实例,而function也有属性和方法,跟其他引用类型一样
函数有三种表达式
函数声明
function fun1(num1,num2){
return num1+num2
}
console.log(fun1(2,3))//5
函数表达式
let fun2=function(num1,num2){
return num1+num2
}
console.log(fun2(1,2))//3
箭头函数
let fun3=(num1,num2)=>{
return num1+num2
}
console.log(fun3(1,1))//2
区别
基本数据类型存储在栈中
引用数据类型存储在堆中
当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值
基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问
var a = 10;
var b = a;
b = 20;
console.log(a); // 10
console.log(b); // 20
引用类型是存放在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存。
引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "我有名字了";
console.log(obj1.name); // 我有名字了
说明这两个引用数据类型指向了同一个堆内存对象。obj1赋值给obj2,实际上这个堆内存对象在栈内存的引用地址复制了一份给了obj2,但是实际上他们共同指向了同一个堆内存对象,所以修改obj2其实就是修改那个对象,所以通过obj1访问也能访问的到。