字符编码、JS数据类型、变量声明、类型转换

推荐阅读: 我用了两个月的时间才理解 let - 知乎

字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志

JS 中的数据类型

7 种

  • 数字 number
  • 字符串 string
  • 布尔 bool
  • 符号 symbol
  • 空 undefined
  • 空 null
  • 对象 object

    总结: 四基两空一对象

以下不是数据类型

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

数字 number(64 位浮点数)

写法

  • 整数写法: 1
  • 小数写法: 0.1
  • 科学计数法: 1.23e4
  • 八进制写法: 0123 或 00123 或 0o123
  • 十六进制写法: 0x3F 或 0X3F
  • 二进制写法: 0b11 或 0B11

特殊值

  • 正 0 和负 0: 都等于 0,要严谨
  • 无穷大: Infinity、+Infinity、-Infinity
  • 无法表示的数字: NaN(Not a Number), 但它是一个数字
NaN === NaN;

false;

64 位浮点数

JS 数字的存储形式:

符号占 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 就存不下来

字符串

每个字符两个字节(阉割版 UTF8)

转义

  • \’表示
  • \n 换行
  • \r 回车
  • \t 制表符
  • \\ 表示 \
  • \uFFFF表示对应的 Unicode 制表符
  • xFF表示前 256 个 Unicode 字符

多行字符串

  • 如果你想要在字符串里回车:
let s = ` This should 
be fine, and it's easy to
make it 
`;
  • 以前没有反引号的时候 写起来很麻烦,可以看网道教程

base64 转码

  • window.btoa 正常字符串转为 Base64 编码的字符串
  • window.atob Base64 编码的字符串转为原来的字符串
  • 一般用来隐藏招聘启事里的简历:
邮箱: emhpeGl1a2FuZ0BnbWFpbC5jb20=

邮箱: zhixiukang@gmail.com
  • 有时候也用来自欺欺人(所谓的加密 🙅‍♂️)

布尔 boolean

五个 falsy 值

falsy 就是相当于 false 但又不是 false 的值。分别是:

  • undefined
  • null
  • 0
  • NaN
  • ’’

undefined 和 null 两种空类型

JS 的垃圾之处

区别

  • 没有本质区别
  • 细节一: 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null
  • 细节二: 如果一个函数,没有写 return,那么默认 return undefined,而不是 null
  • 细节三: 前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null。

    但仅仅是习惯上而已

symbol 符号

不怎么常用的数据类型

直接看这篇文章


变量声明

变量声明的时候,既指定了值,同时也指定了类型。但是值和类型都可以随意变化。

三种声明方式

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

区别

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

    不准 🙅‍♂️ 用 var, 请用 let

var 变量提升

可以看网道教程

let 声明的规则

  • 遵循块作用域,即使用范围不能超出{}
  • 不能重复声明
  • 可以赋值,也可以不赋值
  • 必须先声明再使用,否则报错
  • 全局声明的 let 变量,不会变成 window 的属性
  • for 循环配合 let 有奇效:
for(var i = 0; i < 5; i++) {
	setTimeout(()=>{console.log(i)}, 0)
}
/*
	5
	5
	5
	5
	5
*/

for(let i = 0; i < 5; i++) {
	setTimeout(()=>{
		console.log(i)
	}, 0)
}
/*
	0
	1
	2
	3
	4
*/
}

const 声明的规则

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

类型转换

  • 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()

1.toString()// 不行
(1).toString() // 可以
1..toString() // 可以

JS 的其他奇葩事情,可以看JavaScript 秘密花园

comments powered by Disqus