js 數(shù)據(jù)類型總結(jié)
作者:小白逆襲
來源:SegmentFault 思否社區(qū)
一. js數(shù)據(jù)類型
String Number Boolean null Undefined Object(包括派生類:Array, Function, Set, Map, Date, RegExp, WeakMap, WeakSet) Symbol BigInt(ES2020, 用來表示大于 js中最大整數(shù)2^53 - 1 的整數(shù))
分為基本類型(除Obejct類型外的類型)和引用類型(復(fù)合類型)
基本數(shù)據(jù)類型:值類型, 變量存儲(chǔ)在棧內(nèi)存中 引用數(shù)據(jù)類型:變量存儲(chǔ)在堆內(nèi)存和棧內(nèi)存中,棧內(nèi)存中存儲(chǔ)變量的標(biāo)識(shí)符和指向堆內(nèi)存中該對(duì)象的指針即堆內(nèi)存中該對(duì)象的地址),引用類型的值是按引用訪問的
undefined與null區(qū)別以及使用場(chǎng)景
null 指代空對(duì)象指針
使用場(chǎng)景:
(1)釋放內(nèi)存
(2)空值判斷
undefined 表示此處應(yīng)該有一個(gè)值,但是還沒有定義
使用場(chǎng)景:
(1)變量被聲明了,但沒有賦值時(shí),就等于undefined。
(2)調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對(duì)象沒有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒有返回值時(shí)或者return后面什么也沒有,返回undefined
初始化變量時(shí)可根據(jù)希望存放類型指定
let a = null; // 存放對(duì)象
let b = undefined; //存放數(shù)值
symbol類型
symbol用于模擬私有方法或?qū)傩裕?nbsp;任意一個(gè)symbol數(shù)據(jù)是一個(gè)獨(dú)一無二的值
symbol屬性名以及對(duì)象各類屬性的屬性名遍歷:
let obj = Object.create({}, {
getFoo: {
value: function() { return this.a; },
enumerable: false,
}
})
obj.a = 1,
obj.b = function() {},
obj[Symbol('a')] = 2,
Object.getOwnPropertySymbols(obj); //[Symbol(a)] 遍歷自身symbol類型屬性
Object.getOwnPropertyNames(obj); //['a', 'b', 'getFoo'] 遍歷自身非symbol類型屬性(包括不可枚舉屬性)
Reflect.ownKeys(obj); //[Symbol(a), 'a', 'b', 'getFoo'] 遍歷自身所有類型屬性,包括不可枚舉和symbol類型
Object.keys(obj); //['a', 'b'] 遍歷自身可枚舉屬性,
// for...in遍歷可枚舉屬性(包括繼承而來的), 搭配hasOwnProperty使用過濾出自身可枚舉屬性
二. 數(shù)據(jù)類型的判斷方式
typeof instanceof constructor Object.prototype.toString.call()
typeof
判斷結(jié)果: 'string'、'number'、'boolean'、'undefined'、'function' 、'symbol'、'bigInt'、'object'
特殊情形
// 數(shù)據(jù)類型與typeof結(jié)果表現(xiàn)形式不同:
console.log(typeof function(){}); // 'function'
console.log(typeof null); // 'object'
// 對(duì)于null, Object及其派生類型(Array, Date, RegExp等),無法使用typeof進(jìn)行類型的判斷,需要使用instanceof
console.log(typeof new Date()); // 'object'
console.log(typeof new RegExp()); // 'object'instanceof
語法:A instanceof B , 即判斷A是否為B類型的實(shí)例,也可以理解為B的prototype是否在A的原型鏈上
console.log([] instanceof Array); // true
console.log({a: 1} instanceof Object); // true
console.log(new Date() instanceof Date); // true
// 注意:對(duì)于基本類型,使用字面量聲明的方式可以正確判斷類型
console.log(new String('dafdsf') instanceof String) // true
console.log('csafcdf' instanceof String) // false, 原型鏈不存在constructor
當(dāng)一個(gè)函數(shù)F被定義時(shí),JS引擎會(huì)為F添加prototype原型,然后在prototype上添加一個(gè)constructor屬性,并讓其指向F的引用,F(xiàn)利用原型對(duì)象的constructor屬性引用了自身,當(dāng)F作為構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),原型上的constructor屬性被遺傳到了新創(chuàng)建的對(duì)象上,從原型鏈角度講,構(gòu)造函數(shù)F就是新對(duì)象的類型。這樣做的意義是,讓對(duì)象誕生以后,就具有可追溯的數(shù)據(jù)類型
console.log([].constructor === Array) // true
console.log(new Date().constructor === Date) // true
console.log(new RegExp().constructor === RegExp) // true
// 特殊的, null和undefined無法使用這種方式判斷,因?yàn)樗麄儾皇峭ㄟ^構(gòu)造函數(shù)方式聲明在js中,一般會(huì)使用修改原型的方式實(shí)現(xiàn)js的繼承,這種情況下一般要同步修改constructor 屬性, 防止引用的時(shí)候出錯(cuò), 例如:
function Aoo(){}
function Foo(){}
Foo.prototype = new Aoo();
Foo.prototype.constructor = Foo;
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//trueObject.prototype.toString.call()
console.log(Object.prototype.toString.call(1)) // '[object Number]'
console.log(Object.prototype.toString.call(1n)) // '[object BigInt]'
console.log(Object.prototype.toString.call('123')) // '[object String]'
console.log(Object.prototype.toString.call(null)) // '[object Null]'
console.log({}.toString()) // '[object Object]'
console.log(Object.prototype.toString.call([])) // '[object Array]'
console.log(Object.prototype.toString.call(function a() {})) // '[object Function]'instanceof isPrototypeOf: Array.isPrototypeOf({} | []), 基于原型鏈的概念 constructor: [] | {}.constructor = Array isArray Object.prototype.toString.call({} | [])

評(píng)論
圖片
表情
