问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JavaScript基础篇(一):数据类型

发布网友 发布时间:2024-09-17 05:42

我来回答

1个回答

热心网友 时间:2024-10-02 09:04

在学习JavaScript过程中数据类型是必不可少的一环,今天我们来看看JavaScript中有哪些数据类型吧。

ECMAScript语言类型

ECMAScript语言类型是分为Undefined、Null、Boolean、String、Number、Symbol、BigInt和Object的,也就是我们常说的值类型和引用类型。

Undefined类型

Undefined类型只有一个值就是undefined,一些变量没有被赋值,那么他就是undefined

Null类型

Null类型只有一个值就是null。

Undefined和Null的区别?

undefined表示未定义,我们声明了一个变量但没给他赋值,或者访问了一个不存在的属性;null表示他是一个空值(空值也是有值)。

undefined是一个全局的属性,可以对他赋值,但是被不会修改,因为他是不可配置的,null是一个关键字,不能被赋值。

Boolean类型

Boolean类型表示有两个值的逻辑实体true、false

String类型

JavaScript中的字符串类型表示文本数据,它包含0个或多个16位无符号整数值的的“元素”,在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。

StringIndexof

StringIndexof(string,serachValue,fromIndex)接受三个参数,用来查找字符串中是否有指定的字符,没有就返回-1,具体步骤如下:

将string断言成字符串,如果不是字符串类型就会直接报错

serachValue会被转换成字符串

fromIndex接受一个非负整数,否则会对其进行转换,能被转成数字的转成数字('1'=>1),否则都是0,负数也是0(或者是被忽略掉,只有转换后是非负整数才会生效)

定义一个变量len,他是字符串string的长度

判断serachValue是不是空字符串,并且fromIndex≤len,那么就返回fromIndex

定义一个变量searchLen其长度为serachValue的长度

定义一个变量i,从fromIndex开始,到i≤len-searchLen结束,每次遍历i+searchLen长度的字符串,找到了就返回i

没找到返回-1

Symbol类型

符号(Symbols)类型是唯一且不可修改的原始值,并且可以用来作为对象的键(key)

Number类型

Number类型和BigInt类型都是数字类型。数字类型是一种以IEE754为标准的双精度64位二进制格式的值,从-(2^53-1)到2^53-1之间的数字,还有+0、-0、NaN、+Infinity、-Infinity。

要检查值是否大于或小于±Infinity,你可以使用常量Number.MAX_VALUE和Number.MIN_VALUE。

从ECMAScript2015开始,除了Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER,你还可以通过Number.isSafeInteger()来检查值是否在双精度浮点数的取值范围内。

超出这个范围,JavaScript中的整数将不再安全,该值将表示为与该值近似的双精度浮点数。

BigInt类型

可以表示任意精度的整数。使用BigInt,您可以安全地存储和操作大整数,甚至可以超过数字类型的安全整数限制。

BigInt是通过在整数末尾附加字母n或调用构造函数来创建的。

BigInt不能与数字相互运算。否则,将抛出TypeError。

如何判断数据类型typeof操作符

typeof操作符是一个一元运算符,返回一个字符串,表示未经计算的操作数的类型。他可以判断基础数据类型,对于引用类型都是object,不能准确判断,其中有两个特例,对于null会被判断为object,函数类型可以被准确判断出来是funciton

数据类型结果Undefined"undefined"Boolean"boolean"Number"number"String"string"Symbol"symbol"BigInt"bigint"Null"object'Function"funciton"Object"object"其他引用类型"object"

那么为什么null会被判断为object呢?答:不同的对象在底层都表示为二进制,在JavaScript中二进制前三位都为0的话会被判断为object类型,null的二进制表示是全0,自然前三位也是0,所以执行typeof时会返回“object”。

instanceof

instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。

//?object为实例对象,constructor为构造函数object?instanceof?constructor

instanceof可以判断引用数据类型,但判断不了基本数据类型,只能判断基本数据类型的包装类型。

function?instanceOf(proto,?Ctor)?{????if?((typeof?proto?!==?'object'?||?proto?===?null)?&&?typeof?proto?!==?'function')?return?false;????let?leftProto?=?Object.getPrototypeOf(proto);????const?rightProto?=?Ctor.prototype;????while?(leftProto)?{????????if?(leftProto?===?rightProto)?return?true;????????leftProto?=?Object.getPrototypeOf(leftProto);????}????return?false}Object.prototype.toString()

Object.prototype.toString方法也是可以用来判断数据类型的,他会返回一个字符串"[objectClass]",Class类似该数据类型的构造函数。他可以准确地判断出给个数据类型。简单举例如下:

