📔
饥人谷前端体系课程笔记
黑马程序员笔记前端面试押题前端精进
  • 课程大纲
  • Git入门
    • 3. 软件安装详解
    • 4. Mac环境搭建
    • 5. 命令行入门
    • 6. 本地仓库
    • 7. Git远程仓库-GitHub
  • HTML全解
    • 8. HTML概览
    • 9. HTML标签
    • 10. HTML重难点
    • 11. HTML实践 & 手机调试
  • CSS全解
    • 12. CSS基础
    • 13. CSS布局(上)
    • 14. CSS布局(下)
    • 15. CSS定位
    • 16. CSS动画
  • HTTP全解
    • 17. URL 是什么
    • 18. 请求和响应 & Node.js Server
  • JS全解
    • 19. JavaScript概览
    • 20. 内存图与JS世界(精品课)
    • 21. Canvas 实践—画图板
    • 22. JS语法
    • 23. JS数据类型
    • 24. JS 对象
    • 25. JS 对象分类
    • 26. JS 数组
    • 27. JS 函数
    • 28. JS 实战,会动的代码
    • 29. JS运算符
    • 30. JS总结
  • JS编程接口
    • 31. DOM编程
    • 32. 手写DOM库
    • 33. JQuery中的设计模式(上)
    • 34. JQuery中的设计模式(下)
    • 35. DOM事件与事件委托
  • 项目 前端导航站点
    • 前端导航项目笔记
  • 前后分离
    • 40. AJAX的原理
    • 41. 异步与Promise
    • 42. 跨域、CORS、JSONP
    • 43. 静态服务器
    • 44. AJAX实战:Cookie、Session
  • JS进阶MVC
    • 48. MVC(上)
    • 49. MVC(中)
    • 50. MVC(下)
  • 项目构建
    • 51. Webpack(上)
    • 52. Webpack(下)
  • 算法与数据结构
    • 62. 伪代码与流程图
  • React全解
    • 75. React起手式
    • 76. React类组件和函数组件
    • 77. Class组件详解
    • 78. 函数组件
    • 79. Hooks原理解析
    • 80. Hooks各个击破
    • 81. 精通Redux
  • Node.js
    • 84. Node.js技术架构
    • 85. 文件模块
    • 86. 单元测试之文件模块
    • 87. 调试 Node.js 程序
    • 88. 静态服务器
    • 89. 命令行翻译工具
    • 90. 操作数据库
    • 91. 数据库基础知识
    • 92. Stream 流
    • 93. child_process
    • 94. 总结
  • TypeScript
    • 112. 基础
    • 113. 泛型
  • Next.js全解
    • Next.js 上
    • Next.js 下
  • ES6精讲
    • Promise,async/await
  • 大屏可视化笔记
    • 大屏可视化项目
  • SCSS全解
    • SCSS全解
  • 拓展
    • 一次性弄懂性能优化
    • Web性能优化
由 GitBook 提供支持
在本页
  • 23. JS数据类型
  • Unicode 与 UTF8
  • 数字与字符串
  • 功能不同
  • 存储形式不同
  • 如何存数字
  • 二进制
  • 10转2
  • 2转10
  • 用十六进制表示二进制
  • 为什么用十六进制
  • 如何存字符
  • 用0-127表示所有符号
  • 用0000~FFFF表示汉字
  • 中国人的名字里有生僻字
  • GBK国标扩
  • 万国码Unicode
  • 优点
  • 缺点
  • JS 数据类型
  • 7种(大小写无所谓)
  • 以下不是数据类型
  • 数字number
  • 写法
  • 特殊值
  • 正0和负0
  • 无穷大
  • 无法表示的数字
  • 64位浮点数
  • JS数字的存储形式
  • 64位存储一个number
  • 范围和精度
  • 范围(忽略符号位)
  • 精度(有效数字)
  • JS 字符串
  • 写法
  • 单引号
  • 双引号
  • 反引号
  • 注意
  • 转义
  • 错误写法
  • 正确写法
  • 用另一种写法表示你想要的东西
  • 多行字符串
  • 如果你想要在字符串里回车
  • 字符串的属性
  • 字符串的长度
  • 通过下标读取字符
  • string[index]
  • 注意index从0开始
  • 注意index到length
  • base64转码
  • 一般用来隐藏招聘启事里的简历
  • 有时候也用来自欺欺人
  • 布尔与 5 个 falsy 值
  • 下列运算符会得到bool值
  • if配合bool
  • 什么是falsy值?
  • undefined 与 null
  • var、let 与 const
  • 变量声明的三种方式
  • 区别
  • var变量提升
  • Var声明
  • let声明
  • const声明
  • 变量声明
  • name和'name'的区别
  • 总结
  • 类型转换
  • number => string
  • string => number
  • x => bool
  • x=> string 把任何东西变成字符串
  • 2020 年 6 月 JS 新增了一种类型:bigint

这有帮助吗?

  1. JS全解

23. JS数据类型

23. JS数据类型

Unicode 与 UTF8

数字与字符串

都是一,为什么要分1和'1'?

功能不同

数字是数字,字符串是字符串,要严谨

