本文是深入淺出 ahooks 源碼系列文章的第八篇,該系列已整理成文檔-地址。覺得還不錯,給個 star 支持一下哈,Thanks。 本篇文章算是該系列的一個彩蛋篇,記錄一下第一次給開源項目提 PR 的過程(之前好像也有過,不過那個非常小的一個改動),希望能夠幫助更多的人參與到開源項目中來。 起因 ...
變數
變數聲明的幾種方式
var
let
const
相同之處
-
var
let
const
都可以用來聲明一個變數 -
都擁有函數作用域與全局作用域
不同之處
-
var
聲明的變數有變數提升
而let
和const
聲明的變數不會存在這個問題 -
var
沒有塊級作用域,let
、const
聲明的變數具有塊級作用域
塊級作用域:
if(true){
let name = 'let聲明的變數';
const enums = 'const聲明的變數'
}
var
聲明的變數是可以被重覆定義的,let
聲明的變數在同一個作用域中是 不可以重覆聲明, 但是可以重覆修改,const聲明的是一個常量,在規範上是不可以被重覆定義重覆修改的,但是當其變數的值為引用數據類型時,她所指向到堆
中的值是可以被重覆修改的,如果要對一個值進行修改,建議使用let聲明變數。
作用域
js中作用域分為: 全局作用域
函數作用域
塊級作用域
作用域鏈
尋找當前變數一直從當前作用域尋找至全局作用域形成的鏈被稱為作用域鏈
數據類型
基礎數據類型[值全部存儲在棧中]
- Number --- 數值
- String --- 字元串
- Boolean --- 布爾值
- Symbol --- 唯一值
- BigInt ---超出安全數值的值
- Undefined --- 未定義的值
- Null --- 未初始化的值
引用數據類型[引用數據類型存在堆中,鍵值存在棧中]
- Object --- 對象
- Array --- 數組
類型判斷
基本數據類型
- 基本數據類型可以通過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
- Object.prototype.toString.call(xxx).slice(8,-1) //返回檢測到的數據類型
- str.proto === String.prototype
引用數據類型
引用數據類型可以判斷原型是否相等
手寫類型判斷
function getType(type) {
if (typeof type === 'object') return Object.prototype.toString.call(type).slice(8, -1)
return typeof type
}