JavaScript 数据类型与类型判断

2023-06-14 0 499

JS 中的统计数据时常关系密切,与之有关的二阶表达式,在平时合作开发中却并非很在乎,多于在合作开发中碰到难题才会去搜寻有关科学知识,而这类没有关的科学知识贮备。

上周五复试中,辩手问了两个难题,渐渐意识到他们此基础并不坚实。

Q1: JS 有什么样二阶表达式?A: number,boolean,string,null,undefined,symbol, object

Q2:有什么样方式推论二阶表达式?A: typeof, instanceof

Q3:除了其它方式?A:???除了嘛(疑点: Array.isArray 对,那个方式能推论字符串,那除了其它方式能推论其它二阶表达式嘛?)

Q4:什么样是原初类别?A: number,boolean,string,undefined,symbol。object 并非原初类别。(疑点:那 null 呢? typeof null 也是 object,表达式呢,Date呢,二阶呢,那是不是推论某一类别是并非原初类别?)

与此同时,最终辩手举了个二阶表达式的采用情景,在写模块的这时候,写公用表达式的这时候,须要去奇偶校验模块的类别,假如模块不对,须要放出相关联的严重错误。确实,易用性足够多强的标识符,假如要考虑到许多的情形,而那些的此基础都要明晰二阶表达式。

1.二阶表达式

化解 Q1,即下列六种二阶表达式,当中第一类类别又包涵表达式第一类,年份第一类等

MDN 中早已说明了,JS 中有8 种二阶表达式(六种原初类别和第一类类别):

化解 Q4,即下列六种类别是原初类别,其它第一类类别都并非原初类别

六种原初类别:

numberstringbooleannullundefinedbigintsymbol

原初类别储存的都是值,是没特性或是方式的。如 1.toString()会收起,即使1 那个此基础类别没 toString 方式。

特别注意:1.toString()是能的,原因在于在初始化 toString 方式的这时候,字符串1早已转为字符串第一类了,而对象是有方式的。

第一类类别:除了原初类别,都是第一类类别

标准第一类,键值对{}表达式第一类年份,Date 第一类字符串,Array 第一类二阶, RegExp 第一类严重错误,Error 第一类

2.二阶表达式

JavaScript 数据类型与类型判断

也就是说,typeof 能检验出, number,string,boolean,undefined,function, symbol 类别,而对于 null 和其它的第一类类别统计数据,返回值都是 object,不能区分。

那如何区分, null,标准第一类,表达式第一类,年份第一类,字符串第一类,严重错误第一类和二阶第一类呢?

化解 Q2,Q3,即还能采用 Object.prototype.toString()方式来推论类别

答案是 Object.prototype.toString()

JavaScript 数据类型与类型判断

接下来写一个 type 表达式,该表达式返回任意统计数据的二阶表达式。

var class2type ={};//生成class2type映射”Number String Boolean Undefined Function Symbol Null Object Date RegExp Array Error”.split(“”).map(function(item, index){ class2type[“[object “+ item +”]”]= item.toLowerCase();})function type(){ return class2type[Object.prototype.toString.call(obj)]}

至此,我们能推论原初类别以及一些第一类类别。

3.额外的 Utils 方式

3.1 isWindow

依据: window 第一类有 window 特性指向自身。

function isWindow(obj){ return obj !== null && obj === obj.window;}

3.2 isEmptyObject

依据:空第一类上没特性

function isEmptyObject( obj ){ return typeof obj ===object&& obj !== null &&!Object.keys(obj).length}

3.3 isElement

依据: DOM 元素的 nodeType 为1

function isElement(obj){ return !!(obj && obj.nodeType ===1);};

3.4 isValidDate (是否为有效的年份第一类)

依据: isNaN(new Date(foo))=== true

function isValidDate(d){ return d instanceof Date &&!isNaN(d);}

new Date(a)// Invalid Date 此时,返回值是个”不合法年份”第一类new Date(a)===Invalid Date// falsenew Date(a).toString()===Invalid Date// truenew Date(a).valueOf()// NaN 即,那个”不合法年份第一类”转换为数字是为 NaN isNaN(new Date(a))// true “不合法年份第一类”为 NaNnew Date(a) instanceof Date // true,即”不合法年份第一类”依然是 Date 的实例const date = new Date(a)date.getFullYear()// NaN //即 “不合法年份第一类”上初始化方式一律返回 NaNdate.getMonth()// NaNdate.getDate()// NaNnew Date(NaN,NaN,NaN);// Invalid Date,即返回”不合法年份第一类”

4.二阶表达式与内存

在 JS 中,每一个统计数据都须要一个内存空间,而内存空间又被分为:栈内存(stack)与堆内存(heap)。

number, boolean, string, null, undefined, symbol 这几种此基础类别和表达式,它们的值会存放在栈内存中。

而引用类别统计数据,如 Array (所需内存大小不一样),标准第一类{},它们的值存放在堆内存中。

var a = null;//栈//变量 a 存放于栈中,它的值是 null,也是存放在栈中var b ={ m:20};//变量 b 存放于栈中,它的值是第一类的地址,地址也存放在栈中//而地址指向的{m:20}作为第一类存在于堆内存中

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务