JavaScript:数据类型和运算符

377 阅读2分钟

数字和字符串

  • 1 和 ‘1’ 不同

存储形式不同

  • JS中,数字是用64位浮点数的形式存储的
  • 字符串是用类似 UTF8 形式存储的(UCS-2)

如何存数字

十进制转二进制

  • 31(十进制)= 01111(二进制)
  • 用2的次幂去找

二进制转十进制

  • 转成二的N次幂加起来

用十六进制表示二进制

  • 记住 8 4 2 1 对应 X X X X
  • 从左往右每四位改写成一位
  • HEX 表示 16进制,BIN 表示 2进制
  • OCT 表示 8进制,DEC 表示 10进制

image.png

图片来源:饥人谷

如何存字符

用编号表示

  • 0 表示结束字符
  • 10 表示换行
  • 13 表示回车
  • 32 表示空格
  • 33到47 表示标点
  • 48到57 表示数字符号
  • 65到90 表示大写字母
  • 97到122 表示小写字母
  • 127 表示删除键

image.png

怎么表示中文

  • 中国国家标准局 编号:国标2312(16位两个字节)
  • 微软退出了一个国标扩展,简称:GBK(繁体字、中日韩)

Unicode

  • 优点
    • 已收录13万字符(大于16位),全世界通用
    • 以后还会继续扩充,不会停止
  • 缺点
    • 两字节不够用,每个字符要用三个及以上字节
    • 所有文件扩大50%

JS中的数据类型

7种(第8种,BigInt)

  • 数字 number
  • 字符串 string
  • 布尔 bool
  • 符号 symbol
  • 空 undefined
  • 空 null
  • 对象 object
  • 总结:四基两空一对象

以下不是数据类型

  • 数组、函数、日期
  • 他们都属于 object

bool 值

  • true or false
  • 否定运算
    • !value
  • 相等运算
    • 1 == 2 、 1 != 2 、 3 === 4 、 3 !== 4
  • 比较运算
    • 1 > 2 、 1 >= 2 、 3 < 4 、 3 <= 4
  • if 配 bool
    • if(value){...}else{...}
  • 注意
    • 如果 value 是 bool 值还好说
    • 如果 value 不是 bool 值
    • 除了 falsy 值和 false 以外,其他都为真
  • 五个 falsy 值
    • undefined
    • null
    • 0
    • NaN
    • ''

undefined 和 null 两种空类型

  • 区别 没有本质区别:
  • 如果一个变量,但没有赋值,那么默认值就是 undefined,而不是 null
  • 如果一个函数,没有写 return,那么默认 return undefined,而不是null
  • 习惯上,把非对象的空值写为 undefined,把对象的空值写为 null

number (数字:64位浮点数)

  • 整数写法
    • 1
  • 小数写法
    • 0.1
  • 科学计数法
    • 1.23e4
  • 八进制写法(用得少)
    • 0123 或 00123 或 0o123
  • 十六进制写法
    • 0x3f 或 0X3F
  • 二进制写法
    • 0b11 或 0B11

特殊值

  • 正0 和 负0
    • 都等于0,要严谨
  • 无穷大
    • Infinity、+Infinity、-Infinity
  • 无法表示的数字
    • NaN(Not a Number)

64位浮点数

  • 数字的存储形式
    • 浮点就是浮动的点,意思就是小数点会乱动
    • 123.456 可以表示为 1.23456e10^2
    • 也可以表示为 12345.6e10^-2
  • 64位存储一个 number
    • 符号占 1 位
    • 指数占 11 位(-1023~1024)
    • 有效数字占 52 位(开头的 1 省略)

范围和精度

  • 范围(忽略符号位)
    • 指数拉满、有效数字拉满,得到最大二进制数字
    • Number.MAX_VALUE: 1.7976931348623157e+308
    • 指数负方向拉满、有效数字最小1,得到最小值
    • Number.MIN_VALUE: 5e-324
  • 精度(有效数字)
    • 最多只能到 52+1 个二进制位表示有效数字
    • 2^53 对应的十进制是 9 后面 15 个零
    • 所以15位有效数字都能精确表示
    • 16位有效数字如果小于90开头,也能精确表示
    • 9110000000000001 就存不下来

字符串 string

写法

  • 单引号
    • '你好'
  • 双引号
    • "你好"
  • 反引号
    • 你好

转义

  • 用另一种写法表示你想要的东西
    • \' 表示 '
    • \" 表示 "
    • \n 表示换行
    • \r 表示回车
    • \t 表示tab制表符
    • \\ 表示 \
    • \uFFFF 表示对应的 Unicode 字符
    • \xFF 表示前 256 个 Unicode 字符

字符串的属性

  • 字符串的长度
    • '123'.length
    • '\n\r\t'.length
    • ''.length
    • ' '.length
  • 通过下标读取字符
    • string[index]
    let s = 'hello';
    s[0]  //"h"
    
  • 注意 index 从 0 开始
  • 注意 index 到 length
    let s = 'hello'
    s[5]  // undefined
    s[4]  // 'o'

symbol

基本上不怎么用

变量声明

三种声明方式

  • var a = 1
  • let a = 1
  • const a = 1
  • a = 1

区别

  • var 是过时的、不好用的方式
  • let 是新的,更合理的方式
  • const 是声明时必须赋值,且不能再改的方式
  • 最后这种方式 是错误的,不能这样声明

var 变量提升

let 声明

  • 规则
    • 遵循块作用域,即使用范围不能超出{}
    • 不能重复声明
    • 可以赋值,也可以不赋值
    • 必须先声明再使用,否则报错
    • 全局声明的 let 变量,不会变成 window 的属性
    • for 循环配合 let 有奇效

const 声明

  • 规则
    • 跟 let 几乎一样
    • 只有一条:声明时就要赋值,赋值后就不能改

变量声明

  • 指定值
    • var a = 1
  • 同时也指定了类型
    • var a = 1
  • 但是值和类型都可以随意变化
    • a = 2
    • a = '字符串'

类型转换

number => string

  • String(n)
  • n + ''

string => number

  • Number(s)
  • parseInt(s) / parseFloat(s)
  • s - 0
  • +s

x => bool

  • Boolean(x)
  • !!x

x => string

  • String(x)
  • x.toString()

BigInt

  • 是一种内置对象,用来表示大于2^53 - 1的整数
  • 不能用于Math对象中的方法
  • 不能和任何Number实例混合运算,两者必须转换成同一类型,但是BigInt转成Number会丢失精度

简单记一下,后面再补充