跳到主要内容

数据类型

  1. Number
  2. String
  3. Bool
  4. Symbol (ES6新增)
  5. Undefined
  6. Null
  7. Object

总结为:四基两空一对象

可以通过typeof()查询数据类型

typeof('123')
"string"

编码

Unicode 万国码

全球通用,不断更新。详细可看:编码简史

ASCII ---> GB2312 ---> GBK ---> GB18030 / DBCS ---> Unicode

UTF-8是一种针对Unicode的可变长度字符编码,也是一种前缀码,最初由肯·汤普逊和罗布·派克提出。是在互联网上使用最广的一种 Unicode 的实现方式。

其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示)

⚠️注意:UTF-8 只是 Unicode 的实现方式之一

目前包含全球的字符约13万个,而使用的码点数则在2^21 = 2,097,152

UTF-8 编码

UTF-8_undo

如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表

**UTF-8 优势:**Unicode 没有规定字符对应的二进制码如何存储。假如完美支持中文,那么字符必须按3个字节存储,要达到全球通用需要使用5个字节存储,使用可变编码的方式可大量减少内存空间

数字“1”的编码 UTF-8: 31 // 00110001

文字“儞”的编码 UTF-8: E5 84 9E // 11100011 1001000 10000010


程序常用的编码

0 ---> 结束字符 10 ---> 换行 13 ---> 回车 32 ---> 空格 3347 ---> 标点 4857 ---> 数字符合 6590 ---> 大写字母 97122 ---> 小写字母 127 ---> 删除键

参考

阮一峰:字符编码笔记

彻底弄懂Unicode编码


Number类型

数学是抽象的艺术,+0、-0、0三者看起来一样的值,定义却完全不一样

数值的历史进程

农耕社会需要计数:正整数 ---> 1,2,3...(没有”0“的概念) 没有所得物的时候:啥也没有 ---> 0 缺少某种东西,需要他人帮助:借 ---> -1,-2,-3... 分数 ---> 1/2 无理数 ---> π ...... ... 数学的定义随着时代发展而更新迭代,有很多未知的定义未被发掘 JS「NaN」的定义:以目前的知识难以解析的「数值」都称为 NaN (not a number)

所以 1 与 '1' 不是同一概念,从计算机设别的二进制编码的。

JS存储64位的浮点数

有效数字 2^52,大概是十进制的15位。

JS 的 number 全都是以小数(浮点数)的形式存储的,没有单独的整数,还有更多 JS 的延伸可以看JS秘密花园

// 以下函数可以查看最大和最少数字
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324

String 字符串

三种写法'' "" ``

特殊符号需要转义\,如回车'\n'

⚠️注意单个字符转义后的长度仍然为1个,如 \n\t\r 长度为3个

字符串的属性

长度:string.length

下标:string[0]

Base64 转码:

window.btoa(`123`);        // MTIz
Window.atob(`MTIz`); // '123'

Boolean 布尔

它是只有两种值的原始类型

布尔数据类型主要与条件语句相关系,条件语句通过根据开发人员指定的条件式,更改程序控制流来允许评估语句的运算值为真或假(即条件成立或不成立)。

1 === 3
// false

JS中有**五个falsy,**相当于false,但不是false的值

undefinednull0NAN''

Symbol 组件

Symbol 是ES6新增的第七种基本数据类型,凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

let s1 = Symbol('a');
let s2 = Symbol('a');
typeof(s1); // symbol

s1 === s2; // false
s1.toString() === s2.toString() // true

较少使用,延伸阅读:网道


Object 对象

对象是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

let obj = {
'name' : 'aziz',
'age' : 18
}

即便 key 为数字,也只能是字符串。

var obj = {
'name' : 'aziz',
0xff : 255, // 特殊值,不加引号会被自动转成‘数值’然后再转为‘字符串’
'0xff' : 255
}

/* console输出
obj
{255: 255, name: "aziz", 0xff: 255}
0xff: 255
255: 255
name: "aziz"

Object.keys(obj)
(3) ["255", "name", "0xff"]
0: "255"
1: "name"
2: "0xff"
length: 3
*/

Undefined 与 Null

这两个类型在很多情况表达的意思相近,可以理解为空、无、未定义等等

var a  // undefined 默认值的空,null 为主动的空

数据类型转换

number ---> string

let a = 123;
String(a);
n + ''

string ---> number

let s = '123';
Number(s);
parseint(s);
parseFloat(s);
s - 0;
+s

x ---> bool

Boolean(x);
!!x; // !代表取反值,!! 代表取反反值,正是原来的值

x ---> string

true.toString();		// true
false.toString(); //false
1.toString(); //

end.