当前位置: 首页 > Web前端 > vue.js

面试说:说说JavaScript中的数据类型

时间:2023-03-31 20:37:23 vue.js

前言请说说JavaScript中的数据类型?在前端面试中,估计大家都被这样问过。答:Javascript中的数据类型包括原始类型和引用类型。基本类型包括null、undefined、boolean、string、symbol、bigInt和number。引用类型指的是Object。没错,我也是这样回答的,但是这通常是第一个问题,可以引出很多很多的问题,比如Null和Undefined有什么区别?前端判断需要注意什么?为什么typeofnull是一个对象?为什么ES6会提出Symbol?BigInt解决了什么问题?为什么是0.1+0.2!==0.3?你如何解决这个问题?如何判断一个值是否为数组?...弱类型语言,因为JavaScript是一种弱类型或动态语言。这意味着你不需要事先声明变量的类型,类型会在程序运行过程中自动确定,这意味着你可以使用同一个变量来存储不同类型的值varfoo=42;//foo是一个数字nowfoo="bar";//foo是一个字符串nowfoo=true;//fooisaBooleannow这个特性给我们带来方便的同时,也给我们带来了很多类型错误。试想一下,如果说JS是强类型语言,那么类型之间是没有办法转换的,就会有一层屏障或者说保护。会不会更容易维护?—这可能就是TypeScript诞生的原因。掌握JavaScript的数据类型,是前端最基础的知识点吗?null或undefined定义undefined来表示未定义的变量。空值表示空对象指针。回到源头:一开始,JavaScript的设计者BrendanEich实际上只是定义了null,就像在Java中一样将其视为一个对象。但是因为JavaScript中有两种数据类型:原始数据类型和引用数据类型。BrendanEich觉得代表“无”的值最好不是对象。因此,Javascript的设计是,null是一个代表“无”的对象,转换为值时为0;undefined是表示“无”的原始值,转换为值时为NaN。Number(null)//05+null//5Number(undefined)//NaN5+undefined//NaNNull和Undefined的区别,null的应用意味着“没有对象”,即那里应该没有值,典型的用法如下作为函数的参数,说明函数的参数不是对象。作为对象原型链的终点。Object.getPrototypeOf(Object.prototype)//nullundefined表示“缺失值”,即这里应该有一个值,但是还没有定义。典型的用法是:当一个变量被声明但没有赋值时,等于undefined。调用函数时,应该提供的参数没有提供,参数等于undefined。该对象没有为属性分配值,并且该属性的值未定义。当函数没有返回值时,默认返回undefined。vari;i//undefinedfunctionf(x){console.log(x)}f()//undefinedvaro=newObject();o.p//undefinedvarx=f();x//undefined应该注意什么?javaScript中的null和false值有五种,分别是undefined、null、false、""、0、NAN,有时容易引起一些问题,比如leta=0;console.log(a||'/');//本意是只要a为null或Undefined就输出'/',但实际上只要是以上五种类型之一,都会输出'/'当然我们可以这样写leta=0;if(a===null||a===undefined){console.log('/');}else{console.log(a);}并不总是很优雅,所以ES规范提出了一个空合并运算符(??)null值合并运算符(??)是一个逻辑运算符,当左操作数为null或未定义时返回其右操作数,否则返回左操作数。上面的例子可以写成:leta=0;console.log(a??'/');//0typeofnull——JS犯的一个错误typeofnull//“对象”JavaScript中的值是用一个type标签来表示的,代表的是实际的数据值。第一版JavaScript使用32位来存储值,通过值的低1位或3位来标识类型,对象的类型标记为000。如下1:整数(int)000:引用类型(object)010:双精度浮点数(double)100:字符串(string)110:布尔值(boolean)但有两个特殊值:undefined,使用整数-2^30(负2的30次方,不在整型范围)null,机器码空指针(C/C++宏定义),低三位也是000因为null表示空指针(低三位也是000),所以null的类型标号是000,因此typeofnull返回“object”。这是JavaScript设计上的错误,但无法修改。毕竟如果修改的话,会影响已有的代码数——0.1+0.2!==0.3现象在JavaScript中会出现类似下面的现象0.1+0.20.30000000000000004原因我们在对floating进行操作的过程中-点数,需要十进制转二进制。十进制数转二进制的规则是:将小数点后的数乘以2,取结果的整数部分(1或0均可),再将小数部分乘以2,再取整数部分结果的……以此类推,直到小数部分为0或者位数够多就OK了。然后按照上面的规则依次排列整数部分,最终0.1的表达式如下:0.000110011001100110011(0011死循环)...所以,精度损失不是语言问题,而是浮点数的固有缺陷-点号存储本身。JavaScript是以64位双精度浮点数存储所有Number类型值,按照IEEE754规范,0.1的二进制数只保留52位有效数字,即1.100110011001100110011001100110011001100110011001101*2^(-4)同理,0.2的二进制数为1.100110011001100110011001100110011001100110011001101*2^(-3)Inthisway,theprecisionhasbeenlostintheconversionbetweenbases.计算如下:0.000110011001100110011001100110011001100110011001100110011010+0.0011100110011001100110011001100110011001100110011001110011100111100----=0.01001100110011001100110011001100110011001100110011001110所以最后计算结果为0.1+0.2!==0.3如何解决数字转整数的问题functionadd(num1,num2){constnum1Digits=(num1.toString'().split.')[1]||'').长度;constnum2Digits=(num2.toString().split('.')[1]||'').length;constbaseNum=Math.pow(10,Math.max(num1Digits,num2Digits));返回(num1*baseNum+num2*baseNum)/baseNum;}类库NPM有很多对JavaScript和Node.js库的数学支持,例如math.js、decimal.js、D.js等。ES6ES6为Number对象添加了一个非常小的常量——Number.EPSILONNumber.EPSILON//2.220446049250313e-16Number.EPSILON.toFixed(20)//"0.00000000000000022204"引入这么小的量来设置浮点计算的误差范围。如果误差可以小于Number.EPSILON,我们就可以认为结果是可靠的。functionwithinErrorMargin(left,right){returnMath.abs(left-right)Object.prototype.toString.call()>instanceof>constructor总结本文讨论分析JavaScript中一些常见的数据类型问题。希望能对大家面试或者平时工作有所帮助。另外,可能没有提到的东西,比如类型转换等,有机会再讨论。最后欢迎大家关注我的公众号——前端杂货店,多讨论技术问题~参考undefined和null的区别“typeofnull”的历史0.1+0.2不等于0.3?为什么JavaScript会有这种“骚”操作?深入理解JavaScript中的precisionlossJavaScript名家面试题:0.1+0.2!==0.3,即将成为过去式..)ECMAScript入门6JavaScript中,如何判断一个数组是否是一个数组大批?