07 语句
1 什么是语句
概念:语句就是整句或命令。
特征:大多数编程语言中要以分号结尾;
Var a=110; //是一个语句
2 语句的分类
声明语句
var和function都是声明语句,它们声明或定义变量和函数。
例子:
vra a=99;// 指令 命令 声明变量
function f(){} //声明函数
表达式语句
具有副作用的表达式,就可以形成一个语句,需要我们加上分号。
例子:
let r = 1+1;
let res = "hello" + "world~"
条件语句
if(布尔值){}
if(布尔值){}else{}
if(布尔值){}else if(布尔值){}else if(布尔值){}else{}
switch(值){case 值:xxx; break; case 值:xxx; break; default:xxx}
注意细节:
1、在if后面的小()中放的是条件表达式,不一定只是true或false,条件表达式的结果要么是true,要么是false
2、在if后面的小()中放的是字面量表达式(1,"a", "hello", undfined, null, ""),这个字面量表达式会发生隐式类型转化
3、只有undefiend, null, 0, -0, NaN, "" 会转成false, 其它都转化成true
4、在if语句后面可以不写大括号,前提是这个{}里面只有一条语句,如果有多条语句,相当于使用了{}把第一条语句包起来,不管有几条语句,最好都使用{}给包起来的
5、对于三元运算符来说,前面放表达式(条件表达式或字面量表达式),如果这个表达式是真就是执行前面的表达式,否则执行后面的表达式
6、可选可不选使用if(){} 二选一使用if(){}else{}或三元运算符 多选一使用if(){}else if(){}else if(){}else{}或switch
7、对于switch来说,()里面的值和case后面的值的是严格匹配。
8、在Switch语句中,break是跳转语句,是用来结束程序的
9、在Switch语句中,default后面的break可以不写
循环语句(重要,多做题)
for(循环变量; 条件; 循环变量++){循环体}
注意细节:
- for循环也是同步任务,只能等到for循环执行完后,才能执行for循环后面的代码
- for循环后面的三个表达式是可以省略 了解就OK
- for循环可以嵌套,如果for循环里面又嵌套了一个for循环,就叫双重for循环...
- 对于for循环嵌套,最多三层,for循环嵌套性能非常差,一般就是一层或二层。
while(条件){循环体;要改变条件}
do{循环体;要改变条件}while(条件)
注:while循环可能一次也不执行,do-while至少要执行一次循环体。
注意细节:
- 需要在while循环体中改变循环变量,如果不改变,会出现死循环。
- 需要在while循环之前把循环变量定义好。
- while循环中的()里面可以放字面量表达式,也可以放条件表达式。
- while循环的{}如果省略了,默认只会循环while后面的第1条语句,建议不管有几种语句,都加上{}
跳转语句
- break;
注:break在如下几个地方出现:
switch中有break 如果满足某个case,那么整个switch就结束了
在条件语句中也可以出现break
2)continue
3)return
注意细节:
- break可以出现在switch,for中(需要配合if)来终止switch或for。
- continue终止本次循环,继续下一次循环
08 面向对象
1 初识对象
面向对象?
面向对象是一种编程思想,现在主流的编程语言都有这种思想。
Js中数据的分类?
在js中任何一个数据都能找到它对应的类别。
在js中一个类的标识符首字母大写
类和对象?
类是抽象的,是每一类事物的抽象
对象是某一类的具体,对象也叫实例
基本对象:
使用.运算符来操作对象中的属性或方法,有人把方法也叫属性,在js中的对象是属性的无序集合。属性与属性之间用逗号隔开。
获取对象中的属性,直接对象名.属性名就可以获取
获取对象中的方法,对象名.方法名() 调用方法
创建对象的两种方式:
字面量,{}
new运算符 通过类(构造器)
类的分类:
JS的内置类,程序员自己写的类
1)内置类:Number String Boolean Array Function Object....
2)可以通过()给对象赋值
2 单体内置对象
Date类 提供了日期的相关操作 new Date
Math类 提供了数学的相关操作,有一个非常重要的函数:random() 随机一个小数,范围[0, 1)
09 数组
1 什么是数组?
数组是值的有序集合。
数组的作用:一次性存储多个数据
创建数组的两种方式:
字面量 var 数组名=[];
使用new运算符 var 数组名=new Array();
数组元素:数组中的值有一个别名叫做元素。数组中元素的数据类型可以不一样。
数组的长度:数组的元素个数,比如有3个元素,就说这个数组的长度是3.
数组的索引(下标):用来存储或者访问数组中的数据,索引从0开始,到长度减1。
数组的长度和索引的关系:长度减1就是最大的索引的值。
数组存储?
数组是引用数据类型,存储在堆区
注意细节:
-
- JS中的数组中可以放任意数据类型,但是有的编程语言中,数组中的数据类型必须一致。
- JS中的数组是动态的,可以根据里面的元素自动的增长或者缩减,但是有的编程语言中,数组的长度上来就是固定好的。
- JS中的数组它的索引,默认是0开始的,依次递增,但是可以不连续。
- 访问一个数组中不存在的元素得到的结果是undefined
2 操作数组
在计算机中,提到操作,主要就是指增删改查(CRUD)操作.
在JS中,每一个对象中都有一个特殊的属性,叫__proto__ 一般叫隐式原型。
在每一个数组中,有非常多的方法,大概有30个左右。
添加元素:索引和方法;
- 通过索引(下标)去添加元素
- push()方法 在数组的末尾添加元素,返回新数组的长度,改变原数组
- unshift()方法 在数组的开头添加元素,返回新数组的长度,改变原数组。
删除元素:方法;
- pop()方法:从数组中删除末尾元素,返回被删除的元素,改变原数组;
- shift()方法,从数组的开头删除元素,返回被删除的元素,改变原数组;
修改元素:索引和方法;
- 通过索引(下标)去修改元素
- join()方法:将一个数组(或一类数组对象)的所有元素连接成一个字符串,(如果数组中,只有一个项目,那么将返回该项目而不使用分隔符,)返回字符串,不改变原数组
- concat()方法:用于合并两个或多个数组,返回一个新数组,不改变原数组。
- reverse()方法:将数组中元素的位置颠倒,并返回颠倒后的数组,改变原数组
- sort()方法: 对数组进行排序,并返回排序后的数组,改变原数组
- slice()方法:用来截取数组的 返回一个新的数组对象,不改变原数组
- toString()方法: 把数组转换成字符串,返回字符串,(表示指定的数组及其元素),不改变原数组。
查看元素:for循环遍历,forEach遍历(增强的for循环)
3 多维数组
二维数组:在一个数组中嵌套了一个数组
三维数组:在一个数组中嵌套了一个数组,在嵌套的那个数组中又嵌套了一个数组
10 字符串
1 字符串?
在Js中,字符串需要使用单引号或双引号引起来,建议使用单引号。
字符串是基本数据类型,存储在栈区。
创建字符串的两种方式:字面量;new一个类
注:可以把字符串当做一个字符串数组。
2 字符串的方法?
查找字符的方法
- chartAt() :从字符串中查找某个字符的位置,返回查找的字符,不改变原字符串。
注:当charAt中的索引超过了length-1,得到是一个空串,不是undefined
- indexof():从字符串中自左至右寻找字符第一次出现的索引(下标),返回该索引,如果未找到该值返回-1,不改变原字符串。(索引从左到右以0开始)
- lastIndexof():从字符串中自右至左寻找字符第一次出现的索引(下标),返回该索引,如果未找到该值返回-1,不改变原字符串。(索引从左到右以0为基数)
- search():从字符串中自左至右寻找字符第一次出现的索引(下标),返回该索引,如果未找到该值返回-1,不改变原字符串。注:正则表达式
修改字符的方法:
- substr():substr(start[, length]),截取字符串,第一个参数是开始的位置(索引),第二个参数是截取的长度,返回新的字符串,不改变原字符串。
注:如果start为负值,strLength +start
。其中
strLength
为字符串的长度(例如,如果start
为-3
,则被看作
strLength + (-3)
)
- substring(): substring(indexStart[,indexEnd]),截取字符串,第一个参数是开始的位置(索引),第二个参数是结束的位置(索引),返回新的字符串,不改变原字符串。
注:indeEnd 可选。从0开始到字符串长度之间的整数,半开半闭区间
注意细节:
- 如果 indexStart等于indexEnd,substring返回一个空字符串。
- 如果省略indexEnd,substring提取字符一直到字符串末尾。
- 如果任一参数小于 0 或为NaN,则被当作 0。
- 如果任一参数大于stringName.length,则被当作stringName.length。
- 如果indexStart大于indexEnd,则substring的执行效果就像两个参数调换了一样。
- slice():提取某个字符串的一部分,返回新的字符串,不改变原字符串
注:语法:str.slice(beginIndex[,endIndex]) 如果beginIndex为负值,则strLength +
beginIndex。其中
strLength
为字符串的长度(例如,如果beginIndex为-3
,则被看作
strLength + (-3)
);如果
endIndex
为负值,
则strLength +
endIndex。
- concat()方法:合并字符串(与+相似)返回新字符串,不改变原字符串。
- replace() 替换字符串的某个字符,返回新的字符串,不改变原字符串
注意:默认情况下,replace只替换一次, 真正强大的地方,也是在正则表达式中
- split()将字符串转换成数组,返回数组,不改变原来的字符串
注意:字符串得有一定规律才能转换成数组
- toLowerCase():将字符串转换成小写,返回新字符串,不改变原字符串。
- toUpperCase():将字符串转换成大写,返回新字符串,不改变原字符串。
截取字符串 substr() substring() slice()相同点和不同点
相同点:
- 三个方法都是截取字符串
- substring()与slice()两个参数都为正数时截取的字符串相同;都是半开半闭区间
- substr()与slice()第二个参数都为0时,返回值都是空串,无意义
不同点:
- Substr() 第一个参数表示从索引(基数为0)开始,第二个参数表示截取的长度。长度为负值或0时为空串,无意义;
- substring() 第一个参数是开始位置的索引,第二个参数是结束位置的索引,如果任一参数小于 0 或为NaN,则被当作 0。第二个参数为0时,返回值为索引0到第一个参数的索引,但不包括该索引的字符;
- slice() 第一个参数表示开始截取位置的索引,第二个位置表示截取结束位置的索引,如果任一参数小于0,则字符串长度加上该参数的值。第二个参数为0时,为空串,无意义。
一些重要的概念
1 代码段
一个script就是一个代码段;在上一个代码段中定义的变量,在下一个代码段中也可以得到。在下一个代码段中定义的变量,在上一个代码段中得不到。
2 进程和线程
进程(工厂):浏览器是多进程的,tab页就是一个进程
线程(工人):在一个进程中有1个或多个线程,线程是真正干活
JS的运行环境:浏览器
Js是单线程的:当JS代码放到浏览器中时,浏览器会开一个线程来执行JS代码,JS是单线程。默认只会从上到下执行代码(任务),只有上一个任务执行完毕后,才有执行下一个任务。如果遇到一个非常耗时任务,JS线程就要把这个耗时任务执行完毕,再去执行后面的任务。在JS中有很多任务非常耗时,如果就让这一个线程来处理,会造成阻塞状态。
为了解决上面的问题,JS提出异步的解决方案,把任务分成两类,一类是同步任务,一类是异步任务。
大部分任务都是同步任务,只有一部分任务是异步任务。
3 同步和任务和异步任务
现在写的代码都是同步代码,都是从上到下执行。
4 全局作用域和局部作用域
1)全局作用域:整个代码最外层的作用域就是全局作用域,静态的,代码没有执行,作用域也是存在的。
2)局部作用域:函数内部的作用域就是局部作用域。
作用域是静态的,不管代码执行与否作用域都存在。
5 全局执行上下文和局部的执行上下文
当代码真正在浏览器跑起来时,才会产生执行上下文
全局执行上下文:默认先产生一个全局的执行上下文
局部执行上下文:调用函数时会产生局部执行上下文,也叫函数执行上下文
6 数据存储
基本数据类型存储在栈区,引用数据类型存储在堆区
内存地址
一些总结
1 Undefined都出现在哪些地方?
- 当没有给一个变量赋值时,这个变量的值是undefined,变量值的数据类型是undefined
- 当函数没有显示指令返回值时,默认这个函数返回undefined
- 当访问一个对象中不存在的属性时,得到的也是undefined
- 当访问一个数组中不存在的元素时,得到的也是undefined
2 判断一个数据是否是数据
例子:
Console.log(arr instanceof Array)
Console.log(arr isArray(arr))
Console .log(typeof(arr))
Typeof不精确 去判断数据得到的是object
3 回调函数
如果把一个函数作为另一个函数的参数,那么作为参数的那个函数叫回调函数