比如数字与字符串
- 功能不同
- 数字可以加减乘除,字符串不能;
- 字符串可以表示能表示电话号码,数字不行
- 存储形式不同
- JS中,数字是64位浮点数的形式存储;
- JS中,字符串是用类似UTF-8形式存储的(ucs-2).
问题是数字怎么存储呢
- 十进制转二进制即可(怎么转呢)
- 10 转 2
31 变成二进制
经过一番尝试
所以 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 表示所有符号
0 表示结束字符
10 表示换行
13 表示回车
32 表示空格
33到47表示标点
48到57表示数字符号
65到90表示大写字母
97到122表示小写字母
127表示删除键
中文的存储utf-8
存储「a 」
a 对应的 Unicode 编号为 97,十六进制为 61
Unicode 直接存: 000000000000000001100001
UTF-8偷懒存法: 01100001
三字节变一字节,比GBK 还省
存储「你」
你对应的 Unicode 编号为 4F60
Unicode 直接存: 000000000100111101100000
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()