javascript数据类型(一)

计算机程序的运行很多时候都需要对值进行操作,在这个过程,需要对值进行一定的抽象(类似将值进行归类,123,345这种就被归类为数字),抽象之后就有了数据类型的概念。

在编程语言中,能够表示并操作的值的类型称作数据类型(犀牛书的解释)

计算机程序运行过程中需要通过变量对值进行保存,变量声明有三个关键字(var,let,const),目前基本上都用let和const,因为var存在一些问题(这些问题在作用域的时候再进行细说)。还需要注意的一点,js是动态类型语言,不用给任何变量指定数据类型,语言会在第一次赋值给变量的时候,在内部将数据类型记录下来,没有赋值之前默认给undefined。

javascripe当中数据类型只有两种,基本类型和对象。

基本类型:number,string,boolean,null,undefined,symbol

对象:Array,Date,RegExp,Map和WeakMap,Set和WeakSet

1.Number

js可以支持二进制,十进制,十六进制,八进制(严格模式下不支持,所以一般不建议用)

js实际的操作是基于32位整数,浮点数值的最高精度是17位,在浮点数值计算时会产生四舍五入误差的问题,比如0.1+0.2 !==0.3的问题。解决方案:

function strip(num,precision = 12){
	return parseFloat(num.toPrecision(precision))
  // Number.toPrecision(param) 返回包含param位有效数字(1-21)的数字字符串,最后一位四舍五入处理,如果忽略参数,则调用toString()来将当前数字转为一个十进制的值
  // toFixed() 返回一个数字的字符串格式,四舍五入或补0
  // parseFloat 将一个字符串转成数字,只解析十进制数,parseFloat('111a')->111
  // parseInt 将一个字符串转成整数,第二个参数可以选择数制,会忽略字符串前面的空格
}

如果算术运算中溢出了,则输出Infinity,下溢时输出**-Infinity**,当运算结果没办法变成一个数字的时候,输出NaN。NaN是个六亲不认甚至连自己都不认的家伙,没有任何值与之相等,包括NaN本身,判断是否为NaN,用isNaN(x)。还有个类似的isFinite(x),在NaN,Infinity和-Infinity时为false,其他时候是true。

数值转换——将非数值转化为数值

数值转换基本上用三个函数,例子里已经写了两种(parseFloat()和parseInt()),还有一个是Number(),这个函数转换规则比较复杂,在此列举出来(详情请看红宝书)

  1. 如果是Boolean值,true->1, false->0
  2. 如果是数字,则是简单的传入和传出(要是前面有0,可能会被处理成八进制,前面有0x,处理成十六进制)
  3. null->0,undefined->NaN
  4. 字符串规则:
    1. 只包含数字,将其转换为十进制数值,忽略前后的空格,忽略前导0
    2. 包含浮点数或者有效的十六进制格式,转换成对应的数值,忽略前导0
    3. 空字符串->0
    4. 除此之外转化为NaN
  5. 如果是对象,调用对象的valueOf(),依照前面的规则转换返回的值,也是结果是NaN,则调用对象的toString(),再按照字符串转换规则进行 (Number([‘1111’]) // 1111)

此外,也可以借助简单的算术运算符进行转换,如+'111'->111, '111'*1->111

常用的一些数学函数,在数值处理的时候经常会用到:

  • Math.abs() // 取绝对值
  • Math.ceil() // 向上取整
  • Math.floor() // 向下取整
  • Math.max() / Math.min() // 取最大值和最小值
  • Math.pow(x,y) // 计算x的y次方
  • Math.random() // 计算随机数(0-1之间)
  • Math.round() // 取四舍五入的值
  • Math.sqrt() // 计算平方根

💖 BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值,是新出的数据类型

2.String

字符串由16位值组成的不可变的有序序列,字符通常来自Unicode字符集,通常用单引号,双引号和反引号(es6引入)来表示

let str1 = 'Hello';
let str2 = 'World';
let str3 = str1 +' '+ str2; // 'Hello World'
let str4 = `${str1} ${str2}` // 'Hello World' 模板字符串,比上面加号拼接会方便很多

字符串转换方法——将非字符串值转换为字符串

有两种方法,toString()和String()

数值,布尔值,对象和字符串值本身都有toString方法,null和undefined没有该方法,数值在调用toString()的时候,可以传参(数制,转换出来对应的数制的结果,e.g. 10.toString(16) //'a'

在不知道是不是null或者undifined的情况下,可以用String(),转换规则如下:

  1. 有toString()方法,调用toString()
  2. 没有的话,null->‘null’,undefined->‘undefined’

常用的一些方法

  • charAt() // 取出字符串中指定位置的字符

  • charCodeAt() // 取出字符串中指定位置的字符编码

  • String.fromCharCode() //为参数中传入的字符编码创建字符串

  • concat() // 将一个值或者多个值连成字符串

  • indexOf() /lastIndexOf() // 指定字符串中寻找对应字符或子串(从头/从尾部开始)

  • localeCompare() // 利用本地定义的顺序比较字符串

  • match() // 正则相关

  • replace() // 正则相关

  • search() // 在一个字符串中查找匹配某个正则表达式的子串

  • slice() // 返回字符串的一个切片或子串

  • split() // 将字符串分割成数组,默认用’,'隔开,可以自定义

  • substr(start,length) // 提取一个子串

  • substring(from,to) // 提取一个子串,和上面那个就是第二个参数不同

  • toLowerCase() /toUpperCase() // 字符串变大写/变小写

  • padStart()/padEnd() // 方法用另一个字符串填充当前字符串(如果需要的话,会重复多次),以便产生的字符串达到给定的长度。从当前字符串的左侧/右侧开始填充

    function firstUpper(i){
      return i.substring(0,1).toUpperCase()+i.substring(1).toLowerCase()
    } // 首字母大写的方法
    
  • trim() // 去除开头和结尾空格

Boolean

会被转换为false的值:0,-0,null,undefined,NaN,’’(空字符串)

通常boolean会和boolean运算符(&&,||,!)一起使用,详细的在运算符的时候再说

null和undefined

null可以理解为空指针,所以typeof null === 'object'

可认为undefined是表示系统级的,出乎意料的或者类似错误的值的空缺,而null是程序级的,正常的或者意料之中的值的空缺,所以声明之后没有赋值,或者函数没有返回值的时候会返回undefined,如果需要给某个声明参数一个空值的话,一般赋null。

Symbol

符号是es6的新特性,它代表一个唯一的标志,一经创建就是独一无二的,并不会匹配其他符号,一般用来声明一些独一无二,值的内容对程序没有影响(魔术字符串)的场景。

function switchType(type){
  switch(type){
    case 'Rect':
      return 'lalala';
    case 'Circle':
      return 'hahaha'
  }
}
switchType('Rect') 
// 这段代码中实际上Rect和Circle两个字符串和代码形成了强耦合,不利于将来的修改和维护

// after
const shape={
  rect:Symbol(),
  circle:Symbol() 
} // 因为shape.rect的值不管取啥,只要和circle取值不一样,对整个逻辑没有任何影响,所以可以用symbol代替
function switchType(type){
  switch(type){
    case shape.rect:
      return 'lalala';
    case shape.circle:
      return 'hahaha'
  }
}
switchType(shape.rect) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值