深入理解JavaScript数据类型

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"

猜你喜欢

转载自blog.csdn.net/weixin_42098339/article/details/89463327