目录
bug:程序中的错误、漏洞
分类:
- 有报错:
(1). 在报错信息中,就可以查到bug的信息;
(2). 有报错,代码没问题:
在报错信息中,就可以查到bug的信息,根据报错变量,向上查找来源- 没有报错,没有结果
1、反向查找,先确定当前结果,若没有结果,向上一步,查看计算信息;
通用方式:逐行执行,配合console.log(),打印1,或者当前变量或属性值的信息
工具帮助找到定位bug的信息
打断点:让浏览器逐行执行代码
1、使用js提供的关键字:debugger
2、使用浏览器提供的控制台,在浏览器的控制台的sources选项中找到当前要断点的文件,
点击要断点的行号。
数值类型:
- 字符型:string 引号包裹
- 数值型:number 数字
- 布尔型:Boolean true false
- 未赋值:undefined
- 对象:object {}
- 数组:array [] 数组是一种特殊的对象
- 函数:function
检测数据类型:
关键字:typeof eg:consol.log(typeof 需检测的数据)
声明变量:
关键字:var
变量命名规则:
‘字母’ ‘_’ ‘$’ 开头
最好语义化
使用数据类型首字母做前缀
不允许使用关键字和保留字
关键字:系统定义了功能
保留字:系统将来有可能定义功能
变量名由多个单词组成,用驼峰式命名法,单词首字母大写
运算符:
- 算数运算符:+ - * / %
+:+两边出现一个字符,则为字符串拼接,结果为字符型
- * / %:直接作为数值运算(隐式转换,将字符转为数值)
- 关系运算符:> >= < <= == != ===
(1). > >= < <= !=:
有一边 出现字符,则发生隐式转换,转为数值(有一个数值,则为数值)
两边都是字符时,不发生隐式转换,逐位比较,得到结果则停止比较
(2). ==:发生隐式转换
(3). ===:严格等于,没有隐式转换,比较时不仅比较值,还比较数值类型
- 逻辑运算符:做布尔运算
|| && !
运算规律:
||:从左往右,当第一个值为true,则结果为第一个值,否则为第二个值
&&:从左往右,当第一个值为true,则结果为第二个值,否则为第一个值
- 赋值运算符:
= += -= *= /= %= ++ –
- 三目运算符:条件?语句1:语句2
判断条件,若满足,执行语句1,否则执行语句2
数据类型转换:
js三大特殊值:
NaN:not a number,意外或非法转换的数字
参与逻辑运算时,结果为false
不是数字的数值型数据
isNaN():判断是否为NaN 值:true/false
undefined
null
隐式数据类型转换:
运算符中,转为数值型
if():任何类型都转为布尔值
规则:非0为true
非空字符串为true
对象{}永真
数组[]永真
函数function(){}永真
undefined、NaN、null为false
显示(强制):
- 字符转数值:
1、parseInt(a,b);将字符转换为数值,从左向右,遇到第一个不是数值的字符,停止转换,若第一位不为数字,则结果为NaN,不识别小数点
a:要转的字符
b:将数值字符作为进制转为10进制
2、parseFloat():将字符转换为数值,从左向右,遇到第一个不是数值的字符,停止转换,若第一位不为数字,则结果为NaN,识别小数点
3、Math.round():四舍五入,严格转换,只能转换全数值型字符,识别小数点,出现非数值型字符,则为NaN
4、Number():严格转换,只能转换全数值型字符,识别小数点,出现非数值型字符,则为NaN- 数值转字符:
1、toString(x) var num=123 var str=num.toString()
不写参数,为数值转字符
参数:转成相应进制
2、toFixed(n) 保留n小数 ,做四舍五入
程序结构;
顺序结构:自上而下,逐行执行
选择(分支)结构:多条路径,根据不同条件,只执行其中一个
- 单分支:执行或不执行
if(条件){执行语句}
满足条件(true)就执行语句,不满足(false)则跳过执行语句- 双分支:至少有两个选择,必须要选择一个
if(条件){执行语句1}else{执行语句2}- 多分支:多种情况,根据不同的条件选择其中一种
switch(要判断的值){
case1:执行语句1;
case2:执行语句2;
…
default:执行语句n;
}
case的穿透特性:在一个switch内只会进行一次判断,如果判断成功,后面的cass全部执行
阻止case穿透:break
在switch中的cass比较中,不存在隐式类型转换,为严格比较(===)
循环结构:重复执行某些代码
循环意义:省时省力,减少代码冗余
应用场景:多行多列的结构
规律:外层循环控制行,内存循环控制列
注意事项:内外循环计数器不能重复,同级循环的计数器可以重复
循环三要素 :
循环次数(停止条件)
计数器:用来统计循环的次数
改变计数器
死循环:无法通过自身控制结束的循环
特点:滥用死循环会消耗大量的性能造成浏览器卡死,但是可以使用死循环的原理,解决一些不确定执行次数的需求,最关键的是一定要在合适的时候使用循环的控制关键字结束循环
- while(条件){循环体}
- do{}wihle(){}:任何情况下,都比while多执行一次
条件为true时,执行do后面的语句
条件为false时,执行一次while后面的语句- for(计数器;停止条件;改变计数器){循环体}
控制关键字:
break:立即结束循环,不再执行
continue:跳过本次循环
函数一:
函数:由一堆代码组成的,实现了某个功能,可以直接执行或通过行为调用的代码段
函数的特点:重复使用、选择使用、忽略细节
声明函数的关键字:function
- 声明式
声明函数 👉 function 函数名(参数){执行语句(函数体/函数的功能代码)}- 赋值式
var fn=function(){} 变量名名即为函数名
函数的执行
1、函数名+()
2、行为调用:调用有名函数时,函数名不能加()
函数的分类(写法)
- 有名函数:声明式创建的函数,正常函数,正常执行,正常使用
- 无名函数:非正常函数,不允许直接存在
可以作为值存在-------------------赋值式创建函数
可以作为实参存在------------------回调函数
可以作为行为处理函数存在-------------事件处理函数
可以作为匿名函数的函数体存在----------匿名函数- 匿名函数:(function(){})()
特点:立即执行- 回调函数:将函数A作为参数,传到另一个函数B中,在函数B中执行函数A,那么函数A就是回调函数
- 构造函数:不是一种函数,是一种函数的执行方式
关键字:new
基本的构造函数:内置的构造函数
首字母大写的函数
eg:Number()
只要被new执行,那么返回值,必然是对象
高级的构造函数:自定义的构造函数
函数的参数
- 实参:
函数在执行时的参数
实参被形参接受并保存
实参可以传递任何数据,相当于变量中可以保存任何数据- 形参:
函数在定义时的参数
形参相当于变量,实参相当于赋的值
参数可以有多个:
形参和实参数量一致:一一对应
形参多于实参:多的形参为undefined
实参多于形参:多的实参被传到函数的一个区域中(arguments)
arguments:函数内部的一个专门用来存储所有实参的数组对象
返回值
关键字:return
return作用:
可以将函数内部处理的数据或结果,返回到函数外部进行二次使用
立即结束函数
所有函数都有返回值,没有return,返回undefined,有return,返回return后面的数据
- 应用场景:
(1).功能函数不需要返回值
数据处理函数必须有- 作用域:生效的区域,可以被使用的区域
分类
全局:整个代码空间
局部:函数内部
全局不能使用局部,局部可以使用全局
若全局变量与局部变量重名,在局部作用域内,局部变