數據類型應該算得上是 js 的基礎第一課。在平常的開發中會遇到不少類型判斷和類型轉換的場景。markdown
js中的數據類型分爲基本類型和引用類型:函數
基本類型的值是不可變的,引用類型的值是可變的。 在複製時:基本類型複製的是值,引用類型複製的是引用。 在比較時:基本類型只用比較值,引用類型須要同時比較引用地址和值。ui
在 js 中基本類型存儲在棧內存中,引用類型存儲在堆內存中。這是由於棧的存取速度至關快,僅次於 cpu 中寄存器的存取速度。spa
typeof "s"; // "string"
typeof { x: 1 }; // "object"
typeof [1, 2, 3]; // "object"
複製代碼
tips: 關於 typeof 的一個歷史 bugprototype
typeof null; // 'object'
複製代碼
typeof 方法只能精確判斷基本類型,對於引用類型的判斷都爲 「object」。code
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
查詢對象的構造函數對象
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]"
複製代碼
如下場景會觸發類型轉換:
// 經過Number.MAX_VALUE訪問,超過此值計算時會丟失精度
Number.MAX_VALUE // 1.7976931348623157e+308
複製代碼
parseInt('1010', 2) // 10
parseInt('a', 12) // 10
複製代碼
(10).toString(2) // "1010"
(10).toString(12) // "a"
複製代碼
哇哦,奇妙的知識又增長了!姐妹們get起來吧!