数字能加减乘除,字符串不行

字符串能表示电话号码,数字不行

存储形式不同

JS中,数字是用64位浮点数的形式存储的

JS中,字符串是用类似UTF8形式存储的(UCS-2)

如何存数字

十进制转二进制即可

二进制

10转2

31变成二进制

31=?∗25+?∗24+?∗23+?∗22+?∗21+?∗2031 = ?* 2^5 + ? * 2^4 + ? * 2^3 + ? * 2^2 + ? * 2^1 + ? * 2^031=?∗25+?∗24+?∗23+?∗22+?∗21+?∗20

经过一番尝试

31=0∗25+1∗24+1∗23+1∗22+1∗21+1∗2031 = 0* 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^031=0∗25+1∗24+1∗23+1∗22+1∗21+1∗20

所以31(十进制)= 01111(二进制)

不是套公式吗?程序员从来不套公式😊

2转10

100011变成十进制

每一位乘以2的N次方,然后加起来即可

100011=25+21+20=35100011 = 2^5 + 2^1 + 2^0 = 35100011=25+21+20=35

用十六进制表示二进制

为什么用十六进制

因为二进制写起来太慢了

记住8 4 2 1对应X X X X

从右往左每四位改写成一位:011110001011010

得到3 12 5 10;把大于9的数字改写成ABCDEF

于是得到3C5A

HEX表示16进制,BIN表示2进制

OCT表示8进制,DEC表示10进制

如何存字符

转成数字不就得了,但是注意,'1' 不能用1来表示

如何存储

用0-127表示所有符号

0表示结束字符

10表示换行

13表示回车

32表示空格

33-47表示标点

48-57表示数字符号

65-90表示大写字母

97-122表示小写字母

127表示删除键

用0000~FFFF表示汉字

一个16进制就是4个0/1位

FFFF就是4x4=16位,也就是两个字节

最多收录2^16=65536个字符

但只收录了6000多汉字,西文字母和日文假名

你的GB2312编号为C4E3

牛的GB2312编号为C5A3

中国人的名字里有生僻字

怎么表示生僻字、繁体字、韩文呢,之前的忘了编进去,怎么办呢?微软出手了,微软推出了一个国际扩展,简称GBK

GBK国标扩

含21886个汉字和图形符号,收录了中日韩使用的几乎所有汉字,完全兼容GB2312

依然使用16位(两字节)

后来国标局推出GB18030取代GBK,GB18030不兼容GB2312。

网页里有藏文,泰文怎么办呢?简单,继续编号,这回,一次解决全世界的需求

万国码Unicode

优点

已收录13万字符(大于16位),全世界通用

以后还会继续扩充,不会停止

最新版只添加了一个字,令和的合体字

缺点

两个字节不够用,每个字符要用三个及以上字节,这样所有文件都扩大50%,不划算。那怎么办?虽然用Unicode,但存的时候偷懒,这样行不行,UTF-8就被发明出来了。

UTF-8的8是指最少可以用8位存一个字符。

JS 数据类型

7种(大小写无所谓)

数字number

字符串string

布尔bool

符号symbol

空undefined

空null

对象object

总结:四基两空一对象

以下不是数据类型

数组,函数,日期

它们都属于object

数字number

64位浮点数

写法

整数写法:1

小数写法:0.1

科学计数法:1.23e4

八进制写法(用得少):0123或001234或0o123

十六进制写法:0x3F或者0X3F

二进制写法:0b11或0B11

特殊值

正0和负0

都等于0,要严谨

无穷大

Infinity,+Infinity,-Infinity

1/0
Infinity

1/+0
Infinity

1/-0
-Infinity

无法表示的数字

NaN(Not a Number)

但它是一个数字(讲一下历史)

NaN == NaN //false
NaN === NaN //false

64位浮点数

JS数字的存储形式

浮点就是浮动的点,意思就是小数点会乱动

123.456可以表示为1.23456e10^2

也可以表示为12345.6e10^-2

64位存储一个number

符号占1位

指数占11位(-1023~1024)

有效数字占52位(开头的1省略t)

范围和精度

范围(忽略符号位)

指数拉满,有效数字拉满,得到最大二进制数字

Number.MAX_VALUE:1.7976931348623157e+308

指数负方向拉满,有效数字最小1,得到最小值

Number.MIN_VALUE:5e-324

精度(有效数字)

最多只能到52+1个二进制位表示有效数字

2^53对应的十进制是9后面15个零

所以15位有效数字都能精确表示

16位有效数字如果小于90开头,也能精确表示

9110000000000001就存不下来

JS 字符串

每个字符两个字节(JS字符串用的阉割版UTF8)

写法

单引号

'你好'

双引号

"你好"

反引号

`你好`

注意

引号不属于字符串的一部分,就像书名号不属于书名的一部分一样

如果要在单引号里面包含单引号怎么办?

转义

错误写法

'it's ok'

JS引擎会认为'it'就结束了,后面的看不懂

正确写法

'it\'s ok'//这就是转义
"it's ok"
`it's ok`//万能方法反引号,反引号里面要加反引号,只能加\反斜杠

用另一种写法表示你想要的东西

