javascript数据类型
- 空(Null)
- 未定义(Undefined)
- 数字(Number)
- 字符串(String)
- 布尔值(Boolean)
- 符号(Symbol)
- 对象(Object)
以上前六种为基本数据类型,最后一种为引用数据类型
基础数据类型和引用数据类型的区别
- 基础类型的数据在被引用或拷贝时是值传递,也就是说会创建一个完全相等的变量。
- 引用类型只是创建一个指针指向原有的变量,实际上两个变量是“共享”这个数据的,并没有重新创建一个新的数据
Undefined
只有一个值undefined
可以得到undefined的情况:
- 引用已声明但未初始化的变量
var a; //undefined
- 引用未定义的对象属性
var b = {}; //undefined
- 执行无返回值函数
(()=>{})() //undefined
- 执行void表达式
void 0 //undefined 此方法可以结合三木运算符使用,代表不执行任何操作
- 全局常量window.undefined 或 undefined
window.undefined //undefined
如何判断一个变量的值是否为undefined?
- 通过typeof关键字获取变量x的类型,然后与“undefined”字符串做真值比较。
Null
只有唯一的一个值null,都可以表示空值。
甚至我们通过“==”,来比较他们是否相等的时候结果得到的都是true。
null是JavaScript保留关键字;undefined 只是一个常量;
Boolean
Boolean数据类型有两个值:true和false
注意:不要将各种表达式和变量转换为Boolean数据类型当做判断条件
Number
- NaN(Not a Number)通常在计算失败的时候会得到该值。要判断一个变量是否为NaN则可以通过Number.isNaN函数进行判断。
- Infinity是无穷大,加上负号“-”会变成无穷小
使用场景:通过数值来表示权重或者优先级;Infinity可以表示最高优先级或最大权重。
进制转换的方法?
//进制数转换失败返回NaN
['0','1','2'].map(parseInt) //[0,NaN,NaN]
//10进制转换为其他进制
(10).toString(2) //"1010"
数值类型的数据可能会遇到精度问题
//比如在进行浮点数运算时
0.1+0.2 //0.30000000000000004
//解决办法,舍弃末位小数
parseFloat((0.1+0.2).toPrecision(12)) //0.3
String
aa
Symbol
是ES6中引入的一个新的数据类型,它表示一个唯一的常量。
aaa
Object
- 简单的说,Object类型数据就是键值对的集合
键是一个字符串(或者Symbol),值可以是任意类型的值 - 复杂的说,Object又包括很多子类型,比如Date,Array、Set、RegExp。
深拷贝和浅拷贝的区别?
- 由于引用类型在赋值时只传递指针,这种拷贝方式称为浅拷贝
- 而创建一个新的与之相同的引用类型数据的过程称之为深拷贝
通过等号=赋值只是浅拷贝,要实现真正的拷贝操作则需要通过遍历键来赋值对应的值;这个过程中如果遇到Object类型还需要再次进行遍历。
把已添加的对象记录下来,这样下次碰到相同的对象引用时,直接指向记录中的对象即可,要实现这个记录功能。可以借助ES6新推出的Weak’Map对象,该对象是一组键/值对的集合,其中键是弱引用的,其键必须是对象,而值可以是任意的。
关于类型转换
什么是类型转换?JavaScript这种弱类型的而语言,相对于其他高级语言的一个特点。那就是在处理不同数据类型运算或逻辑操作时,会强制转换成同一数据类型。