js数据类型
七大类型
js一共有七个数据类型,在谷歌67版本中还出现了一种 bigInt。是指安全存储、操作大整数。但是大部分人都不把这个当作一个类型
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):文本(比如’Hello World’)。
- 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null:表示空值,即此处的值为空 。
- 对象(object):各种值组成的集合,对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
- symbol (symbol ) : 唯一标识符
数值,字符串,布尔值这三种类型合称为原始类型(primitive type)的值,既是他们最基本的数据类型,不可再细分。
对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
至于undefined和null,一般将它们看成两个特殊值。
基础类型&引用类型
基础类型存储在栈内存中
Undefined、Null、Boolean、Number、String和symbol
引用数据类型在栈堆中
类型判断
JavaScript 有三种方法,可以确定一个值到底是什么类型。
typeof
运算符instanceof
运算符Object.prototype.toString
方法
typeof
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
typeof undefined //"undefined"
typeof null // "object"
instanceofinstanceof
运算符用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。
使用typeof
对[]
和 {}
都会返回object
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
显然采用typeof
判断对象类型不太合适,采用instanceof
会好一点,instanceof
只用用于对象的判断,基元类型使用instanceof
返回false
var a = 123
var b = '123'
var c = [1,2,3]
var d = {a:1}
var e = new String('e')
a instanceof Number // false
b instanceof String // false
c instanceof Array // true
d instanceof Object // true
e instanceof String // true
Object.prototype.toString
可以通过 toString()
来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString()
来检测,需要以 Function.prototype.call()
或者 Function.prototype.apply()
的形式来调用,传递要检查的对象作为第一个参数,称为 thisArg
。
console.log(Object.prototype.toString.call([])) // [object Array]
console.log(Object.prototype.toString.call({})) // [object Object]
console.log(Object.prototype.toString.call(true))// [object Boolean]
console.log(Object.prototype.toString.call(null))// [object Null]
console.log(Object.prototype.toString.call(undefined))// [object Undefined]
console.log(Object.prototype.toString.call('11'))// [object String]
console.log(Object.prototype.toString.call(11))// [object Number]
console.log(Object.prototype.toString.call(function () { }))// [object Function]
isNaNisNaN
方法可以用来判断值是否为NaN
,且只对数值有效,如果输入其他值,会被先转成数值。
列子:
isNaN('Hello') // true
// 相当于
isNaN(Number('Hello')) // true
传入字符串的时候,字符串会被先转成NaN
,所以最后返回true
,这一点要特别引起注意。也就是说,isNaN
为true
的值,有可能不是NaN
,而是一个字符串。
isNaN({}) // true
// 等同于
isNaN(Number({})) // true
isNaN(['xzy']) // true
// 等同于
isNaN(Number(['xzy'])) // true
出于同样的原因,对于对象和数组,isNaN
也返回true
。
但是对于空数组和只有一个数值成员的数组,isNaN
返回false
,因为这些数组能被Number
函数转成数值。
isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false
因此,使用isNaN
之前,最好判断一下数据类型。
function myIsNaN(value) {
return typeof value === 'number' && isNaN(value);
}
判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断。
function myIsNaN(value) {
return value !== value;
}
isFiniteisFinite
方法返回一个布尔值,表示某个值是否为正常的数值。
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true
除了Infinity
、-Infinity
、NaN
和undefined
这几个值会返回false
,isFinite
对于其他的数值都会返回true
。
数据类型转换
转换成字符串类型
- toString()
var num = 5; console.log(num.toString());
- String()
String(123) // String()函数存在的意义:有些值没有toString(),这个时候可以使用String()。比如:undefined和null
- 拼接字符串方式
当 + 两边一个操作符是字符串类型,一个操作符是其它类型的时候,会先把其它类型转换成字符串再进行字符串拼接,返回字符串num + ""
转换成数值类型
- Number(Obj)
Number()可以把任意值转换成数值,如果要转换的字符串中有一个不是数值的字符,返回NaN - parseInt(string,radix)
var num1 = parseInt("12.3abc"); // 返回12,如果第一个字符是数字会解析知道遇到非数字结束 var num2 = parseInt("abc123"); // 返回NaN,如果第一个字符不是数字或者符号就返回NaN
+
,-
,-0
等运算var str = '500'; console.log(+str); // 取正 console.log(-str); // 取负 console.log(str - 0); // 500
转换成布尔类型
- Boolean()
- !!
''
(空字符串)null
undefined
NaN
0
会转换成false
其它都会转换成true