下面这行要死记硬背记下来

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

多行字符串

如果你想要在字符串里回车

let s = `这样是
可以的
用反引号很容易做到`

以前没有反引号的时候,写起来很麻烦,可以看网道教程

字符串的属性

等等,对象才有属性,为什么字符串也有属性?要等学完对象才能解答

字符串的长度

sring.length

'123'.length //3
'\n\r\t'.length//?
''.length //0
' '.length //1 空格也是字符串
'\\\\\\'.length //3

通过下标读取字符

string[index]

let s = 'hello';
s[0] //"h"

注意index从0开始

s[0]是第一个字符

注意index到length

let s = 'hello'
s[5] //undefined,居然不报错
s[4] //'o'

base64转码

window.btoa

正常字符串转为Base64编码的字符串

window.atob

Base64编码的字符串转为原来的字符串

一般用来隐藏招聘启事里的简历

邮箱:

有时候也用来自欺欺人

所谓的“加密”,也就骗过一部分外行

布尔与 5 个 falsy 值

布尔只有两个值,true和false,注意大小写

下列运算符会得到bool值

  • 否定运算:!value

  • 相等运算:1 == 2, 1!=2, 3 === 4, 3 !==4

  • 比较运算:1 > 2, 1 >=2 , 3 < 4, 3<=4

if配合bool

if语句常常需要判断真假,比如

if(value){
...
}else{
...
}

那么问题来了,如果value是bool值还好说,如果value不是bool值咋办,谁真谁假,

  • 1是真还是假(真),0是真还是假(假)

  • '1'是真还是假(真,因为不是空的字符串), '0'是真还是假(真,同理)

于是就有了falsy值。

什么是falsy值?

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

  • undefined

  • null

  • 0

  • NaN

  • ''(空的字符串,内部什么都不包含)

⚠️''和' '是不一样的,一个是空字符串,一个是空格字符串

undefined 与 null

undefined null是两种空类型,那么为什么会有两种空类型呢?这就是JS的垃圾之处。

两者没有本质的区别,但是有如下细节上的差异:

  1. 如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是null

  2. 如果一个函数,没有写return,那么默认return undefined,而不是null

  3. 前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为null,仅仅是习惯上而已

Symbol符号,不怎么常用的数据类型,直接看方方的博客文章

https://zhuanlan.zhihu.com/p/22652486

var、let 与 const

变量声明的三种方式

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

区别

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

var变量提升

押题时再讲,有兴趣可以提前看网道教程。

Var声明

直接跳过,我们写代码不用var,面试押题前单独讲解

let声明

  • 遵循块作用域,即使用范围不能超出{}

{
let b = 1
console.log(b)
}
console.log(b) 
//这里会报错,说b is not defined
//uncaught referenceError: b is not defined
  • 不能重复声明

let a = 1
let a = 2
//uncaught syntaxerror: Identifier 'a' has already been declared
  • 可以赋值,也可以不赋值

  • 必须先声明再使用,否则报错

{
console.log(b)
let b = 1
}
//uncaught ReferenceError:cannot access 'b' before initializtion
  • 全局声明的let变量,不会变成window的属性,但是如果用var,可以变成window的属性

let abc = 'abc'
window.abc//undefined
var abc = 'abc'
window.abc // "abc"

let把var的毛病都改掉了

  • for循环配合let有奇效

for(var i = 0;i < 5; i++){
	setTimeout(()=>console.log(i),0)
}

//这里会打出5个5
for(let i = 0;i < 5; i++){
	setTimeout(()=>console.log(i),0)
}
//会依次打出0 1 2 3 4 

const声明

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

变量声明

指定值的同时也指定了类型,但是值和类型都可以随意变化

var a = 1
a = 2
a = '字符串'

name和'name'的区别

  • name是变量:值可变

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

总结

六种类型(大小写无所谓)

undefined

null

number

string

bool

symbol

这些都是简单类型:只有object叫做复杂类型。

类型转换

number => string

String(n)
n + ''

string => number

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

x => bool

Boolean(x)
!!x
!!1 //true
!!0 //false

x=> string 把任何东西变成字符串

String(x)
x.toString()

特殊情况

1.toString()
//会报错,会把1.后面的东西当成小数点
//uncaught SyntaxError: Invalid or unexpected token
//怎么避免呢?请看下面
(1).toString()

更好玩情况

1..toString()
//1
//会把1..当成1.0

方方推荐的博客:JS秘密花园。

https://bonsaiden.github.io/JavaScript-Garden/zh/

2020 年 6 月 JS 新增了一种类型:bigint

目前 bigint 用得很少。面试也基本不考,工作中也较少用到。因为太新了。

上一页22. JS语法下一页24. JS 对象

最后更新于3年前

这有帮助吗?

关于 bigint 的详细介绍,请看 。

MDN
Screen Shot 2021-12-27 at 11.26.44 AM
Screen Shot 2021-12-27 at 8.52.17 PM
Screen Shot 2021-12-27 at 8.33.41 PM
Screen Shot 2021-12-27 at 8.34.00 PM
Screen Shot 2021-12-28 at 10.13.51 AM