JavaScript:
简称js,是一个运行在客户端浏览器的解释型、弱类型、面向对象脚本语言。
1. 解释型:运行之前不会检查代码是否正确 直接执行 遇到错误停止后面代码
2. 弱类型:变量保存的数据由数据类型决定能保存什么变量
3. 面向对象:前期简单来说只要遇到 对象名.属性名(方法名) 这种格式就叫做面向对象
js的特点:
1. 任何编辑器都可以编辑js代码
2. 解释型
3. 弱类型
4. 面向对象
5. css完成不了的他都能完成
js的使用:
1.直接在HTML里面创建一个标签,并在里面写代码<script>代码</script>
2.直接在HTML里面创建一个标签,并且在外部创建一个js文件--xxx.js文件:<script
src="xxx.js">不能写代码</script>
打桩输出/输出方式/检查错误
1.console.log()
2.document.wirte() 这是在HTML页面输出(如果绑定了点击事件,页面内容会全部被替换掉,这样页面就白写了)
3.alert() 浏览器会弹出警告框,在警告框内输出(有时候会卡住页面,导致整个页面加载不出来,用户就看到一个白板)
☆变量
1.创建之后 值可以再次进行修改
2.使用时间:以后我们使用任何数据,都会提前把他保存在一个变量中,以后使用变量名,就是在使用里面的值
3.如何创建:var 变量名=值
4.创建之后 可以不赋值,默认值是undefined
5.可以创建多个变量,用逗号隔开
常量
1.创建之后,值不允许再次跟换,如果跟换会报错
2.如何创建:const 常量名=值
用户输入框 prompt("请输入您的:")
☆数据类型(两大类)
原始类型/基本类型/值类型:5个:
1.*Number* 数字类型
取值无数个,不用任何操作,直接写——控制台(蓝色)
2.*String* 字符串
取值无数个 必须用 " " 或者' ' 包起来——控制台(黑色)
3.Boolean 布尔类型
取值只有两个 true/false
常用于作为条件判断,配合在分支里面更厉害——控制台(蓝色)
4.Null 空的
取值只有一个 就是null(本身) 常用于释放变量——控制台(灰色)
5.Undefined 未定义的
取值只有一个,就是undefined(本身)记住,undefined是个垃圾,干啥啥不行,这是祖师爷的一
个错误——控制台(灰色)
引用/对象类型:有11个,可以展示理解为由11个属性和方法等待我们学习
☆☆☆运算符
算数运算符
+ - * / %
特殊 % 取余(取模)两个数相除取的不是商,而是除不尽的余数
作用:(1)判断奇偶数(2)取出某个数字的后n位
console.log(1234%10)//4
console.log(1234%100)//34
console.log(1234%1000)//234
带有隐式转换:会将数据类型转换,例如把左右两边都转为数字,再运算
特殊:
true——1
false——0
Null——0
undefined——NaN
"100"——100
"100px"——NaN
注意:
确实可以转为数字——前提必须是纯数字,但凡包含了非数字字符,都会转为NaN
NaN (not a number)不是一个有效数字
缺点:
参与任何算符运算都为NaN
参与任何比较运算都为false
最后还有一个 + 运算
特殊点:如果遇上字符串,左右两边都会转为字符串,+ 运算不再是加运算,而是拼接
关系运算符/比较运算符
> 、 < 、 >= 、 <= 、 != 、 == 、!== 、 ===
1.比较运算符一般用于分支结——结果只有两个————true/false
2.默竟运算符带有隐式转换 会将左右两边转为数字 再比较大小
3.如果都为字符串 会根据16进制(Unicode)/十进制(ASCII)进行按位PK
4.数字0-9<大写A-Z<小写a-z<汉字
5.NaN参与任何比较运算都为false
!isNAN(X) 判断NaN,结果一般是一个布尔值:true(有效数字)/false(无效数字,也就是一个NaN)
6.undefined==null——true
解决方法:使用全等===
=== : 不带任何隐式转换的等值比较,要求数据类型相同,值相同
逻辑运算符(在比较运算符之上再综合比较)
1.&& 与运算(并且)
全部都满足为true,有一个不满足都为false
2.|| 或者
全部都不满足,结果为false 有一个满足,就为true
3. ! 非
!true->false
!false->true
赋值运算符
= 、+= 、-= 、*= 、/=、%=
1. = 就是把=右边的东西保存到 = 的左边的变量名中
2.后面五个可以理解为一种升级写法;一句话两个操作,运算后在保存会变量本身
变量名 += 值 ———— 变量名 = 变量名+值
自增自减运算符
++ --
例如: i++ / i--
1.自增:固定的 每次只能+1
2.累加:+=每次可以加n 由程序员自己决定
3.笔试题:前++ 和后++ 的区别
单独使用时,前++ 和 后++ 没有任何区别
但是如果参与了其他表达式,变量始终都会+1 但是前++和后++返回的结果不同
前++返回的是加了之后的新值
后++返回的是加l之前的旧值
位运算
1.左移:m<<n,读作m左移了n位,翻译:m*2的n次方
2.右移:m>>n,读作m右移了n位,翻译:m/2的n次方
分支结构:两大类
☆☆if分支:三种写法
1.一个条件,一件事,满足就做,不满足就不做
if(条件){
操作;
}
2.一个条件两件事:满足就做操作1,不满足就做默认操作
if(条件){
操作1;
}else{
默认操作;
}
3.多个条件多件事,满足谁就做谁,如果都不满足,就做默认操作
if(条件){
操作1;
}else if(条件){}{
操作2;
}else if(条件){
操作3;
}else{
默认操作;
}
注意:
(1)分支只要满足一条路,就不会再走其他路;
(2)else if 想写多少写多少 由程序员自己决定
(3)else这句话可以省略不写,但是不推荐,如果条件不满足,则什么都不操作
(4)分支可以嵌套
☆☆Switch……case分支
语法:
switch(变量/表达式){
case 值:
操作1;
break;
case 值:
操作2;
break;
case 值;
default:
默认操作;
}
特殊:
只要case满足,会将后续的操作全部做完 解决————break;
建议:每一个case的操作后面都已跟上一个break;
有些地方可以不加break
(1)最后一个操作default可以省略break;
(2)如果中间有多个条件,做的操作是一样的,则可以省略掉中间部分
面试题:if和switch的区别?
1.Switch……case:优点:执行效率高,速度快(它在做比较的时候是,case做的不是范围操
作,而是等值比较);缺点:必须要知道最后的结果是什么才可以使用Switch.....case去判断
2.if——else:优点:可以做范围判断;缺点:执行效率低,速度慢(做的是范围判断)
建议:代码开发完毕后,做优化时,尽量少用if——else;尽量将if....else替换成switch...case
三目运算
使用:条件?操作1:条件?操作2:条件?操作3:默认操作
注意:
1.默认操作不能省略,省略会报错,其实还算是一个优点
2.如果操作比较复杂,不能使用三目运算,操作只能是一句话,如果操作多句话,还是推荐if或
者switch——以后很重要,因为很多时候操作就刚好是一句话
数据类型的转换
注意 :页面上一切的数据js获取到后都是字符串
转字符串:2种
1.var str=x.to string()x不能是undefined和null
记住:undefined和null不能使用.的任何操作
2.var str=string(X);万能 任何都可以转为字符串,完全等效于隐式转换
转换,其实string()就是隐式转换的底层原理,还不如+""
不重要,因为在页面上一切获取到的数据都是字符串
☆☆☆转数字 3种
**1.**parseInt**(str/num)——parse(解析)Int(整数/型)——专门用于将字符串转为整数的
执行原理:
从左往右依次读取每个字符,碰到非数字字符就停止转换,如果依赖就是不认识则为NaN,不认识小数点
console.log(parseInt(35.5));//35
console.log(parseInt("35.5"));//35
console.log(parseInt(3hello5));//3
console.log(parseInt(hello5));//NaN
console.log(parseInt("35px"));//35
console.log(parseInt(true));//NaN
console.log(parseInt(false));//NaN
console.log(parseInt(undefined));//NaN
console.log(parseInt(null));//NaN
**2.**parseFloat(str)**——Float(浮点数、小数)-->专门用于将字符串转为小数的
执行原理:
几乎和parseInt一致,认识第一个小数点
console.log(parseFloat(35.5));//35.5
console.log(parseFloat("35.5"));//35.5
console.log(parseFloat(3hello5));//3
console.log(parseFloat(.5));//0.5
console.log(parseFloat("35.5px"));//35.5
console.log(parseFloat(35.5.5));//35.5
3.var num = Number(x);万能的,任何人都可以转为数字,完全等效于隐式转换,其实
Number()就是隐式转换的底层原理,还不如 -0 / *1 / /1
转布尔:
Boolean(x);万能的,任何人都可以转为布尔,完全等效于隐式转换
其实Boolean()就是隐式转换的底层原理,还不如!!x
*****只有这6个会为false:0,"",undefined,null,NaN,false
其余全部都为true
循环结构:
反复执行 相同 或者 相似的操作
循环体:要做的事情
循环变量:记录着我们当前在哪一次,而且他会不断的变化,变化往往都是想着不满足条件前进的
while 循环
语法:
var 循环变量=几
while (循环条件){
循环体;
循环变量变化;
}
执行原理:
首先创建出循环变量,判断循环条件,则执行一次循环操作,并不会推出循环,而会回头再次
判断条件满不满足,如果满足,则执行一次循环操作.....知道循环条件不满足,才会退出循环
宏观上感觉循环好像是一瞬间就结束了,其实循环是一次一次执行的
特殊:
1.有的时候可能真的需要死循环,默认永远不会停止的循环
何时使用:不确定循环次数的时候
while(){
操作
}
2.死循环其实有一天也会停下来,如果停不下来,全部都要卵
break 推出整个循环,多半都是用于配合死循环使用的
continue 退出本次循环 还会执行下一次操作
☆☆☆for 循环
和while的原理是一样的,但是他比while看上去更加的简洁,更加的舒服,那么while能做的事情,for也可以完成
语法:
for(var 循环变量=几;循环条件;循环变量变化){
循环体;
}
特殊: 死循环:for(;;){操作;}
面试题:while和for的区别?
while和for在原理上来说几乎没有区别
一般我们不确定循环次数的时候会使用while循环———死循环
一般我们确定循环次数的时候使用for循环(大部分情况)
do ...while:
垃圾:while 我们都不使用,更不要说这个更加复杂的了
语法:
var 循环变量=几
do{
循环体;
循环变量变化;
}while(循环条件)
面试题:while和do..while的区别?
区别只看第一次,如果第一次条件都满足,那么两者都没有区别
如果第一次条件不满足;while一次都不会执行,而do while 至少会执行一次
☆☆☆☆☆Function(函数)
超级重要
概念:
Function——函数,也称之为方法
先【预定义】好,以后可以【反复使用】的【代码段】
如何使用函数:
(1)在js内部写:函数名()程序员写几次就会调用几次
(2)在HTML页面上绑定事件
例如:<div onclick="函数名()"></div>
任何元素都可以绑定点击事件
我们以后何时使用函数呢?
(1)不希望打开页面立刻执行
(2)希望由用户来触发——提升用户体验感
(3)函数的地位很高,是第一等公民地位
以前就见过函数了,比如css里面的rotate(360deg),url(2.jpg)这种写法叫做带参数的函数:2步
带参数的函数:
(1)创建出带形参的函数;其实就是一个变量,只不过不需要写var
而且不需要复制,所以称之为叫做形式参数,简称形参
function 函数名(形参,...){
函数体/代码段;
}
(2)使用带参数的函数时,记得必须传入实参——实际参数,就是你传递过去的值!
函数名(实参,.....)
注意:
传参的时候顺序是不能乱的,必须和形参的顺序一一对应上,数量也不要多也不要少;
总结:没有谁好谁坏
1.不带参数的函数,用于执行一些固定的操作
2.带参数的函数,可以根据我传入的实参的不同,执行的操作略微不同
总结:
循环可以反复执行,函数也可以反复执行,他们的区别在哪里?
时机不同
1.循环:几乎是一瞬间就执行完毕了
2.函数:需要调用后才会执行