当前位置: 首页 > 科技观察

Javascript中可能被骗的数据类型详解

时间:2023-03-12 00:30:00 科技观察

前言Javascript的数据类型并不是每个人都默认的。主要的基础数据类型和参考数据类型都是初学者必须学习的知识点,并且在日常生活中开发中,经常用到。大家知道一些细节吗?让我们在下面详细讨论它。1、数字类型注意事项数字类型包括:正数、负数、0、小数、NaNNaN:表示notanumber不是有效数字,但属于数字类型(1)=和==和===区别=是赋值==是判断左右两边的值是否相等(不严格判断,只要字面量相等即可)===是判断左右两边是否要相等,严格判断(包括数据类型、类型和字面量相等)(2)NaNNaN和NaN不相等,NaN==NaN返回falseisNaN();检查一个值不是有效数字的命题是否为真,如果是有效数字则返回false,如果不是有效数字则返回trueisNaN()如果检测到的值不是数字类型,浏览器将转换value默认为数字类型,然后判断是否为有效数字。例如:console.log(isNaN("123"))//打印结果为真步骤:1、先将“123”转换成数字类型,使用Number()转换方法2,然后判断数字的值是否typemeetstheconditionofisNaNNumber()方法强制将其他数据类型转换为数字类型(forceddatatypeconversion)Number()方法强制将其他数据类型转换为数字类型。要求:如果是字符串,则字符串必须是数字才可以转换。例如:Number("12")返回12,Number("12px")返回的结果为NaN非强制数据类型转换parseInt()/parseFloat()parseInt:从左到右,逐一查找字符,转换将数字转化为有效数字,如果中间遇到无效数字,则不再继续查找parseFloat:同上,可以多识别一位小数。例如:parseInt('12px')的值为12。parseFloat('12.5px')的值为12.5。二、数据类型的转换规则是常用的boolean转换符号!,然后否定!!两个感叹号是将其他数据类型转换为boolean类型,相当于Boolean()的转换规则:1、如果只有一个值,判断该值是true还是false,遵循:only0NaN""nullundefined这五个为false,其余为true例如:console.log(!3)//falseconsole.log(![])//falseconsole.log(!{})//falseconsole.log(!null)//trueconsole.log(!0)//trueconsole.log(!undefined)//trueconsole.log(!""))//true注意:这里的数字0为false,如果是'0'的字符串,也为真例如:if(0){console.log("true")}else{console.log("false")}if('0'){console.log("true")}else{console.log("isfalse")}第一个输出为false,第二个输出为true2.如果比较两个值是否相等,遵循这个规则:val1==val2这两个值可能不为相同的数据类型,如果是==比较,会进行默认的数据类型转换1),object==object,永不相等2),object==string现在将object转换为astring(调用方法toString),然后比较[]成字符串""{}成字符串"[objectObject]"所以:[]==""为true{}==""为false3),object==Boolean类型的对象先转换为字符串(toString),然后字符串转换为数字(Number),boolean类型也转换为数字(true为1,false为0),最后让两个数字比较例如:console.log([]==false)//解析为true:先将[]转为字符串"",再将字符串转为数字类型number,Number("")的结果为0,false转为数字类型,结果ofNumber(false)也是0,所以[]==false,解析成0和0比较,所以相等,返回true4),object==numberobject先转为字符串(toString),然后将字符串转为数字(Number)5),Number==Boolean布尔类型转为数字6),number==string,string转为number例如:5=='5'//为真7),string==Boolean转换为数字8),null===undefined结果为真console.log(null==undefined)//true9),null和undefined不等于任何其他数据类型console.log(null==0)//falseconsole.log(undefined==0)//false3,除了==是比较,===也是比较(绝对比较),如果数据类型不同,它们一定不相等。例如:console.log(0==false)//trueconsole.log(0===fasle)//falseconsole.log(5==”5”)//trueconsole.log(5===”5”)//falseconsole.log(null==undefined)//trueconsole.log(null===undefined)//false3.typeof(数据类型检测)typeof用于检测数据类型,用法:typeof+value要检查,返回一个包含数据类型字符的字符串("number","string","boolean","undefined","function","object")typeofnull返回“object”typeofundefined返回“undefine”d"虽然null和undefined都是number数据类型,但是typeof检测出来的值不是数字,不是同一个typeofnull。typeof[]的结果是"object"。regular和object检测类型是"object"typeofLimitation:不能具体查看object下的细分类型console.log(typeoftypeoftypeoftypeof[])//"string"这里打印"string"提示:因为typeof返回的值为字符串。如果两个或多个使用typeofs,返回值为"string"四、基本数据类型和引用数据类型的本质区别例:场景一:varnum1=12;varnum2=num1;num2++;console.log(num1);场景二:varobj1={"name":"张三"};varobj2=obj1;obj2.name="李四";console.log(obj1.name);Scenario第一个场景打印的值为12,取值第二种情况打印的是“Lisi”分析:基本数据类型的值是一个特定的值,这里varnum2=num1;也就是num1的值12赋给num2,在this时num2和num1的值也是12,但是和num1的num2的值没有关系,所以不管num2怎么变,num1都是12,不会变。引用数据类型存放的是数据内存的地址,varobj1={"name":"张三"}是开辟一块空间存放{"name":"张三"}的值,然后指向obj1到存储值的地址。此时varobj2=obj1,也就是将obj1指向的内存空间赋给obj2的地址给obj2,两者都指向同一个内存地址,对应同一个值。所以后面obj2改变内存空间中name的值后,obj1的值也会改变。写到最后,温习一下基础知识,发现以前一头雾水的知识瞬间好像明白了很多。比如上面提到的引用数据类型指向内存空间的地址。相位赋值运算后,运算赋值后的值会影响原值结果。所以才有了我们日常生活中经常用到的深拷贝和浅拷贝,就是为了避免改变两个值相互影响的情况;以前我最关心的是快速上手项目,学习框架的内容,却忽略了这些最基础的东西。当基础足够扎实,一切都会变得清晰起来。