JS数据类型
常用的数据类型:
Boolean、String、Number、Null、Undefined、Object
还有两种类型是ECMAScript新增的: BigInt、Symbol
Number
数值类型,也可以表达进制数。由于JS中只有一种数据类型
存在最大和最小值,通过 Number.MAX_VALUE 和 Number.MIN_VALUE可以得到。
特殊 Infinity、-Infinity、NaN的类型都是Number
MAX_VALUE: 1.7976931348623157e+308
MIN_VALUE: 5e-324
判断是否是 Number: 通过 isNaN (is not a number)来判断,是的话,返回false,不是返回true
String
字符串类型,常用特殊字符:
转义字符 \
换行字符: \n
制表符: \t
回车符: \r
退格符: \b
Undefined
当一个变量声明了,没有赋值,则输出undefined
var a;
console.log(a) // undefined
null
经常用来释放对象。将对象赋值为null,垃圾回收机制就会对改对象地址进行回收。 垃圾回收机制 只会主动回收栈内存的地址,但是对象是存在堆内存中的,所以不会被回收,因此想要回收对象的地址空间,需要将对象赋值给 null。
这里提示一下: undefined是由null衍生出来的,所以在对两者进行比较的时候,其值是相同的,但是内存地址不一样
console.log(undefined == null); // true
console.log(undefined === null); // false
注意:
console.log(typeof null === 'object') // true
这是由于JS中的值是这样定义的: {类型标签,值},对象的类型标签是 0,而null代表空指针,大多数平台下,null的值为 0x00, 因此他的标签类型是 0,typeof null返回的就是object
Boolean
布尔类型,用来判断 true和false
数据转换
转换为数字
-
parseInt() // 将其他类型转化为 整型数字,从左至右进行解析,如果遇到字符,则停止解析
console.log(parseInt('123hahah')); // 123 console.log(parseInt('123ha123')); // 123 console.log(parseInt('ha123')); // NaN
-
parseFloat() // 转化为浮点
-
Number() // 这个转换,要比 parseInt和parseFloat更加的严格。只要存在不能转化为数字的字符就直接NaN,同时会自动过滤字符串首尾的空格。
Number转化简单数据类型:
console.log(Number('123ha123')); // NaN console.log(Number(' 123 ')); // 123,空格锅炉 console.log(Number(' ')); // 0 console.log(Number(null)); // 0 console.log(Number(undefined)); // NaN console.log(Number(true)); // 1 console.log(Number(false)); // 1
Number转化复杂数据类型:
console.log(Number({name:'ly'})); // NaN console.log(Number([1,2,3])); // NaN console.log(Number([3])); // 3 var eating = function() { console.log("eating"); } console.log(Number(eating)); // NaN
大家可能会很疑惑 第三行, **console.log(Number([3])); **的值为什么是3,而不是NaN呢?
这是因为Number的转化规则三部曲:
1 将需要转化的对象进行 valueOf()操作,如果返回原始类型的值,就直接转化。
2 如果valueOf()返回的是对象,则对其进行 toString()操作。如果toString() 返回原始类型的值,就直接转化。
3 如果 toString()返回的是对象,则报错 Cannot convert object to primitive value
因此,对 Number([3])的操作,我们可以看成:
var arr = [3]; if (typeof arr.valueOf() === 'object') { console.log(Number(arr.toString()),"是对象") } else { console.log(Number(arr.valueOf()),"不是对象") } // 3 是对象
复杂数据类型通过Number转化的时候,都会返回自身,所以都会调用toString() 方法。值得注意的是 数组的toString()返回的是 以逗号分隔的字符串:
console.log(Number([3]); // 3,相当于 Number('3') console.log(Number([3,4]); // NaN,相当于 Number('3,4') console.log(Number([]); // 0,相当于 Number('')
对象的toString,则直接返回[object type],type表示类型,所以数组一般返回 [object, object]
var obj = { name:'18', } var obj1 = {} console.log(Number(obj)); // NaN,相当于Number('[object object]') console.log(Number(obj1)); /NaN
转换为String类型
-
直接在后面拼接 + ‘’,隐式转换
-
toString() 转换,但是 undefined和 null不具备该函数,调用会报错。参数有两个 第一个是需要转换的值,第二个是 转换成的进制,默认为十进制
-
String() 转换, 和Number相似
基本数据转换为String:
console.log(String(123)); // '123' console.log(String('123'));// '123' console.log(String(true));// 'true' console.log(String(false));// 'false' console.log(String(undefined));// 'undefined' console.log(String(null));// 'null'
复杂数据转换,和Number() 一样,需要经过三部曲,但是 String()三部曲的 toString()和indexOf()换了顺序
console.log(String({name:'ly'})); // [object Object] console.log(String([1,2,3])); // 1,2,3 console.log(String([1])); // 1 var eating = function() { console.log("eating"); } console.log(String(eating)); // function() { console.log("eating");
String() 三部曲:
1 将需要转化的对象进行 toString()操作,如果返回原始类型的值,就直接转化。
2 如果toString()返回的是对象,则对其进行 valueOf()操作。如果valueOf() 返回原始类型的值,就直接转化。
3 如果 valueOf()返回的是对象,则报错 Cannot convert object to primitive value
因此下面这两个语句是等价的嘞:
console.log(String({name: '1'})); //[object,object] console.log(String({name: '1'}.toString()));
转化为 Boolean()类型
只有当要转化的值下面几种的时候是false,其他时候都是true
‘’, 0, undefined, null, NaN
console.log(Boolean(undefined)); // false console.log(Boolean(null)); // false console.log(Boolean(0));// false console.log(Boolean(NaN));// false console.log(Boolean(''));// false console.log(Boolean(new Boolean(false))); //true
牢记只有上面几种情况下,为false,其他都会true,比如最后一种,就算我里面传的参数是 new Boolean(false),也会返回true
隐式转换
又称自动转换,一般出现由两种情况:
- 不同类型的数据互相运算时
- if判断语句中
- 一元运算符
自动转换为字符串
当和字符串进行相加的时候:
console.log('5' + 1); // '51'
console.log('5' + true); // '5true'
console.log('5' + false); // '5false'
console.log('5' + null); // '5null'
console.log('5' + undefined); // '5undefined'
console.log('5' + {}); // ' 5[object object]'
console.log('5' + {name:'ly'}); // '5[object object]'
console.log('5' + []); // '5'
console.log('5' + [1,2,3]); // '51,2,3'
console.log('5' + [1]);// '51'
console.log('5' + function() {}); // '5function(){}'
自动转换为数值
除了加法运算符(+
)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
console.log('5' * 2); // 10
console.log('5' - 2); // 3
console.log('5' / 2); // 2.5
console.log('5' % 2); // 1
console.log(true + 1); // 2
console.log(false - 1); // -1
console.log('5' * []); // 0
console.log('5' - [2,3]); // NaN
console.log(null - 1); // -1
console.log(undefined + 1); //NaN