基本数据类型和引入数据类型

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;
  1. 创建变量 a,放到当前栈内存变量存储空间
  2. 创建值 2,存储到当前栈内存值存储空间
  3. =赋值,让变量和值相互关联
  4. 创建变量 b,也和 a 一样指向 2
  5. 创建一个新值 3,存储到当前栈内存值存储空间中,a 指向新值
var a = {
    name: "djh",
};
var b = a;
b.name = "ddd";
  1. 创建变量 a,放到当前栈内存变量存储空间
  2. 内存中新开辟一块内存(堆内存),用来存储引用类型值
  3. 值存储空间中存放堆内存地址
  4. 变量 a 指向堆内存地址(关联)
  5. 创建变量 b,也和 a 一样指向那块堆内存地址
var a = { n: 1 };
var b = a;
a.x = x = { n: 2 };
console.log(a.x);
console.log(b);

引用数据类型,都是地址存在栈内存的值存储空间,真正的内容存在堆内存中
函数比较特别
函数存在堆内存中的是字符串,真正执行函数的时候,才会去栈内存新开辟一块内存,遵循先进先出的原则执行

posted @ 2020-11-09 20:18  飞行者二鸭  阅读(104)  评论(0编辑  收藏  举报