Object.prototype.toString.call({})???????//?"[object?Object]"Object.prototype.toString.call([])??//?"[object?Array]"Object.prototype.toString.call(1)????//?"[object?Number]"Object.prototype.toString.call('1')??//?"[object?String]"Object.prototype.toString.call(true)??//?"[object?Boolean]"//?...三种区别方法基本数据类型引用数据类型注意typeof??NaN...instanceof??多窗口、右操作数必须是函数或classtoString??小心内置原型isPrototypeOf??小心null和undefined等比较??特殊对象

instanceof和isPrototypeOf有什么不同?

isPrototypeOf()方法用于测试一个对象是否存在于另一个对象的原型链上prototypeObj.isPrototypeOf(object)

instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上

实现一个判断常见数据类型判断的方法/**?*?数据类型判断通用方法?*/const?getType?=?(obj)?=>?{????if?(obj?==?null)?return?obj?+?'';????return?(typeof?obj?===?'object'?||?typeof?obj?===?'funciton')??????????????????(Object.prototype.toString.call(obj).toLocaleLowerCase().slice(8,?-1)?||?'object')????????????????:?typeof?obj;}数据类型转换

ECMAScript语言会根据需要进行隐式的类型转换,而BigInt没有隐式转换,必须显示的调用他来转换成其他类型。

ToPrimitive(input[,preferredType])

将输入的参数转换成非对象类型(原始值)

断言:input输入是一个ECMAScript语言的值

如果输入的类型是对象

如果preferredType不存在,按default转换

如果preferredType是“string”,那就按“string”转换

否则,将断言preferredType成“number“,按“number“转换

如果经过转换后result不是对象了就返回,否则报错ThrowaTypeErrorexception

获取对象上toPrimitive方法,如果存在,

返回input(原始类型)

对象转原始值OrdinaryToPrimitive(O,hint)

将O断言成对象类型

判断要转换的类型hint是string还是number

如果要转换成string,那么调用顺序是"toString","valueOf"

如果调用toString返回一个原始值,JavaScript将这个值转换为字符串,并返回这个字符串结果。

如果对象没有toString方法,或者这个方法并不返回一个原始值,那么JavaScript会调用valueOf方法。如果存在这个方法,则JavaScript调用它。如果返回值是原始值,JavaScript将这个值转换为字符串,并返回这个字符串的结果

否则,JavaScript无法从toString或者valueOf获得一个原始值,这时它将抛出一个类型错误异常

如果要转换成number,那么调用顺序是"valueOf","toString"

同3

否则,JavaScript抛出一个类型错误异常

ToBoolean(argument)argumentTyperesultUndefinedfalseNullfalseBooleanreturnargumentNumberif+0、-0、NaNreturnfalse;otherwisereturntrueString空字符串返回false,其他的都是trueSymboltrueBigIntIfargumentis0?,returnfalse;otherwisereturntrue.ObjecttrueToNumberargumentTyperesultUndefinedNaNNull+0Booleantrue:1;false:0NumberReturnargument(noconversion).String见例子SymbolTypeErrorBigIntTypeErrorObject1.LetprimValuebe?ToPrimitive(argument,number).2.Return?ToNumber(primValue).console.log(Number())?//?+0console.log(Number(undefined))?//?NaNconsole.log(Number(null))?//?+0console.log(Number(false))?//?+0console.log(Number(true))?//?1console.log(Number("123"))?//?123console.log(Number("-123"))?//?-123console.log(Number("1.2"))?//?1.2console.log(Number("000123"))?//?123console.log(Number("-000123"))?//?-123console.log(Number("0x11"))?//?17console.log(Number(""))?//?0console.log(Number("?"))?//?0console.log(Number("123?123"))?//?NaNconsole.log(Number("foo"))?//?NaNconsole.log(Number("100a"))?//?NaN

Number函数会尽可能多的解析数值字符,将它转换成整数或浮点数,忽略所有前导的0,如果有一个字符不是数字,结果都会返回NaN。除此之外我们还有parseInt和parseFloat进行数值转换。

parseInt只解析整数,parseFloat则可以解析整数和浮点数,尽可能解析更多数值字符,并忽略后面的内容。如果第一个非空格字符是非法的数字直接量,将最终返回NaN。

ToStringargumentTyperesultUndefined“undefined”Null“null”Boolean“true”;“false”NumberNumber.toString(argument)StringReturnargument(noconversion).SymbolTypeErrorBigIntBigInt.toString(argument)Object1.LetprimValuebe?ToPrimitive(argument,number).2.Return?ToString(primValue).ToObject

始值通过调用String()、Number()或者Boolean()构造函数,转换为它们各自的包装对象。

null和undefined属于例外,当将它们用在期望是一个对象的地方都会造成一个类型错误(TypeError)异常,而不会执行正常的转换。

JSON.stringify

参考:https://github.com/mqyqingfeng/Blog/issues/159

运算符

