我不知道的Javascript

只抽一支烟發表於2024-11-05

Javascript 資料型別

基本資料型別(存放在棧記憶體中, 當被引用和複製時會複製一個完全相等的變數)

  • Number, String, Boolean, Symbol, Undefined, Null

引用資料型別(物件型別, 存放在堆記憶體中, 儲存的是地址, 當引用和複製時,提供的是地址. 有共享地址的特徵)

  • Object
    • Array
    • RegExp
    • Date
    • Math
    • Function
  const a = {
    name: "q"
 }
const b = a;
b.name = "b";
console.log(a);// { name: "b" }, 體現了共享引用地址的特點

判斷資料型別的方法

typeof

typeof 123; // "number"
typeof "123"; // "string"
typeof ""; // "string"
typeof true; // "boolean"
typeof function(){}; // "function"
typeof Undefined; // "undefined"
typeof null; // "object ", 可以使用=== 來判斷 
typeof []; // "object"

instanceof, 判斷new 出來的複雜資料型別可以, 判斷基本資料型別會有誤

"123" instanceof String; // false, 判斷不出來
const a = new String('123');
a instanceof String; // true

Object.prototype.toString.call(xx).slice(8, -1)

這個方法應該是很全的了,工作中建議使用此方法判斷資料型別

Object.prototype.toString.call("123"); // ['object, Object']
Object.prototype.toString.call("123").slice(8, -1); // 'Object'
function testFunc() {
  console.log(123);
}
const r = Object.prototype.toString.call(testFunc).slice(8, -1);
console.log(r); // "Function"

手寫一個實現

function getType(obj) {
  const type = typeof obj;
  if (type !== "object") return type;
  return Object.prototype.toString.call(obj).slice(8, -1);
}

總結

  • typeof 可以判斷基本資料型別(null除外),但是在判斷引用資料型別中,除了function其他的也無法判斷
  • instanceof 可以判斷複雜的引用資料型別, 但是不能正確判斷基礎資料型別

相關文章