JavaScript几种类型的值
- 基本数据类型:undefined、null、Boolean、number、string、symbol(ES6新增表示独一无二的值)
- 引用数据类型: object、 array、 function
基本数据类型的特点:
- 基本数据类型的值是不可改变的
- 原始数据类型存储在栈中的简单数据段,占据空间小、大小固定、属于被频繁使用的数据,所以存放在栈中
引用数据类型的特点:
- 值是可变的,拥有属性和方法,并且是可以动态改变的
- 同时保存在栈内存和堆内存中,引用数据类型在栈中存储了指针,该指针指向堆中该实体的其实地址,当解释器寻找引用值时,会首先查找在栈中的地址,取得地址后从堆中获得实体。
检验数据类型
- typeof
- 返回一个表示数据类型的字符串,包括: number、boolean、string、symbol、object、undefined、function,但不能判断null、array, 数组和对象都会返回object
2.instanceof
- 表达式 A instanceof B 如果A是B的实例,则返回true,否则false,instanceof运算符用来测试一个对象在其原型链中是否存在一个构造函数prototype属性
- 关于数组的类型判断, 还可以使用ES6新增Array.isArray()
- 弊端:
- 对于基本数据类型来说,字面量方式创建出来的结果和是方式创建出来的还是有一定的区别的
- 只要在当前实例的原型链上,我们检测出来的结果是true,在类的原型继承中,我们最后检测出来的额结果未必准确
- 不能检测 null 和 undefined: 浏览器不允许我们在外面访问这两个类型
3.constructor
- 可以检测基本的数据类型
- 两大弊端:
- null 和 undefined是无效对象,因此不会有constructor存在,
- 函数的constructor是不稳定的,主要体现在把类的原型重写,在重写的过程中很可能出现吧原来的constructor覆盖,这样检测出来的结果是不准确的
4.Object.prototype.toString.call()
- Object.prototype.toString.call() 最准确最常用的方式。首先获取Object原型上的toString方法,让方法执行,让toString方法中的this指向第一个参数的值
- toString补充:
- 本意是转换字符串,但是某些toString方法不仅仅是转换为字符串
- 对于Number、 string、 Boolean、 array、 RegExp、 Date、 Function原型上的toString方法都是把当前的数据类型转换为字符串的类型
- Object上的toString并不是用来转换为字符串的
数据类型转换
- 其他类型转换String
- toString() 方法 :强制类型转换 不会影响到原变量,它会将转换的结果返回, null和undefined没有toString,如果调用会报错
- String() 函数:强制类型转换 对于null 来说转成 "null", "undefined"
- 其他类型转换Number
- 使用Number()函数:
- 字符串转数字:
- 如果是纯数字的字符串,直接转化为数字
- 如果里面有非数字的内容,直接转换为NaN
- 如果是空的字符串或者是一个全是空格的字符串,则转换为0
- 布尔值转数字: true转成1,false转成0
- undefined转成数字: NaN
- Null转数字: 转成0
- Number() 接收数值作为参数,此时它能识别负的十六进制,也能识别0开头的八进制,返回值永远是十进制
- Number方法参数是对象时,将返回NaN,除非是包含单个数值的数组
- 字符串转数字:
- parseInt() & parseFloat()
- 专门用来对付字符串,parseInt() 一个字符串转换为一个整数,可以将一个字符串有效的整数内容取出来,然后转换为Number。parseFloat() 把一个字符串转换为浮点数。
- parseInt()在没有第二个参数时默认以十进制转换数值,有第二个参数时,以参数为基数转换数值,如果基数有误返回NaN
- 区别: Number函数将字符串转为数值,要比parseInt函数严格很多,
- 使用Number()函数:
其他类型转换成Boolean
只有空字符串("")、null、undefined、+0、-0、和NaN转为布尔类型false,其它都是true,其他都是true,空数组,空对象转换为布尔类型也是true,甚至连false对应的布尔对象new Boolean(false)也是true
自动转换数值
- 算数运算符(+ - * /)跟非Number类型的值进行运算时,会将这些值转换为Number,然后在运算,除了字符串的加法运算
- 一元运算符也会把运算子转换成数值
自动转换为字符串
- 字符串自动转换,主要发生在自渡船的加法运算时,当一个值为字符串,另一个值为非字符串,后者转为字符串