1 数字与字符串
- 都是一,为什么要分1和'1'
- 功能不同
数字是数字,字符串是字符串,要严谨
数字能加减乘除,字符串不行
字符串能表示电话号码,数字不行 - 存储形式不同
js中,数字是用64位浮点数的形式存储的
js中,字符串是用类似UTF8形式存储的(UCS-2)
2 如何存数字
十进制转二进制
二进制
- 10转2
31变成二进制31=?x2^5 + ? X2^4 + ? X 2^3 + ? X 2 ^ 2 + ? X 2 + ? X 2 ^ 0
31变成二进制31=0x2^5 + 1 X2^4 + 1 X 2^3 + 1 X 2 ^ 2 + 1 X 2 + 1 X 2 ^ 0
所以31 (十进制)= 01111(二进制) - 2转10
100011变十进制
每一位乘以2的N次方,然后加起来就可
100011 = 2 ^ 5 + 2 ^ 1 + 2 ^0 = 35 - 用十六进制转二进制
011110001011010
从右往左每四位改写一位:011
11000101
1010
得到3,12,5,10;大于9的用ABCDEF
于是得到3C5A
用0~127表示所有符号
0 表示结束字符
10 表示换行
13 表示回车
32 表示空格
33~ 47 表示标点
48~57 表示数字符号
65~90 表示大写字母
97~122 表示小写字母
127 表示删除键
Unicode
1 优点
- 已收录13万字符(大于16位),全世界通用
- 以后会继续扩充,不会停止
2 缺点 - 两个字节不够用,每个字符要用三个及以上字节
- 这样所有文件都扩大50%
3 utf-8
存储[a]- a对应的Unicode编号为97,十六进制为61
- Unicode直接存:00000000 00000000 01100001
- UTF-8: 01100001
- 三个字节变一个字节,比GBK省
3 JS的数据类型
7种(大小写所谓)
1 数字 number (64位浮点数组成)
1 表示方法
整数 1
小数 0.1
科学计数 1.2e4
八进制 0123 或者 00123 或者 0o123
十六进制 0X3F或者0x3F
二进制 0b11 或者 0B11
特殊值
+0
、-0
、NaN
(一个数字 not a number)、Infinity
、+Infinity
、-Infinity
NaN !== NaN
2
123.456可以表示为1.23456e10^2
也可以表示为 12345.6e10^-2
符号占一位
指数占11位(-1023~1024)
有效数字占52位(开头的1省略)
3 范围和精度
3.1 范围
- 指数、有效数最大,得到最大的二进制数字
- Number.MAX_VALUE: 1.7976931348623157e+308
- 指数、有效数最大,得到最小二进制数字 5e-324
3.2 精度
最多只能有52+1个二进制位表示有效数字
2^53对应的十进制是9后面15个零
所以15位有效数字都能精确表示
16位有效数字如果小于90开头,也能精确表示
2 字符串 string
1 写法
- 单引号
'你好'
- 双引号
"你好"
- 反引号
`你好`
引号不属于字符串的一部分
'it\'s ok'
"it's ok"
`it's of`
2 转义
- \’表示'
- "表示"
- \n表示换行
- \r表示回车
- \t 表示 tab制表符
- \ 表示 \
- \uFFFF 表示对应的Unicode字符
- \xFF 表示前256个Unicode字符
3 字符串属性
string.length
"abc".length
string[index]
"abc"[0]//a
base64转码
window.btoa
正常字符串转为base64
window.atob
base64转正常字符串
3 布尔 bool
只有两个值true和false
if语句需要判断真假
if(value){} else {}
问题来了
- value是bool
- value不是bool值
- 1是真还是假,0是真还是假
- '1'是真还是假的,'0'是真还是假的
五个falsy值
falsy就是相当于false的值但不是false
undefined、null、0、''、NaN
4 符号 symbol
5 空 undefined 和 空 null
没有本质区别
一个变量声明后,没有赋值,默认值是undefined
一个函数执行完成后,没有返回值,那么默认返回undefined
6 对象 object
数组、函数、日期都是对象
数据转换
字符串转数值
var n = 1;
String(n)
// 或者
n + ''
数值转字符串
var str = '123'
parseInt(str);
// 或者
str - 0;
// 或
+str;
转为bool
let a;
!!a;
转string
true.toString
false.toString
1..toString
更多js秘密
4 变量声明
1 三种声明的方式
var a = 1
let a = 1
const a = 1
区别
- var是过时的、不好的方式
- let 是新的、更合理的方法
- const是声明时必须赋值、且不能再改方式
var变量提升
a = 1;
console.log(a);
var a;
let
- 遵循块作用域,即使用不能超出块
{
let b = 1;
}
console.log(b)// 超出块级作用域
- 不能重复声明
let a = 1;
let a = 2;//错误写法
- 可以赋值,也可以不赋值
let a = 1;
let b;
- 必须先声明,再使用
console.log(v);// 报错
let v;
- 全局声明let变量,不会变成window的属性
- for 配合let使用
for(let i = 0; i < 5; i++){
setTimeout(
() => {
console.log(i)
}
)
}
for(var i = 0; i < 5; i++){
setTimeout(
() => {
console.log(i)
}
)
}
const
1 规则
与let几乎一样
必须在声明时赋值,但是无法修改值
变量声明
指定了值,同时指定了类型,但是值和类型都可以随意变换
var a = 1
a = 'string'