一、数据类型
- 简单数据类型(Number,String,Boolean,Undefined,Null)
- 复杂数据类型(Object)
1.变量声明
- var a = b = c = 10;
相当于 var a = 10; b = 10; c = 10;b和c没有var声明 - 集体声明:var a = 10, b = 10, c = 10;
- var a, b, c = 10 错误的声明方式
2.简单数据类型
2.1 数字型Number
- 八进制:数字前面加0
十六进制:数字前面加0x - NaN:非数字
isNaN():验证是否非数字,是数字返回false,否则返回true
2.2 字符串型String
- 字符串转义符 \
- 获取字符串长度:字符串.length
- 字符串拼接: +
字符串 + 任何类型 = 字符串\ - 字符串型数字互相比较大小是从第一位开始比较 : ’121'<'25',所以要先转换为数字型\
- 字符串本身是不可变的,每次改变字符串的值其实是新开辟了一个内存空间来存放新的值,原来的字符串并没有变
2.3 undefined 和 null
- undefined
- 如果一个变量没有赋值,那它就是undefined
- undefined + '我是字符串' = undefined我是字符串'
- undefined + 数字 = NaN
- null 空值
- null + 'aaa' = null我是字符串'
- null + 数字 = 数字
3.获取变量的数据类型typeof 变量
typeof 变量
4.数据类型转换
4.1 转换为字符串类型
加号拼接转换方式为隐式转换
4.2 转换为数字型
- parseInt(变量) 得到的是整数,会去掉数字后边的单位
- parseFloat(变量) 得到的是浮点数,会去掉数字后边的单位
- Number(变量)
- 利用算数运算 - * /
4.3 转换为布尔型
Boolean(变量): 代表空,否定的值会被转换成false,其余值转换为true
5.数据类型内存分配
5.1 内存可以看作分为了两块:栈和堆
- 简单数据类型存放在栈里,存放的是值本身(值类型)
- 复杂数据类型先在栈里存放地址,这个地址指向堆里面的数据(引用类型)
5.2 简单/复杂类型传参
- 简单类型传参:当把一个值变量作为一个参数传给函数的形参时,其实是把变量存放在栈空间的值复制了一份给形参,所以在函数内对形参修改都不会影响到外部变量
- 复杂类型传参:其实是把变量在栈空间保存的堆地址复制给了形参,形参实参保存的是同一个堆地址,所以操作的是同一个对象
二、运算符
- 算数运算符
- 递增 ++,递减 -- 运算符
- 比较运算符
- 逻辑运算符
- 赋值运算符
1.递增 ++,递减 -- 运算符
- 前置递增,递减 ++a
先自加,再返回值
- 后置递增,递减 a++
先表达式返回原值,后变量自加
2.比较运算符
- == 只要求值相等,默认转换数据类型
- === 要求两侧的值以及数据类型完全一致
3.逻辑运算符
逻辑中断(短路操作)
- 逻辑与 表达式&&表达式
前一个表达式为真,则结果为第二个表达式的值;前一个为假,则为第一个值 - 逻辑或 表达式||表达式
前一个表达式为真,则结果为第一个表达式的值;前一个为假,则为第二个值
4.运算符优先级
- 小括号
- 一元运算符 ++ -- !
- 算术运算符 先 * / %后 + -
- 比较运算符
- 先 > >= < <=
- 后 == === != !==
- 逻辑运算符 先&&后||
- 赋值运算符
三、流程控制
1.顺序结构
- if...else if...else
- switch
switch循环中的case语句如果没有break,会继续执行下一个case语句,直到出现break
2.循环结构
2.1 双重for循环
- 打印⭐案例利用字符串追加
- 打印倒三角形案例
- 九九乘法表
2.2 while循环
- 输入我爱你结束,否则一直问
2.3 do while循环
-
先执行do内的语句,再判断
-
do while 循环至少执行一次
简易的ATM机案例
- while循环
- do...while循环
2.4continue
- 退出本次循环,执行下一个循环
2.5 break 退出整个循环
四、数组
1.数组长度,遍历数组
数组长度是数组中元素的个数,计算数组长度用length
遍历数组用for循环
2.数组中新增元素
筛选数组:将旧数组中需要的元素筛选出来追加给新数组
- 利用一个初始值为0的变量,每次追加元素给新数组后,变量加1
- newArray.length 是0
3.冒泡排序
利用两个for循环,外层for循环表示趟数,内层表示每趟比较次数
五、函数
1.函数的声明
-
function声明
function 函数名(){ 函数体... } -
函数表达式
var 变量名() = function(){ 函数体... }
2.函数的参数
函数有形参和实参
- 形参可以看作一个不用声明的变量,实参传递给形参看作给形参赋值,默认值是undefined
- 形参实参个数不匹配情况:
- 个数相同:返回正确结果
- 实参比形参个数多:取到形参的个数(即:多出来的参数不管
- 实参比形参个数少:没有接收实参数据的形参默认为undefined
结果为:传递的实参数据+undefined
3.函数的返回值:return
- 相当于赋值:函数名() = return 后面的结果
- return会中断函数,后边的代码不会执行
- return只返回一个值,如果return后边有多个值,只返回最后一个值
- 如果有多个值需要返回,return[x1,x2,x3]
- 如果没有return,返回undefined
4.arguments
- 不知道实参个数的时候使用
- arguments是当前函数的一个内置对象,arguments对象中存储了传递的所有实参
- arguments展示形式是一个伪数组
- 具有length属性
- 按索引方式存储数据
- 不是真正意义上的数组,不具有数组的push,pop等方法
- 求任意个数的最大值
5.作用域
函数内部的变量为局部变量
如果变量没有用 var 声明则为全局变量
6.预解析
-
js引擎运行js分为两步:预解析 代码执行
预解析:js引擎会把js里面所有的 var 还有 function 提升到当前作用域的前面 -
预解析分为 变量预解析(变量提升)和 函数预解析(函数提升)
- 变量预解析:把所有的变量声明提升到当前作用域的最前面,不提升赋值操作
- 函数预解析:把所有的函数声明提升到当前作用域的最前面,不调用函数
- 变量预解析:把所有的变量声明提升到当前作用域的最前面,不提升赋值操作
六、对象
1.自定义对象
1.1 调用对象的属性,方法
- 调用对象的属性
- 对象名.属性名
- 对象名['属性名']
- 调用对象的方法:对象名.方法名()
1.2 创建对象
-
利用对象字面量创建对象
-
用new Object 创建对象
-
构造函数创建对象(对象的实例化):可以批量生成
- this 不能丢
- 只要 new Hero()调用函数 就创造了一个对象
1.3 for... in... 遍历对象
k--key
2.内置对象
2.1 查阅文档 developer.mozilla.org/zh-CN/
2.2 Math随机数 
2.3 Date日期对象 
2.3.1 返回今天是星期几 
2.3.2 时间戳
倒计时案例 
2.4 数组内置对象
2.4.1 添加删除数组元素 
筛选数组元素
2.4.2 数组排序 sort
2.4.3 数组索引
-
indexOf() 查找给定元素的第一个索引 不存在返回-1
-
lastIndexOf() 查找给定元素的最后一个索引 不存在返回-1
![image-20210527164310449.png](p1-juejin.byteimg.com/tos-cn-i-k3…1.数组去重
2.查找字符串中某个字符所在位置以及出现的次数