编程很简单,只有对和错两种情况
数据为什么需要类型?
数字与字符串
都是一,为什么要分 1 和'1'
功能不同
- 数字是数字,字符串是字符串,要严谨
- 数字能加减乘除,字符串不行
- 字符串能表示电话号码,数字不行
存储形式不同
- JS 中,数字是用 64 位浮点数的形式存储的
- JS 中,字符串是用类似 UTF8 形式存储的(UCS-2)
- 数字是变成二进制直接存的,字符是要经过编码再变成数字再存起来。字符串'1'最终存的是 49,数字 1 存的就是 1
JS 中的数据类型
7 种(大小写无所谓)
- 数字 number
- 字符串 string
- 布尔 bool
- 符号 symbol(用得很少,忘掉也没关系)
- 空 undefined
- 空 null
- 对象 object
- 总结:四基两空一对象
以下不是数据类型
- 数组、函数、日期
- 它们都属于 object
数字 number——64 位浮点数
特殊值
正 0 和负 0
- 都等于 0,没区别,但只有一个时候有区别,1/0 得到 Infinity,1/-0 得到-Infinity
无穷大
- Infinity、+Infinity、-Infinity
无法表示的数字
- NaN(Not a Number)。比如 0/0,得到的是 NaN
- 但它是一个数字。从历史角度来讲,人类在发明负数、分数、有理数、无理数之前,这些数字都是 NaN,所以,NaN 不是不是数字,而是我们不知道它是什么数字,全人类都不知道它是什么数字。
- NaN==NaN,是 false。因为一个你不知道的数字和另一个你不知道的数字怎么相等
64 位浮点数
JS 数字的存储形式
- 浮点就是浮动的点,意思就是小数点会乱动
- 123.456 可以表示位 1.23456e10^2
- 也可以表示为 12345.6e10^-2
64 位存储一个 number
- 符号占 1 位(正数从 0 开始,负数从 1 开始,所以正存 0 负存 1)
- 指数占 11 位(-1023~1024)
- 有效数字占 52 位(开头的 1 省略)
字符串 string——每个字符两个字节(阉割版 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=`这样是
可以的
用反引号很容易做到`
以前没有反引号的时候,写起来很麻烦,可以自行了解一下以前怎么写,也可以不用了解
字符串的属性
等等,对象才有属性,为什么字符串也有属性
为什么字符串有属性
等学完对象就知道了
字符串的长度
string.length
- '123'.length // 3
- 'n\r\t'.length // 3
- ''.length // 0
- ' '.length // 1
注意:空字符串和空格字符串是不同的字符串,空和空格是两种不同的东西。严谨就可以学好 JS,一定要搞清楚,脑子不清楚是学不好 JS 的。
通过下标读取字符
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 编码的字符串转为原来的字符串
一般用来隐藏招聘启事里的简历
布尔 boolean——真或假
只有两个值: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'是真还是假
JS 有五个 falsy 值(再加一个 false,JS 一共有六个假值)
falsy 就是相当于 false 但又不是 false 的值
分别是 undefined null 0 NaN '',两个空两个数字一个字符串
''和' '不是一个玩意!
再次声明,请保持严谨
undefined 和 null 两种空类型
为什么有两个空
这是 JS 的原(la)创(ji)之处
区别
没有本质区别
细节一
- 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null。换句话说,undefined 是一个没有值的变量的默认值
细节二
- 如果一个函数,没有写 return,那么默认 return undefined,而不是 null
- 所以,undefined 更多是一个默认的空,null 是一个主动的空
细节三
- 前端程序员习惯上,把非对象的空值 undefined,把对象的空值写为 null
- 但仅仅是习惯上而已。打破这个习惯也是没问题的
symbol 符号————不怎么常用的数据类型
直接看文章
变量声明
三种声明方式
- var a=1
- let a=1
- const a=1
- a=1 // 错的声明方式
区别
- var 是过时的、不好用的方式
- let 是新的,更合理的方式(一般认为是变量声明)
- const 是声明必须赋值,且不能再改的方式(一般认为是常量声明)
- 最后这种方式是错误的,不准这样声明
var 变量提升
- 押题时再学,现在有时间可以提前看网道教程
- 以后所有的代码,都不准用 var,只能用 let 或者 const
var 声明
直接跳过
- 我们写代码不用 var
- 面试押题前单独学习
let 声明
规则
- 遵循块作用域,即:使用范围不能超出{}
- 不能重复申明,在同一个作用域里不能有相同的变量
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的 let 变量,不会变成 window 的属性
- for 循环配合 let 有奇效,为了满足不好好学习 JS 的人的幻想
const 声明
规则
- 跟 let 几乎一样
- 只有一条不一样:声明时就要赋值,赋值后不能改
变量声明
指定值
- var a=1
同时也指定了类型
- var a=1
但是值和类型都可以随意变化
- a=2
- a='字符串'
name 和'name'的区别
name 是变量
- 值可变,可能是'name',也可能是'hello'
'name'是字符串常量
- 常量就是不变量
- 'name'只能是'name',不能是其他值
类型转换
number=>string
- String(n)
- n+''
string=>number
- Number(s)
- s-0
- +s
- parseInt(s)/parseFloat(s)
x=>bool
- Boolean(x)
- !!x // 取反的反,即取 x 的原始布尔值,这种写法在前端里更流行
x=>string
- String(x)
- x.toString() // 数字用这个方法转换会有 bug,这样写:(1).toString,1..toString,1 .toString
六种类型
- undefined
- null
- number
- string
- bool
- symbol
上面这些都是简单类型
- 只有 object 叫做复杂类型,下一节我们开始学习