变量

变量声明的几种方式

var let const

相同之处

  1. var let const 都可以用来声明一个变量

  2. 都拥有函数作用域与全局作用域

不同之处

  1. var声明的变量有变量提升
    letconst声明的变量不会存在这个问题

  2. var没有块级作用域, letconst 声明的变量具有块级作用域

块级作用域:

if(true){
let name = 'let声明的变量';
const enums = 'const声明的变量'
}
  1. var 声明的变量是可以被重复定义的,let声明的变量在同一个作用域中是 不可以重复声明, 但是可以重复修改,const声明的是一个常量,在规范上是不可以被重复定义重复修改的,但是当其变量的值为引用数据类型时,她所指向到堆
    中的值是可以被重复修改的,如果要对一个值进行修改,建议使用let声明变量。

作用域

js中作用域分为: 全局作用域 函数作用域 块级作用域

作用域链

寻找当前变量一直从当前作用域寻找至全局作用域形成的链被称为作用域链

数据类型

基础数据类型[值全部存储在栈中]

  • Number — 数值
  • String — 字符串
  • Boolean — 布尔值
  • Symbol — 唯一值
  • BigInt —超出安全数值的值
  • Undefined — 未定义的值
  • Null — 未初始化的值

引用数据类型[引用数据类型存在堆中,键值存在栈中]

  • Object — 对象
  • Array — 数组

类型判断

基本数据类型

  1. 基本数据类型可以通过typeof 来进行判断是哪种基本数据类型
const str = '字符串' //string
const num = 123 //Number
const Boolean = true //Boolean
const nul = null //Object
const a = undefined //undefined
const bigInt = BigInt(123n) //BigInt
const sybmol = Symbol('asd') //Symbol
  1. Object.prototype.toString.call(xxx).slice(8,-1) //返回检测到的数据类型
  2. str.proto === String.prototype

引用数据类型

引用数据类型可以判断原型是否相等

手写类型判断

function getType(type) {
if (typeof type === 'object') return Object.prototype.toString.call(type).slice(8, -1)
return typeof type
}