高级js学习(2)数据类型

数据类型的一些细节

1 number

  • Js的number包括整数,浮点数,正数,负数,0.
  • NaN(not a number)他表示不是一个有效的数字,但是它隶属于number类型。如:在这里插入图片描述
    NaN和任何值都不相等,包括自身。
  • isNaN(val)用来检测val不是一个有效的数字。如果不是一个有效的数字则为true,否则为false。其次,如果val不是Number类型,会先隐式转换为number类型,再进行检测。如在这里插入图片描述
  • Object.is(a,b)是es6中提供的方法,不兼容ie浏览器,它可以正确的判断两个值是否相等,包括NaN, -0 !== +0。如在这里插入图片描述
  • InIfinty表示无穷大的值(也是一个普通的number类型),-Infinty表示负无穷大的值。

2 Symbol

  • symbol可以用来创建唯一值,不能作为构造函数使用。Symbol(‘aa’)也是创建一个唯一值,只不过加上了标记。
  • 用法:给对象设置唯一属性,对象的成员只能是string和symbol,其他类型的属性会被转化为string类型。Map是允许属性有不同类型的。
  • 他是很多内置机制的实现方式。Symbol.toStringTag。。。。

3 BigInt

  • js中的大数。js能表示的安全数字范围是
    在这里插入图片描述
    超过这个范围,值的运算就不够准确,所以BigInt就是用来解决大数问题的。
  • BigInt不能作为构造函数使用。他的用法是:
  • BigInt(‘xxx’)就会将xxx转化为大数,后面加个n表示是bigInt类型。
    在这里插入图片描述
    运算也是一样。在这里插入图片描述
    可以正常的完成运算,一个大数后面只要带一个字符串n,就表示是一个BigInt类型。
    转换就是基于toString去掉n转为string,
    在这里插入图片描述
    一般BigInt的作用是跟服务端做交互。数据库是基于longInt的。

数据类型转换

转化为number类型

  • Number(xx)
    规则:
  1. 默认的隐式转换都是这个。
  2. 把字符串转为数字,空字符串变为0,如果出现任何一个非有效数字字符,结果均为NaN。如
    在这里插入图片描述
  3. true为1,false为0
  4. null为0,undefined为NaN
    在这里插入图片描述
  5. Symbol无法转换为数字,会报错。
  6. BigInt去除n,超过安全数字的,会按照科学计数法处理。
    在这里插入图片描述
  7. 转换对象,步骤是先调用对象的Symbol.toPrimitive方法,如果不存在,再调用对象的valueOf方法,如果返回的不是原始值,再调用toString方法,如果还不是原始值类型,则报错。如果返回的是string类型,再基于字符串用Number进行转换。
    在这里插入图片描述
    整体步骤如图。数组也是一样的。
    在这里插入图片描述
    对于日期对象,他有Symbol.toPrimitive这个方法,所以优先调用该方法。
 obj[Symbol.toPrimitive] = function(int){
    
    
           // int的值可以是 number / string / default 浏览器自己调用这个方法,会默认传递的实参。
        }  

对于原始值对象,如在这里插入图片描述
其步骤都是一样的。

  • parseInt , parseFloat
    一般用于手动转换。
    规则:
  1. parseInt(val, radix) ,val的值必须是一个字符串,如果不是则会先转为字符串!然后从字符串左侧第一个字符开始查找,把有效的数字最后转为数字类型,遇到第一个非有效数字,无论后面是否还有有效数字,都不会再寻找。
  2. 而parseFloat(val)的规则也是如此,不过它可以多识别一个小数点,遇到小数点不会停止,而是继续往下查找,所以其对于null undefined都是NaN。如
    在这里插入图片描述
    在这里插入图片描述
    再看个例子:
    在这里插入图片描述
    其实他的执行顺序应该是:
    parseInt(1,0)
    parseInt(‘3px’, 1)
    parseInt(4, 2)
    parseInt(null, 3)
  • 第二个值表示转换的进制。不写或者0就表示十进制,如果第一个值是0x开头的字符串,默认就是16进制。
  • 取值范围为2-36,若不是,都会转化为NaN。
  • 在第一个参数中,从左到右,找到符合radix进制的值,遇到不符合的会结束查找,把找到的值,看作是radix进制,最后转为10进制。如上面的parseInt(4,2)他是把4先转为字符串了,然后再把4当作是2进制,发现2禁止中根本没有4,所以转换不了,返回NaN。
  • 再比如,parseInt(‘10’,2),10被当作二进制来看了,2的二进制就是10,所i转换出来的结果就是十进制的表示i形式2。
  • 最后,其他进制的值转换为10进制的规则是:‘按权展开求和’
    如:
    在这里插入图片描述
    001是符合二进制的,而4不行,001转成十进制的规则就是:
    02^2 + 02 ^1 + 120 = 1
    再如
    在这里插入图片描述

就是 14^2 + 04 ^1 + 1*4 ^0 = 17
再如:有小数点的
(1 * 3 ^1) + (2 * 3^ 0 )+ (2 * 3 ^ -1 )+ ( 1 *3^-2 )= 5

隐式转换

  • ==比较的时候两边的隐式转换。作 = =比较的时候,需要先转换为相同类型,再比较。 = ==不会转换,类型不同则为false。
  • ==比较的情况:
  1. 对象==字符串,对象转为字符串,就是Symbol.primitive/valueOf/toString
  2. null == undefined 结果为true, null/undefined与其他的值都不相等
  3. 对象==对象。比较的是内存的地址。
  4. NaN == NaN =>false
    除了以上四种情况,其他情况的 = = 作比较(两边类型不同)都是转为数字。
    如 [] = = false 和![] = =false的结果都为true,因为都会调用转成数字先。
    [] 调用Symbol.primitive,没有这个方法,调用valueof为0,False=>0,所以为true.
    ![]数组取反,只有null/undefined/0/NaN/空字符串转为boolean才会true,其他均为false ,![],将[]转为boolean为true,取反为false,刚好= = false,所以未true。

Guess you like

Origin blog.csdn.net/lin_fightin/article/details/120408163