《JS数据为什么需要类型》

652 阅读3分钟

比如数字与字符串

  1. 功能不同
  • 数字可以加减乘除,字符串不能;
  • 字符串可以表示能表示电话号码,数字不行
  1. 存储形式不同
  • JS中,数字是64位浮点数的形式存储;
  • JS中,字符串是用类似UTF-8形式存储的(ucs-2).

问题是数字怎么存储呢

  • 十进制转二进制即可(怎么转呢)
  • 10 转 2

31 变成二进制 image.png

经过一番尝试 image.png

所以 31(十进制) = 01 1111(二进制)

  • 2 转 10 100011 变成十进制 每一位乘以 2 的 N 次方,然后加起来即可

100011 = 2^5 + 2^1 + 2^0 = 35

  • 16 表示 2 为什么用十六进制
    因为二进制写起来太慢了:011110001011010
    记住 8 4 2 1 对应 X X X X
    从右往左每四位改写成一位: 011 1100 0101 1010
    得到 3,12,5,10;把大于9的数字改为ABCDEF
    于是得到 3C5A,你也可以用计算器的程序员模式
    HEX 表示 16 进制,BIN 表示 2 进制
    OCT 表示 8 进制,DEC 表示 10 进制

如何存字符呢

简单,将字符转成数字即可
用 0~127 表示所有符号

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

中文的存储utf-8

存储「a 」
a 对应的 Unicode 编号为 97,十六进制为 61
Unicode 直接存: 0000000000000000‭01100001‬
UTF-8偷懒存法: 01100001
三字节变一字节,比GBK 还省
存储「你」
你对应的 Unicode 编号为 4F60
Unicode 直接存: 00000000‭0100111101100000‬
UTF-8偷懒存法: ‭111001001011110110100000‬
还是三字节,没有省,但是字母都能省一点
UTF-8 中的 8 的意思是
最少可用 8 位存一个字符

js中8大数据类型

  • 基本数据类型: String 字符串
    Number 数字
    Boolean 布尔
    Null 空
    Undefined 空
    Symbol(ES6 中新增了。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。)
  • 引用数据类型: Object【Object是个大类,function函数、array数组、date日期…等都归属于Object】
  • 谷歌67版本中还出现了一种 bigInt。是指安全存储、操作大整数。

5个falsy值

falsy 就是相当于 false 但又不是 false 的值
分别是 undefined null 0 NaN ''

Null与Undefined的区别

  • 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null
  • 如果一个函数,没有写 return,那么默认 return undefined,而不是 null

三种变量声明

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

  • var 是过时的、不好用的方式

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

  • const 是声明时必须赋值,且不能再改的方式 跟 let 几乎一样
    只有一条不一样:声明时就要赋值,赋值后不能改

name 和 'name' 的区别

  • name 是变量 值可变,可能是 'name',也可能是 'hello' 'name' 是字符串常量
  • 常量就是不变量 'name' 只能是 'name',不能是其他值

类型转换

  • number => string String(n)
    n + ''
  • string => number Number(s)
    parseInt(s) / parseFloat(s)
    s - 0
  • x => bool Boolean(x)
    !!x
  • x => string String(x)
    x.toString()