当前位置: 首页 > Web前端 > HTML

JS基础——JS数据类型

时间:2023-03-28 00:11:53 HTML

JavaScript数据类型是入门的基础知识点,也是最重要的。我们在代码中经常会遇到边界数据类型条件判断问题。只有处理好,我们的代码才能更有效率。严格的。数据类型的类型JavaScript是一种弱类型的脚本语言。所谓弱类型就是在定义变量时,不需要类型,在程序运行过程中会自动确定类型。最新的ECMAScript标准定义了8种数据类型:包括7种基本数据类型和1种引用类型。七种基本数据类型是:Boolean,有2个值:true和falsenull,一个特殊的关键字表示空值。JavaScript区分大小写,所以null与Null、NULL或变体undefined完全不同,undefined是和null一样的特殊关键字,undefined表示变量未赋值时的属性编号(Number),整型或浮点型点数,例如:42或3.14159任意精度整数(BigInt),可以安全地存储和操作大整数,甚至超过数字的安全整数限制字符串(String),字符串是表示文本值的字符序列,例如:“Howdy”代表(Symbol)(ECMAScript6中新添加的类型)。实例是唯一不变的数据类型引用数据类型(Object)分为Array——数组对象、RegExp——正则对象、Date——日期对象、Math——数学函数、Function——函数对象等常见类型。其中,基本数据类型存放在栈内存中,当被引用或复制时,会创建一个完全相等的变量。引用类型存放在堆内存中,存放地址,多个引用指向同一个地址。数据类型判断我们在日常工作中经常会用到数据类型检测的方法。下面三种检测方法是我们经常使用的。typeoftypeof1//'number'typeof'1'//'string'typeofundefined//'undefined'typeoftrue//'boolean'typeofSymbol()//'symbol'typeofnull//'object'typeof[]//'object'typeof{}//'object'typeof/^a/g//'object'typeofconsole//'object'typeofconsole.log//'function'typeofArray//'function'typeofNumber//'function'typeofObject//'function'typeofMath//'object'typeofRegExp//'function'typeofDate//'function'上面的输出结果,前6个是基本数据类型,但最后一个是空类型对象,它错误地指示null是一个对象,这是一个错误并且无法修复,因为它会破坏现有代码。在最初的JS版本中,使用的是32位系统。出于性能考虑,变量的类型信息存储在低位。000开头代表一个对象,而null代表全为0,所以被误判为一个对象。虽然现在内部的类型判断代码已经改了,但是针对这个bug已经流传下来了。在引用数据类型中可以看到,除了Array、Date等函数判断正确外,其他都是对象。不能判断数组等字面值。instanceof通过instanceof我们可以判断这个对象是否是之前构造函数生成的对象,这样我们就可以基本判断出这个新对象的数据类型。例如:letcar=newString('car')carinstanceofString//true那么instanceof是怎么实现的呢?functioninstanceof(left,right){//这里使用typeof判断基本数据类型,如果是则直接返回falseif(typeofleft!=='object'||left===null)returnfalse;//获取类型的原型letprototype=right.prototype//获取对象的原型left=Object.getPrototypeOf(left);//判断对象的类型是否等于类型的原型while(true){if(left===null)returnfalseif(prototype===left)returntrueleft=Object.getPrototypeof(left);}}从上面可以看出,instanceof可以准确判断复杂的引用数据类型,但是不能正确判断基本数据类型,而typeof可以判断基本数据类型(null除外),但是引用数据类型,函数类型除外,无法判断。为此,可以判断这两种写法的混写,但是还有一种写法比上面两种更好,就是下面的第三种写法。Object.prototype.toStringObject的原型有toString方法。调用该方法可以统一返回一个格式为'[objectXxx]'的字符串,其中Xxx为对象的类型,Xxx首字母大写(注意:使用typeof返回小写)。对于Object对象,直接调用toString()可以返回[objectObject];对于其他对象,需要通过call调用返回正确的类型信息,如下所示。Object.prototype.toString.call({})//"[objectObject]"Object.prototype.toString.call(1)//"[objectNumber]"Object.prototype.toString.call('1')//"[objectString]"Object.prototype.toString.call(true)//"[objectBoolean]"Object.prototype.toString.call(function(){})//"[objectFunction]"Object.prototype.toString.call(null)//"[objectNull]"Object.prototype.toString.call(undefined)//"[objectUndefined]"Object.prototype.toString.call(/123/g)//"[objectRegExp]"Object.prototype.toString.call(newDate())//"[objectDate]"Object.prototype.toString.call([])//"[objectArray]"Object.prototype.toString.call(document)//"[objectHTMLDocument]"Object.prototype.toString.call(window)//"[objectWindow]"实现一个数据类型判断方法是如何编写呢?可以看一下functiongetType(obj){lettype=typeofobj;如果(类型!==“对象”){返回类型;}//如果typeof的返回结果是object,进行如下判断,正常返回结果returnObject.prototype.toString.call(obj).replace(/^\[object(\S+)\]$/,'$1??');}getType([])//“数组”getType('123')//“字符串”getType(window)//“窗口”getType(null)//“空”getType(undefined)//“未定义”getType()//"undefined"getType(function(){})//"function"getType(/123/g)//"RegExp"数据类型转换数据类型转换主要分为强制类型转换和隐式类型转换,其中隐式类型转换最需要记住的是强制类型转换。强制类型转换方法包括Number()、parseInt()、parseFloat()、Boolean()等。Number()方法的强制转换规则:如果是boolean,则true和false分别转换为1和0。如果它是一个数字,返回它自己。如果为null,则返回0。如果未定义,则返回NaN。如果是字符串,则遵循以下规则:如果字符串中只包含数字(或者是一串以0X/0x开头的十六进制数字,允许加号和减号),则将其转换为十进制;如果字符串包含如果它包含有效的浮点格式,则将其转换为浮点值;如果是空字符串,则将其转换为0;如果不是上述格式的字符串,则返回NaN。如果是Symbol,则抛出错误。如果是对象并且部署了[Symbol.toPrimitive],则调用该方法,否则调用对象的valueOf()方法,然后将返回值按照前面的规则进行转换;如果转换结果为NaN,则调用对象的toString()方法,再次按照之前的顺序转换并返回对应的值。parseInt()方法的强制转换规则:该方法的规则是:除字符串参数第一个字符为数字,返回结果为数字外,其他均为NAN。parseFloat()方法具有与parseInt相似的规则。如果给定值可以解析为浮点数,则返回浮点数。如果给定值无法转换为数字,则返回NAN。Boolean()方法的强制转换规则:该方法的规则是:除undefined、null、false、"、0(包括+0、-0)、NaN转换为false外,其他均为true。隐式类型转换总是通过逻辑运算符(&&、||、!)、运算符(+、-、*、/)、关系运算符(>、<、<=、>=)、相等运算符(==)或if/中while条件的运算,如果两个数据类型不同,就会发生隐式类型转换。以“==”和“+”为例,说明隐式转换的规则。'=='公式类型转换的隐式转换规则:如果其中一个运算值是null或undefined,那么另一个运算符必须是null或undefined才返回true,否则都返回false。如果其中一个是Symbol类型,则返回false。两个运算若是value是string和number,那么string会被转成number。如果一个运算值是boolean,那么它会转成number。如果一个运算值是object另一种是string、number或symbol,object会转换成原来的类型再做判断(调用object的valueOf/toString方法进行转换)。'+'的隐式类型转换规则:'+'运算符不仅可以用作数字加法,还可以用作字符串拼接。只有当‘+’号两边都是数字时,才进行加法运算;如果两边都是字符串,则直接拼接,不进行隐式类型转换。当然,除了数字和字符串,还有一些其他的类型规则,如下:如果其中一个是字符串,另一个是undefined、null或Boolean,则调用toString()方法拼接字符串。如果其中一个是数字,另一个是undefined、null、boolean或number,则转换为数字进行加法。如果其中一个是字符串,另一个是数字,则按照字符串规则进行拼接。如果其中一个是字符串,另一个是对象,对象转换的规则:1.如果调用了Symbol.toPrimitive方法,先调用再返回。2.调用valueOf(),如果转换为基础类型则返回。3.调用toString(),如果转换为底层类型则返回。4.如果基本类型都没有返回,会报错。以上是该数据类型的部分相关内容。作为一名前端开发者,我们还是需要努力去夯实基本功。看完后觉得对你有帮助的别忘了关注哦