浅谈js数据类型
数据类型分类
基本数据类型和对象数据类型
- 基本数据类型
undefined,null,string,boolean,number,symbol - 对象数据类型
array,function,date,regexp,error
可拥有对象方法和不可拥有对象方法
- 可拥有
string,boolean,number,symbol,object - 不可拥有
null,undefined
可变和不可变
- 可变
对象属性和数组值 - 不可变
null,undefined,布尔,数字,字符串。字符串看起来是可以修改的但实际调用字符串方法对字符串进行修改时并不会修改原始字符串而是返回一个修改后新的字符串。
有趣的数字
溢出
与其他语言一样,js的数字类型也有自己的取值返回,超出这个范围称为溢出。用infinity表示正无穷大,-infinity表示负无穷大
0 / 0 //NaN
3 / 0 //infinity
infinity +(-,*,/) 3 //infinity
infinity +(*) infinity //infinity
infinity -(/) infinity //NaN
下溢
当计算结果无比趋向0时,称为下溢。正方向趋向0返回0,负方向返回-0.
0 === -0 //true
NaN
表示非数字,与任何值都不相等包括其本身。可用isNaN()判断是否为NaN.
浮点数比较的问题
js浮点数的表示方法也是采用的大多数语言的二进制表示法(IEEE-754),因此会出现如下问题
.4 - .3 === .3 - .2 //false
.4 + .1 === .2 + .3 //true
null和undefined的关系和区别
都是对空值的描述,但null倾向于正常的,意料中的空值而undefined则倾向于是异常的,意料之外的空值。
null == undefined //true
null === undefined //false
typeof null //"object"
typeof undefined //"undefined"
null + '' //"null"
undefined + '' //"undefined"
null + 0 //0
undefined //NaN
类型转换
包装对象
数值,字符串,布尔值都是非对象类型但看上去却具有对象所具有的属性和方法。以字符串为例,当调用字符串的toStirng()方法时字符串会调用new String()创造一个临时对象,该对象继承了字符串的原型方法,然后调用该临时对象的toString()方法。一旦调用结束,该临时变量会自动销毁。(实际并不一定创建和销毁这个临时变量,但整个过程看上去就是这样的)
隐式类型转换
使用运算符会导致数据类型的隐式转换
1 + '' //'1'
'3' * '7' //21
'a' * 1 //NaN
NaN + '233' //"NaN233"
一些特殊值的类型转换
值传递和引用传递
对象都是引用传递(地址),因此对象只和自身相等,而基本类型都是值传递。
//a重新赋值后指向了新的地址,因此与b脱离了关系,b指向a的原地址的值并没有发生变化
let a = [1,2,3];
b = a;
a = [4,5,6];
console.log(b); //[1,2,3]
//不改变指向
let a = [1,2,3];
b = a;
a.pop();
console.log(b); //[1,2]
对象实现深拷贝
let a = {x:'x',y:'y'},b = {};
for (item in a){
b[item] = a[item];
}
判断类型的方法
typeof
typeof '1' //"string"
typeof 1 //"number"
typeof Symbol('id') //"symbol"
typeof true //"boolean"
typeof null //"object"
typeof undefined //"undefined"
typeof [] //"object"
instanceof
'1' instanceof String //false
1 instanceof Number //false
Symbol('id') instanceof Symbol //false
null instanceof Object //false
undefined instanceof undefined //抛出异常
true instanceof Boolean //false
[] instanceof Array //true
Object.prototype.toString.call()
Object.prototype.toString.call('1') //"[object String]"
Object.prototype.toString.call(1) //"[object Number]"
Object.prototype.toString.call(Symbol('id')) //"[object Symbol]"
Object.prototype.toString.call(true) //"[object Boolean]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call([]) //"[object Array]"