一、JS中有哪些資料類型?
Undefined、Null、String、Number、Boolean、Object、Symbol共7種
其中基本資料類型包括 Undefined、Null、Number、Boolean、String、Symbol (ES6 新增,表示獨一無二的值),而引用資料類型統稱為 Object 對象,主要包括對象、數組和函數
注意:Symbol是ES6才出現的,它是一種基本資料類型。
Symbol()
函數會傳回symbol類型的值。該類型具有靜态屬性和靜态方法 。每個從
Symbol()
傳回的symbol值都是唯一的。一個symbol值能作為對象屬性的辨別符。
二、JS中資料類型有哪些判斷的方法?
1.typeof
注意:null和數組進行typeof操作符後,結果是object,原因在于,null和數組被當做一個空對象引用。
2.instanceof (推薦使用)
instanceof
運算符用于檢測構造函數的
prototype
屬性是否出現在某個執行個體對象的原型鍊上,換句話說就是:instanceof用來測試一個執行個體對象在其原型鍊中是否存在一個構造函數的prototype屬性,存在即為真true,不存在即為false。
原理是instanceof 是通過原型鍊判斷的,A instanceof B, 在A的原型鍊中層層查找,是否有原型和類(構造函數)的一個屬性即B.prototype相等,如果一直找到A的原型鍊的頂端(null即Object.prototype.__proto__),仍然不等于B.prototype,那麼傳回false,否則傳回true。
文法如下:
object instanceof constructor
其中
object
是某個執行個體對象,
constructor是
某個構造函數或者說叫做一個類,結果是true或者false
// 定義構造函數
function C(){}
function D(){}
var a1 = new C();
a1 instanceof C; // true,因為 Object.getPrototypeOf(a1) === C.prototype
a1 instanceof D; // false,因為 D.prototype 不在 a1 的原型鍊上
a1 instanceof Object; // true,因為 Object.prototype.isPrototypeOf(a1) 傳回 true
C.prototype instanceof Object // true,同上
C.prototype = {};
var a2 = new C();
a2 instanceof C; // true
a1 instanceof C; // false,C.prototype 指向了一個空對象,這個空對象不在 a1 的原型鍊上.
D.prototype = new C(); // 繼承
var a3 = new D();
a3 instanceof D; // true
a3 instanceof C; // true 因為 C.prototype 現在在 a3 的原型鍊上
注意:
(1)對于基本資料類型來說,字面量方式建立出來的結果和執行個體方式建立的傳回結果是不同的:嚴格來說,隻要通過執行個體建立出來的結果才能算是标準的對象資料類型,而對于字面量産生的值的方式不是嚴謹的執行個體,由于js作為一種弱類型語言具有松散特點,導緻了Number.prototype上提供的方法隻要在目前執行個體的原型鍊上,我們用其檢測出來的結果都是 true。在類的原型繼承中,我們最後檢測出來的結果未必準确。這也不難知道,每一種程式語言都有嚴格的一套文法規範,因為程式不難像人一樣一眼能看出來。
這個驗證似乎在傳達着:微服私訪的皇帝老兒我就是不相信你是皇帝,但是你從皇宮帶着保镖走出來的皇帝一定是真皇帝
(2) 不能檢測 null 和 undefined
(3) 原型鍊可以重構,導緻結果不準确
3.constructor:constructor 屬性傳回對建立此對象的數組函數的引用。
undefined、null沒有contructor屬性
文法
object.constructor
4.Object.prototype.toString.call()
三、JS資料類型的使用問題:
1.const 定義的值是否可以改變?
四、參考連接配接
[1].JS之instanceof詳解
[2].JavaScript 資料類型及object類型介紹
[3].JS中的六大資料類型
[4].JavaScript 有幾種類型的值?
[5].instanceof