欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深入理解JavaScript数据类型(全网最全)

程序员文章站 2022-06-04 21:59:19
...

1. number数字类型

NaN: not a number 但是它是数字类型
isNaN:检测是否为有效的数字

来分析一段代码:

	isNaN(12); => false
	isNaN('12'); => false
	isNaN('很好'); => true
	isNaN(true); => false
	isNaN(null); =>false
	isNaN(undefined); => true
	isNaN({age: 9}); => true
	isNaN([12, 23]); => true
	isNaN([12]); =>false
	isNaN(/^$/); => true
	isNaN(function(){}); => true	

首先分析isNaN检测的机制

  1. 首先验证当前值是否为数字类型,否则默认转为数字类型,使用Number这个方法来转换
    【字符串转数字】
    Number(‘13’) -> 13
    Number(‘12px’) -> NaN 出现任意一个非数字的时候
    Number(’’) -> 0
    【布尔转数字】
    Number(true) -> 1
    Number(false) -> 0
    【其它】
    Number(null) -> 0
    Number(undefined) -> NaN
    -注:将引用数据类型值转换为数字: 先把引用值调取toString()转换为字符串,然后调Number
    【对象】
    ({}).toString() -> ‘[object Object]’ ->NaN
    数组对象:
    [12, 23].toString() -> ‘12, 23’ -> NaN
    [12].toString() -> ‘12’ -> 12
    [].toString() -> ‘’ 所以 isNaN([]): false
  2. 已经为数字类型,是有效数字返回false,不是返回true(数字类型中只有NaN不是有效数字,其他都是)

2.NaN

NaN == NaNfalse //NaN和谁都不相等,包括它自己 

测试代码:

if(Number(num) == NaN) {
	alert('num不是有效的数字');
}
//if条件永远为false 不可行
if(isNaN(num)) {
	alert('num不是有效的数字');
}

3.布尔类型

为false只有五个值

  • null
  • undefined
  • ‘’(空字符串)
  • 0
  • NaN

其余都是true

4.null && undefined

代表空或者没有

  • null: 空对象指针
  • undefined: 未定义

5. typeof

在JS中用来检测数据类型的方式之一。除了它以外,还有:

  • instanceof
  • constructor
  • Object.prototype.toString().call()
    返回值:使用typeof检测出来的结果是一个字符串,字符串中包含着对应的数据类型,如“number”/“string”/“boolean”/“undefined”/“object”/“function”
    typeof NaN => “number”
    typeof null => "object" 因为null代表空对象指针,没有指向任何的内存空间
    typeof检测数组/正则/对象, 最后返回的都是"object"

6. 把其它类型值转换为字符串

1.发生的情况

  • 基于alert / confirm / prompt / document.write等方法输出内容的时候,会把输出的值转换为字符串,然后输出
alert(1) => '1'
  • 基于“+”进行字符串拼接
  • 把引用类型值转换为数字时,首先会转换为字符串
  • 给对象设置属性名,如果不是字符串,首先转换为字符串,然后再当做属性存储到对象中(对象的属性只能是数字或字符串)
  • 手动调用toString/toFixed/join

2.转换规律
【除了对象,都是直接加引号】
【一切对象,变成‘[object Object]’】

7.特殊情况

1 + true => 2 //数学运算
'1' + true  => '1true' //字符串拼接

[12]+10 => '1210' // 引用类型转换为数字 首先会转换为字符串 因此变成字符串拼接
[] + 10 => '10'// [] => "" 变成字符串拼接

({}) + 10 => "[object Object]10"
/*高能预警*/
{} + 10 => 10 //它根本就不是数学运算,也不是字符串拼接,它是两部分代码:{}是代码块,+10才是我们的操作
{} + [] => 0 // +[]转换为0
{} + {} =>"[object Object][object Object]" //两个对象相加,首先转换为字符串,于是发生字符串拼接
/* == 辨析 */
对象==对象: 不一定相等,因为对象操作的是引用地址
	{name: 'xxx'} == {name: 'xxx'} // false	
	[] == [] //false
对象==数字: 把对象转换为数字
对象==布尔: 把对象转换为数字,把布尔也转换为数字
对象==字符串:把对象转换为数字,把字符串也转换为数字
字符串==数字:字符串转换为数字
字符串==布尔:都转换为数字
========================>不同情况的比较都是转换为数字再比较
null == undefined : true
null === undefined: false
null && undefined 和其他值都不相等

[] == false//都变成数字 0==0, true
![] == false //先算![], 把数组转换为布尔取反,即!Boolean([]),false, false == false 结果是true
[] == true //都变成数字 0==1, false

结尾再来个彩蛋吧:):

12 + true + false + null + undefined +[] + '嗨' + null + undefined + [] + true 输出啥?
...思考一下:
"NaN嗨nullundefinedtrue"