在js运算中通常某些运算符会发生隐式类型转换,如一元操作符+、二元操作符+、==运算符这些,在运算过程中会发生数据类型转换,得到的值和我们想象的可能不太一样

一元操作符+

当+运算符作为一元操作符的时候,查看ES5规范1.4.6,会调用ToNumber处理该值,相当于Number('1'),最终结果返回数字。

转换步骤见上面ToNumber函数

二元操作符+

如果操作数是对象,那么对象转为原始值

如果一个操作数是字符串,那么另一个操作数也转成字符串,进行字符串拼接

否则两个数都变成数字或NaN进行加法操作

==运算符

执行x==y时

如果x和y是同一类型,执行===严格相等比较

x是null并且y是undefined,返回true

x是undefined并且y是null,返回true

如果x是Number,y是String,那么比较x==ToNumber(y)

如果x是String,y是Number,那么比较ToNumber(x)=y

如果x是BigInt,y是String

将string转换成Bigint,赋值与变量n

n如果是NaN,返回false

返回x==n的结果

其中一个是Boolean,那么比较ToNumber(x)=y或x=ToNumber(y)

x是字符串或者数字,y是对象,判断x==ToPrimitive(y)

返回false

===严格相等比较

两者类型不同,返回false

如果x是数字类型或者BigInt,比较x是否等于y

返回SameValueNonNumeric(x,y)

SameValueNonNumeric(x,y)

x和y都不是Number或BigInt(不然在上述第二步就执行了)

x和y的类型是相同的(不然在上述第一步就执行了)

如果x是undefined,返回true

如果x是null,返回true

如果x是string

只有x和y是完全相同的代码序列(长度相同、在相同的索引出有相同的代码单元)才返回true,否则返回false

如果x是boolean

只有x和y都是true或者false才返回true,否则返回false

如果x是symbol

只有x和y有相同的symbol值,才返回true,否则返回false

只有x和y有相同的对象值,才返回true,否则返回false

原文:https://juejin.cn/post/7101840303224520712

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
想你花就开了是什么意思 ...轻弹簧下端固定在水平面上.一个小球从弹簧正上方某一高度处由静止... ...弹簧下端固定在水平地面上,质量为m的小球从轻弹簧的正上方某一高处... ...一竖直弹簧下端固定于水平地面上,小球从弹簧的正上方高为h的地方自... ...结婚证,孩子户口也在女方家,男方可以要求拿抚养权吗? 小男孩适合戴哪些翡翠小男孩适合戴什么翡翠 产后尿道口痛是什么原因 产后尿道口疼怎么回事 ...同种点电荷连线上和中垂线上电势的变化规律 办理北京银行需要什么手续 小锅卫星电视怎么搜台? 读了爱的力量你有什么感受 老师生病了,但依旧给我们坚持上课.爱的力量指的是什么 如何用除法计算一个数占另一个数的百分比? 在计算器上怎么算百分比? 形容女人皮肤的句子 Windows 7 SP1集成 USB 3.0 和 NVME 的 ISO ,属于Win7sp1 的什么版本... cn_windows_7_professional_x86_dvd_x15-65790.iso和cn_windows_7_prof... 怎么查看微信看过的照片和视频? 求个产品名字,空气净化器产品,最好是通俗易懂,中外都能音译的。比如阿里... 想弄一个背包式空气净化器,大家帮起个名字呗,给大家个灵感,远大这样的... 麻烦给“源创”下一个定义.用于团队的名字,比赛内容是关于净化器的 2020年女宝取名高分名字 迷你世界为什么方块刷新不出来还哼卡 那不是我在下雨吗仿写句子 千门八将36局——雕弓天狼局 (木火)属性的好名字推荐 黄道婆织布机黄道婆是哪个朝代的 黄道婆对我国纺织做出什么贡献 黄道婆资料(黄道婆的简介) JavaScript获取变量数据类型 JavaScript中六种数据类型 急!南阳购房发票是不是最近开不了? 南阳市冰谷网络技术有限公司怎么样? 南阳市海昱智能科技有限公司怎么样? 微信阅读如何下载书籍 如何下载网上的电子书? 如何阅读一本书电子版 上海逢石科技有限公司扬州分公司附近有停车场吗 1,4-二溴环己烷结构式? 婴儿大便发绿是铁不吸收吗 添加辅食后大便干燥怎么办 加辅食后宝宝大便干燥 八个月的宝宝大便干燥和吃辅食有关系吗 宝宝吃了辅食后大便是干燥是正常吗 工具指的是什么意思? 适合的工具是什么意思? 春秋时期的大思想家管仲为安徽颍上人。他主张“仓廪实而知礼节,衣食足... Shahzoda大事年表 求助一首乌兹别克斯坦舞曲里面有“吉米阿佳”的歌名及下载地址,谢谢了...