做民宿哪家网站最好,紧急通知河南全省暂停,安卓系统开发平台,怎么做微信小程序游戏数据类型篇
1、JavaScript有哪些数据类型#xff0c;它们的区别是什么#xff1f;
基本数据类型#xff1a;number、string、boolean、undefined、NaN、BigInt、Symbol
引入数据类型#xff1a;Object
NaN是JS中的特殊值#xff0c;表示非数字#xff0c;NaN不是数字…数据类型篇
1、JavaScript有哪些数据类型它们的区别是什么
基本数据类型number、string、boolean、undefined、NaN、BigInt、Symbol
引入数据类型Object
NaN是JS中的特殊值表示非数字NaN不是数字但是它的数据类型是数字它不等于任何值包括自身在布尔运算时被当做falseNaN与任何数运算得到的结果都是NaN计算失败或者运算无法返回正确的数值的情况下就会返回NaN。一些数学函数的运算结果也会出现NaN。
其中Sysmbol和BigInt是ES6中新增的数据类型
1Symbol代表创建后独一无二且不可变的数据类型它主要是为了解决可能出现的全局变量冲突的问题。
2BigInt是一种数字类型的数据它可以表示任意精度格式的整数使用BigInt可以安全地存储和操作大整数即使这个数已经超出了Number能够表示的安全整数范围。
以上这些数据类型可以分为原始数据类型和引用数据类型
栈原始数据类型Undefined、Null、Boolean、Number、String堆引用数据类型对象、数组和函数
2、基本数据类型和引用数据类型的区别
1、基本数据类型是按值访问的、也就是说我们可以操作保存在变量中的实际的值。
2、基本数据类型的值是不可变的任何方法都无法改变一个基本类型的值当这个变量重新赋值后看起来变量的值是改变了但是这里的变量名只是指向变量的一个指针所以改变的是指针的指向改变该变量是不变的但是引用类型可以改变。
3、基本数据类型不可以添加属性和方法但是引用类型可以。
4、基本数据类型的赋值是简单赋值如果从一个变量向另一个变量赋值基本类型的值会在变量对象上创建一个新值然后把该值复制搭配为新变量分配的位置上引用数据类型的赋值是对象引用。
5、基本数据类型的比较是值的比较引用类型的比较是引用的比较比较对象的内存地址是否相同。
6、基本数据类型是存放在栈区的引用数据类型同时保存在栈区和堆区。
3、数据类型检测的方法有哪些
1typeof console.log(typeof 2); //numberconsole.log(typeof true); //booleanconsole.log(typeof str); //stringconsole.log(typeof []); //objectconsole.log(typeof function(){}); //functionconsole.log(typeof {}); //objectconsole.log(typeof undefined); //undefinedconsole.log(typeof null); //object
其中数组、对象、null都会被判断为object其他判断都正确。
2instanceof
instanceof可以正确判断对象的类型其内部运行机制是判断再起原型链中能否找到该类型的原型 console.log(2 instanceof Number); //falseconsole.log(true instanceof Boolean); //falseconsole.log(str instanceof String); //falseconsole.log([] instanceof Array); //trueconsole.log(function(){} instanceof Function); //trueconsole.log({} instanceof Object); //true
由以上代码可以看出instanceof只能正确判断引用数据类型而不能判断基本数据类型。instanceof运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性。
3constructor console.log((2).constructor Number); //trueconsole.log((true).constructor Boolean); //trueconsole.log((str).constructor String); //trueconsole.log(([]).constructor Array); //trueconsole.log((function(){}).constructor Function); //trueconsole.log(({}).constructor Object); //true
constructor有两个作用一是判断数据的类型二是对象实例通过constructor对象访问它的构造函数。需要注意的是如果创建一个对象来改变它的原型constructor就不能用来判断数据类型了。 function Fn(){}Fn.prototype new Array();let f new Fn();console.log(f.constructor Fn); //falseconsole.log(f.constructor Array); //true
4Object.prototype.toString.call()
Object.prototype.toString.call()使用Object对象的原型方法toString来判断数据类型。 let a Object.prototype.toString;console.log(a.call(2)); //[object Number]console.log(a.call(true)); //[object Boolean]console.log(a.call(str)); //[object String]console.log(a.call([])); //[object Array]console.log(a.call(function(){})); //[object Function]console.log(a.call({})); //[object Object]console.log(a.call(undefined)); //[object Undefined]console.log(a.call(null)); //[object Null]
同样是检测对象obj调用toString方法obj.String()的结果和Object.prototype.toString.call(obj)的结果却不一样这是因为toString是Object的原型方法而Array、function等类型作为Object的实例都重写了toString方法。不同的对象类型调用toString方法时根据原型链的知识调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串Array类型返回元素组成的字符串...)而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型只能将obj转换为字符串类型因此在想要得到对象的具体类型时应该调用Object原型上的toString方法。
4、null和undefined的区别
undefined未定义的值
得到undefined的方式
1、声明一个变量但没有赋值
2、访问对象上不存在的属性
3、函数定义了形参但没有传递实参
4、使用函数的返回值当没有return操作时就默认返回一个原始的状态值这个值就是undefined表名函数的单回执未被定义。
5、使用void对表达式求值 ECMAScript明确规定void操作符对任何表达式求值都返回
null代表空值
区别undefined表示一个变量自然的、最原始的状态值而null则表示一个变量被人为的设置为空对象而不是原始状态。所以在实际使用过程中为了保证变量所代表的的语义不要对一个变量显式的赋值undefined当需要释放一个对象时直接赋值为null即可。 当对这两种类型使用typeof进行判断时Null类型化会返回‘object’这是一个历史遗留问题当使用‘’对这两种类型的值进行比较时会返回true使用‘’时会返回false。
5、为什么typeof null得到object而不是null
typeof null的结果是Object。因为JavaScript中不同对象在底层都表示为二进制二JavaScript中会把二进制前三位都为0的判断为object类型而null的二进制表示全都是0自然前三位也是0所以执行typeof时会返回‘object’。
在JavaScript第一个版本中所有值都存储在32位的单元中每个单元包含一个小的类型标签(1-3 bits)以及当前要存储值的真实数据。类型标签存储在每个单元的低位中共有5种数据类型
000object -当前存储的数据指向一个对象
1int -当前存储的数据是一个31位的有符号整数
010double -当前存储的数据指向一个双精度的浮点数
100string -当前存储的数据指向一个字符串
110boolean -当前存储的数据是布尔值
如果最低位是1则类型标签标志位的长度只有一位如果最低位是0则类型标签标志位的长度占3位为存储其他四种数据类型提供了额外两个bit的长度。
但是有两个特殊的数据类型
undefined的值是(-2)30(一个超出整数范围的数字)
null的值是机器码NULL指针(null的指针的值全是0)
也就是说null的类型标签也是000和object的类型标签一样所以会被判定为Object。
6、为什么nullundefined 得到true 但是nullundefined得到 false
要比较相等性之前不能将null和undefined转换成其他任何值但null undefined会返回true。ECMAScript规范中是这样定义的。
原因nullNull类型代表‘空值’代表一个空对象指针使用typeof运算得到‘object’所以你可以认为它是一个特殊的对象值。
undefinedUndefined类型当一个声明了一个变量未初始化时得到的就是undefined。
实际上undefined值是派生自null值的ECMAScript标准规定对二者进行相等性测试要返回true。
7、instanceof操作符的实现原理及实现
instanceof运算符用于判断构造函数的prototype属性是否出现在对象的原型链中的任何位置
function myInstanceof(left,right){// 获取对象的原型let proto Object.getPrototypeOf(left);// 获取构造函数的prototype对象let prototype right.prototype;// 判断构造函数的prototype对象是否在对象的原型链上while(true){if(!proto) return false;if(proto prototype) return true;// 如果没有找到就继续从其原型上找Object.getPrototypeOf方法用来获取指定对象的原型proto Object.getPrototypeOf(proto);}
}
8、为什么0.10.2 ! 0.3如果让其相等
在开发过程中遇到类似这样的问题 let n1 0.1,n20.2 console.log(n1n2) //0.30000000000000004 这里得到的不是想要的结果如果要想等于0.3就要进行转换(n1n2).toFixed(2)
toFixed(num)方法可以把Number四舍五入为指定小数位的数字。但是出现这样的结果其实是因为计算机是通过二进制的方式存储数据的所以计算机计算0.10.2的时候实际上是计算的两个数的二进制的和。0.1的二进制是0.00010011001100...(1100循环)0.2的二进制是0.00110011001100...(1100循环)这两个数的二进制都是无限循环的数。而JavaScript处理无限循环的二进制小数时一般我们认为数字包括小数和整数但是在JavaScript中只有一种数字类型Number它的实现遵循IEEE 754标砖使用64位固定长度来表示也就是标准的double双精度浮点数。在二进制科学表示法中双精度浮点数的小数部分最多只能保留52位再加上前面的1其实就是保留53位有效数字剩余的需要舍去遵从‘0舍1入’的原则。
根据这个原则0.1和0.2的二进制数相加再转换为十进制数就是0.30000000000000004
而对于这种情况最直接的解决方法就是设置一个误差范围通常称为‘机器精度’。对JavaScript来说这个值通常为2-52在ES6中提供了Number.EPSILON属性而它的值就是2-52只要判断0.10.2-0.3是否小于Number.EPSILON如果小于就可以判断为0.10.2 0.3
function NumberEpsilon(arg1,arg2) { return Math.abs(arg1-arg2) Number.EPSILON;
}
console.log(NumberEpsilon(0.10.2,0.3)); //true
9、如何获取安全的undefined值
因为undefined是一个标识符所以可以被当作变量来使用和赋值但是这样会影响undefined的正常判断。表达式void___没有返回值因此返回结果是undefined。void并不改变表达式的结果只是让表达式不返回值。因此可以用void()来获得undefined。
10、typeof NaN的结果是什么
NaN的意思是不是一个数字(Not a number)NaN是一个警戒值用于指出数字类型中的错误情况即执行数学运算但是没有成功这是失败后返回的结果。
console.log(typeof NaN); //number
NaN是一个特殊值它和自身不相等是唯一一个非自反(自反reflexive,即xx不成立)的值。而NaN ! NaN为true
11、isNaN和Number.isNaN函数的区别
函数isNaN接收参数后会尝试将这个参数转换为数值任何不能被转换为数值的值都会返回true因此非数字的值传入也会返回true会影响NaN的判断函数Number.isNaN会首先判断传入的参数是否为数字如果是数字再继续判断是否为NaN不会进行数据类型的转换这种方法对于NaN的判断更为准确。
12、操作符的强制类型转换规则
对于 来说如果对比双方的类型不一样就会进行类型转换。假如对比x和y是否相同就会进行如下判断流程
1、首先会判断两者类型是否相同相同的话就比较两者的大小
2、类型不相同的话就会进行类型转换
3、会先判断是否在对比null和undefined是的话就返回true
4、判断两者类型是否为string和number是的话就会将字符串转换为number 1 ‘1’ 1 1 5、判断其中一方是否为boolean是的话就会把boolean转为number再进行判断 ‘1’ true ‘1’ 1 1 1 6、判断其中一方是都为object且另一方为string、number或者symbol是的话就会把object转为原始类型再进行判断 ‘1’ {name:js} 1 [object.Object]