js是一种弱类型语言,即创建变量时不需要进行类型声明,并可以随意更改某个变量的数据类型
基本类型与引用类型
js有六种基本数据类型:number、boolean、string、undefined、null、symbol(ES6新增)和一种引用数据类型object,其子类是Array、Function
值的存储
基本数据类型的值存在栈中,是按值访问的,可以操作保存在变量中的实际的值。引用数据类型的值存在堆中,是按引用访问的。需要创建一个变量(存在栈中)保存指向对象的地址。所以操作对象实际上是通过变量操作保存在变量中的对象的引用。(因为js不允许直接访问内存中的位置)。
值的复制
基本数据类型:把一个变量复制给另一个变量时,会在栈中创建一个新值,然后把值赋给新变量,复制之后的两个变量是完全独立的两个变量上,互不干涉。
引用数据类型:复制的是存在栈中的地址,两个不同的变量指向的对象是同一个,改变一个,另一个也会受到影响。
Number(数值类型)
js采用的是 IEEE 754 定义的 64 位双精度浮点型来表示数字,用这种格式进行浮点数的运算会有问题,比如0.1+0.2不等于0.3
Number类型包括整数和浮点数。浮点数数值必须包含一个小数点,且小数点后至少有一位数字)。
不同进制的表示方法
二进制(0b开头),八进制(0开头),十进制,十六进制(0x开头)
- 在ECMAScript 5 严格模式下禁止使用八进制语法,会被视为十进制
- 在ECMAScript 6中使用八进制数字是需要给一个数字添加前缀"0o"
八进制表示错误时会忽略前缀0转为10进制。
var num = 093//八进制表示错误,前缀0被忽略,解析为93
var num=0b2//报错
不同进制的转换
主要用到两个方法toString()、parseInt()
toString(radix):将number转化为指定进制的string,默认十进制
parseInt(string,radix)radix表示被解析的值的进制,返回对应的十进制数
- 不写第二个参数默认十进制
- 如果字符串头部有空格,空格会被自动去除。
- 转换是一个个字符依次转换,在遇到不能解析的字符时就返回已经解析的部分,如果第一个字符就不能解析,就直接返回NaN。
- 第一个参数为非字符串,会先调用该参数的toString()方法转换为字符串
parseInt("10");//10
parseInt('11',2)//3
parseInt('12',8)//10 8+2=10
parseInt('15',4)//1 4进制的错误表示,5不能解析,只返回1
parseInt(' 21') // 21
parseInt('015') // 15
parseInt(015)//13,先调用toString(),以0开头的解析为8进制数,转为十进制'13'
NaN
- 任何涉及NaN的操作,都会返回NaN,
- NaN与任何值都不相等,包括NaN本身。
- 可以通过isNaN()方法来判断某个数值是否是NaN这个特殊的数。
Boolean
Boolean类型只有两个值:true、false。
true不一定就是1,false也不一定就是0。
不同类型的数据对应的boolean值
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | “”(空字符串) |
Number | 非零值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | Undefined |
Null与Undefined
null值表示一个空对象指针。undefined表示变量尚未赋值
一般变量声明后没有准备赋值,不需要手动赋值undefined,因为编译器会自动为其赋这个值,而如果定义的变量准备用来保存对象,那么要手动将该变量初始化为null
console.log(undefined == null);//true
console.log(undefined === null);//false
typeof运算符
用来确定一个值到底是什么类型,返回一个用来表示表达式的数据类型的字符串
var fn = function(){
}
typeof fn//function*
var arr = []
typeof arr//object
var obj = {}
typeof arr//object
//特殊情况
typeof null //'object'
typeof fn//'function'
在使用 typeof 运算符判断对象的类型会产生问题,无论什么类型的对象,它都返回 “object”(除了function)。这就需要用到instanceof运算符。
Instanceof用于检测引用类型,检测某个对象是不是另一个对象的实例。
用法: object instanceof constructor
arr instanceof Array //true
arr instanceof Object//true