Skip to content

js数据类型

数据类型种类

TIP

JS 中有8种数据类型

  • 七种基本数据类型 Boolean Null Undefined Number String Symbol bigInt
  • 一种引用类型 object {} [] /^$/ new Date() Math function

typeof关键字

  • typeof 返回的都是字符串
js
typeof a // undefined
typeof 1 // number
typeof NaN // number
typeof "zhufeng"; // string
typeof true; // boolean
typeof Symbol("a"); // symbol
typeof function () {}; //function
typeof [1, 2, 3]; //object
typeof { name: "zhufeng" }; //object
typeof new Number(1); //object
typeof null; //object

typeof null 等于object,为什么不修复?

  • javascript 在设计之初的遗留问题
  • 因为目前很多程序、 js 库都有这个逻辑判断、修复后会给程序带来很多问题

null 和 undefined 区别?

  • null 和 undefined 都代表空,主要区别在于 undefined 表示尚未初始化的变量的值,而 null 表示该变量指向空地址
  • 在加法操作时,隐式类型转换不同,null会转换成0 undefined会转换成NaN
js
var a 
console.log(a);// undefined
var b = null

console.log(+undefined) // NaN
console.log(+null) // 0

引用类型

  • 引用类型是指向一个内存地址

WARNING

如果有赋值关系,当其中一个属性发生变化,会影响其他的值

js
let a = {username:'hulei'};
let b = a;
b.age = 20
console.log(b) // {username:'hulei',age:20}

引用类型

内存区域

  • 程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做 stack(栈),另一种叫做 heap(堆)

    • 1、stack(栈)是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小
    • 2、 heap(堆)是没有结构的,数据可以任意存放。因此,stack 的寻址速度要快于 heap
  • 基本数据类型,一般都存放在 stack 里面,对象引用类型 一般都存放在 heap 里面

var&let&const

  • var 定义的变量没有块的概念,可以跨块访问,不能跨函数访问,有变量提升,可重复声明
  • letconst 定义的变量,只能在块作用域里访问不能跨块访问也不能跨函数访问不存在变量提升不可以重复声明,如果有重复变量 let 会在编译阶段报错
  • letconst 不会挂载到window属性上,var会
js
// ES5问题?
// 在if或者for循环中声明的变量会变成全局变量
for (var i = 0; i <= 5; i++) {
  console.log("hello");
}
console.log(i); //5

暂时性死区

  • 从一个代码块的开始直到代码执行到声明变量的行之前,let 或const 声明的变量都处于暂时性死区(Temporal dead zone,TDZ)中
  • 当变量处于暂时性死区之中时,其尚未被初始化,尝试访问变量将抛出 ReferenceError。当代码执行到声明变量所在的行时,变量被初始化为一个值。如果声明中未指定初始值,则变量将被初始化为 undefined
  • var声明的变量不同,如果在声明前访问了变量,交量将会返回 undefined 。
js
console.log(a) // undefined
var a;

// Uncaught ReferenceError: b is not defined
console.log(b) // 暂时性死区(Temporal dead zone,TDZ)中
let b;