js基礎-類型判斷

類型判斷

數據類型應該算得上是 js 的基礎第一課。在平常的開發中會遇到不少類型判斷和類型轉換的場景。markdown

數據類型

js中的數據類型分爲基本類型和引用類型:函數

  • 基本類型 Number、Boolean、undefined、null、BigInt、String、Symbol
  • 引用類型 Object、Function、Array、RegExp、Date

基本類型和引用類型的不一樣

基本類型的值是不可變的,引用類型的值是可變的。 在複製時:基本類型複製的是值,引用類型複製的是引用。 在比較時:基本類型只用比較值,引用類型須要同時比較引用地址和值。ui

數據存儲

在 js 中基本類型存儲在棧內存中,引用類型存儲在堆內存中。這是由於棧的存取速度至關快,僅次於 cpu 中寄存器的存取速度。spa

類型判斷

typeof - 基本類型的判斷方法

typeof "s"; // "string"
typeof { x: 1 }; // "object"
typeof [1, 2, 3]; // "object"
複製代碼

tips: 關於 typeof 的一個歷史 bugprototype

typeof null; // 'object'
複製代碼

typeof 方法只能精確判斷基本類型,對於引用類型的判斷都爲 「object」。code

instanceof - 引用類型的判斷方法

instanceof 用於檢測構造函數的 prototype 屬性是否出如今某個實例對象的原型鏈上。 a instanceof b ,a 是否爲 b 的實例。regexp

var a = { x: 1 };
var b = [1, 2, 3];
var c = function () {
  console.log("aa");
};
connsole.log(a instanceof Object); // true
console.log(b instanceof Array); // true
console.log(c instanceof Function); // true
複製代碼

tips:不能檢測 null 和 undefined。 instanceof 方法能夠精確判斷 引用類型 的數據類型;orm

constructor

查詢對象的構造函數對象

function getConstructor(obj) {
  let a = obj;
  return a.constructor;
}
getConstructor(1);
// ƒ Number() { [native code] }
getConstructor("");
// ƒ String() { [native code] }
getConstructor(false);
// ƒ Boolean() { [native code] }
getConstructor(Symbol(1));
// ƒ Symbol() { [native code] }
getConstructor(BigInt(1));
// ƒ BigInt() { [native code] }
getConstructor(function () {});
// ƒ Function() { [native code] }
getConstructor(new Date());
// ƒ Date() { [native code] }
getConstructor(/a/);
// ƒ RegExp() { [native code] }
getConstructor({});
// ƒ Object() { [native code] }
getConstructor([]);
// ƒ Array() { [native code] }
複製代碼

原型方法

Object.prototype.toString.call()ip

Object.prototype.toString.call("xx"); // "[object String]"
Object.prototype.toString.call([12, 3]); // "[object Array]"
Object.prototype.toString.call({ x: 1 }); // "[object Object]"
Object.prototype.toString.call(function () {}); //"[object Function]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(1); // "[object Number]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(new Date()); // "[object Date]"
Object.prototype.toString.call(new RegExp()); // "[object RegExp]"
Object.prototype.toString.call(BigInt(2)); // "[object BigInt]"
複製代碼
  • 總結 js 中數據類型的判斷方法,typeof 常被用於檢測基本類型,instanceof 常被用於檢測引用類型, Object.prototype.toString 這種方法算是通用方法,實際開發中也是我最喜歡使用的。

類型轉換

如下場景會觸發類型轉換:

  • if 條件語句
  • 三目表達式等邏輯語句
  • ==、+、-、*等運算算符

開發中值得注意的點

  1. Number有最大限制:
// 經過Number.MAX_VALUE訪問,超過此值計算時會丟失精度
Number.MAX_VALUE // 1.7976931348623157e+308
複製代碼
  1. 二進制轉十進制:
parseInt('1010', 2) // 10
parseInt('a', 12) // 10
複製代碼
  1. 十進制轉二進制:
(10).toString(2)  // "1010"
(10).toString(12) // "a"
複製代碼

哇哦,奇妙的知識又增長了!姐妹們get起來吧!

相關文章
相關標籤/搜索