(一)流程控制:
1.顺序结构:按顺序执行
2.分支结构:if(){} switch
三元表达式:条件表达式 ? 表达式1 : 表达式2
switch(num){
case value1: case value2:
执行语句1; 执行语句2;
break; break; }
注意: num 的值和 case 里面的之相匹配的时候是全等(===)的,数据类型,请求地址,值均相等.
switch和 if else if 的区别:(1).一般情况下可以相互替换
(2).switch处理比较精确,if else更灵活,常用于大范围判断
(3).switch进行条件判断后直接执行程序的条件语句,执行效率更高,if else需要判断多次
(4).分支比较少时,if else 执行效率更高
(5).分支比较多时,switch执行效率更高
(二)循环
- for循环语句
- while循环语句
- do while循环语句
for循环:双层for循环,外层循环一次,内层循环全部执行
九九乘法表:
var str = '';
for(var i=1;i<=9;i++){
for(var j=1;j<=i;j++){
str+=j+'*'+i+'='+i*j+'\t'
}
}
console.log(str)
do while循环 do{循环体}while(条件表达式)
continue break:
continue关键字用于立即跳出本次循环,继续下一次循环
break关键字:立即跳出整个循环
(三)数组
1.创建数组
var arr = new Array()
var arr = [ ]
2.访问数组元素 arr[0]从0开始
3.遍历数组:索引号从0开始,length从1开始的长度
var arr = [0,1,2,3,4,5]
for(var i=0;i<arr.length,i++){
console.log(arr[i])
}
4.数组中新增元素
修改length, arr.length = number数值 长度改变,新增默认undefined
修改数组元素 arr.[10] = 新增值
案例:
数组去重
var arr = [1,1,1,2,2,2];
var newArr = [];
for(var i = 0 ; i < arr.length ;i++ ){
if(arr[i] != 1){
newArr[newArr.length] = arr[i]
}
}
console.log(newArr)
翻转数组:
var arr = [1,2,3,4,5,6,7,8,9]
var newArr = []
for(var i = arr.length-1;i>=0;i--){
newArr[newArr.length] = arr[i]
}
console.log(newArr)
(四)数组排序:冒泡排序
冒泡排序:是一种算法,把一系列的数据按照一定顺序进行排列显示
var arr = [9,8,7,6,5,4,3,2,1];
for(var i=0;i<=arr.length-1;i++){
for(var j=0;j<=arr.length-i-1;j++){
if(arr[i] >arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp
}
}
}
console.log(arr)
(五)函数
只要函数遇到return,就会把后面的结果返回给函数调用者,相当于 Fun()=return(...)
案例:
求数组中的最大值
function getArrMax(arr){
var max = arr(0)
for(var i=1;i<=arr.length;i++){
if(arr[i]>max){
max = arr[i]
}
}
return max
}
var maxArr = getArr([1,2,3,4,5])
console.log(maxArr)
变量名为名词,函数名为动词
注意:
return语句之后的代码不被执行
return只能返回一个值,如果逗号隔开,以最后一个为准
函数没有return返回undefined
break,continue,return的区别:
break:结束当前的循环
continue:跳出本次循环,继续执行下一次循环
return:不仅可以跳出循环,还能够返回return语句中的值,同时还可以结束当前函数体内的代码
(五)函数中arguments内置函数的使用
有不确定个数参数传递时,可以使用arguments来获取,在JS中,arguments实际上是当前函数的一个内置参数,所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参
注意:arguments是一个伪数组,可以进行遍历,伪数组的特点:
- 具有length属性
- 按照索引的方式进行存储
- 不具有数组的pop,push等方法
案例:
利用函数翻转数组:
function arrPop(arr){
var newArr = [];
for(var i = arr.length-1;i>=0;i--){
newArr[newArr.length] = arr[i]
}
return newArr
}
var arr1 = arrPop([1,2,3,4,5])
console.log(arr1);
利用函数实现冒泡排序:
function sort(arr){//sort排序
for(var i=0;i<arr.length-1;i++){
for(var i=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j]
arr[j]=arr[j+1]
arr[j+1]=temp
}
}
}
return arr
}
var arr=sort([1,9,2,8,3,7,4,6,5])
console.log(arr)
(六)声明函数的方式:命名函数/匿名函数
1.命名函数
function fn( ){ };
fn( );
2.匿名函数
var fun = function( ){ }
fun( );
(七)全局变量和局部变量
全局变量:只有浏览器关闭的时候才会销毁,比较占内存
局部变量:执行完代码块就会销毁,比较节约内存
(八)JS预解析
作用域链:根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为作用域链
预解析:
1.JS引擎运行js代码分为 预解析--代码执行
预解析:会把js中所有var/function提升到当前作用域最前面
代码执行:按照代码书写的顺序从上往下执行
2.预解析分为 变量预解析(变量提升)和函数预解析(函数提升)
变量提升:把所有变量的声明提升到当前作用域的最前面,只提升变量声明,不提升变量赋值
函数提升:把所有的函数声明提升到当前作用域的最前面,不调用函数
(九)对象
1.对象是由属性和方法组成的:
属性:事物的特征,常用名词 方法:事物的行为,常用动词
2.创建对象的三种方式:
(1).利用字面量创建对象
var person = {
name:'小红', console.log(person.name)
sayHello:function(){ } } person.sayHello()
(2).利用new.object创建对象
var obj = new Object()//创建空对象
obj.age = 10;//追加属性 console.log(obj.age)
obj.sayHello = function(){ }//追加方法 obj.sayHello()
(3).利用构造函数创建对象
function 构造函数名(){
this.属性 = 值;
this.方法 = function(){ } }
function Star(name,age){
this.name = uname;
this.age = uage
this.sayHello = function(say){
console.log(say) } }
var person1 = new Star("小红",10)
console.log(person1)
person1.sayHello("hello")
注意;
构造函数名首字母大写
构造函数不需要return就能返回值
new 构造函数名 =>创建空对象
(十)new关键字执行过程
new关键字可以在内存中创建一个空对象
this指向刚才创建的空对象
执行构造函数中的代码,给空对象添加属性和方法
返回这个在内存中创建的新对象(构造函数不需要return的原因)
(十一)遍历对象for..in 循环
for(变量 in 对象){ }
for(var k in obj){ //通常写为 k 或者 key
console.log(k) //k变量 输出得到的是属性名
console.log(obj[k]) } //obj[k] 得到的是属性值