NaN
NaN 属于 number 类型,和任何值,包括自己都不相等
isNaN
检测一个值是否为有效数字。如果不是有效数字返回 true,是有效数字返回 false
isNaN("10"); //false
如果不是数字类型,会用number()
方法转换
把其他类型转换为数字类型
Number("12.5"); //12.5
Number("12.5px"); //NaN
Number(""); //0
Number(" "); //0
Number(true); //1
Number(false); //0
Number(null); //0
Number(undefined); //NaN
// 引用类型转换为数字,先基于toString()方法转换为字符串,然后再转换为数字
Number({}); //NaN
Number([]); //0
Number([12]); //12
Number([12, 13]); //NaN
//toString
{}.toString() // '[object object]'
[].toString() // ''
[12].toString() // '12'
[12,13].toString() // '12,13'
特别需要注意的是
- Number(""); // 0
- Number(" "); // 0
- Number(null); // 0
- Number("12.5px"); // NaN
- Number(undefined); // NaN
- Number({}); // NaN
- Number([]); // 0
- [].toString() // ''
把其他类型转换为字符串
toString()
-
数组
[1,2].toString() // '1,2' [].toString() // '' 这个是要注意的
-
对象
{}.toString() // '[object object]'
-
NaN
NaN.toString() // 'NaN'
-
null和undefined
null和undefined没有这个方法
字符串拼接
"10px" - 10; //NaN
10 + null + true + [] + null; //'11null'
false
- 0
- false
- null
- undefined
- NaN
' '
有空格的字符串是true
null 和 undefined
var a = null;
在栈内存中的值存储空间,什么都不做。只是在变量存储空间存了一个变量 a。
var a = undefined;
在栈内存中的变量存储空间存了一个变量 a,在值存储空间区域,开了一块内存,但是里面什么都没存
堆栈内存
浏览器执行 js 代码,从电脑内存中分配出一块内存,用来执行代码,这块内存就是栈内存。 在栈内存中,有一个变量存储空间,有一个值存储空间,还有一个主线程空间。
变量存储空间用来存储变量, 值存储空间用来存储基本数据类型和引用数据类型的地址。
主线程用来执行代码,遵循先进先出的原则, 第一行代码进栈执行,执行完出栈,接着第二行代码进栈执行。
var a = 2;
var b = a;
a = 3;
- 创建变量 a,放到当前栈内存变量存储空间中
- 创建值 2,存储到当前栈内存值存储空间中
- =赋值,让变量和值相互关联
- 创建变量 b,也和 a 一样指向 2
- 创建一个新值 3,存储到当前栈内存值存储空间中,a 指向新值
var a = {
name: "djh",
};
var b = a;
b.name = "ddd";
- 创建变量 a,放到当前栈内存变量存储空间中
- 在内存中新开辟一块内存(堆内存),用来存储引用类型值
- 在值存储空间中存放堆内存地址
- 变量 a 指向堆内存地址(关联)
- 创建变量 b,也和 a 一样指向那块堆内存地址
var a = { n: 1 };
var b = a;
a.x = x = { n: 2 };
console.log(a.x);
console.log(b);
引用数据类型,都是地址存在栈内存的值存储空间,真正的内容存在堆内存中
函数比较特别
函数存在堆内存中的是字符串,真正执行函数的时候,才会去栈内存中新开辟一块内存,遵循先进先出的原则执行