目录
1.运算符
比较运算符
浮点数的精度问题
浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远远不如整数
不能直接判断两个浮点数是否相等
递增或递减运算符
递增和递减运算符必须和变量搭配使用
想要反复给数字变量添加或者减去1,可以使用++或--
前置递增运算符
++写在前面,先自加,后返回值
后置递增运算符
++写在后面,先返回值,后自加
比较运算符
===和!== 全等和不全等要求数值和数据类型一致
== 和 !== 只根据数值是否一致来判断 ==会把字符串转换为数字型
逻辑运算符
短路运算(逻辑中断)
当有多个表达式(值)时,左边的表达式可以确定结果时,就不再继续运算右边的表达式的值
逻辑与&& 如果第一个表达式的值为真,则返回表达式2;第一个表达式值为假,则返回表达式1对于布尔值为假的一些值如0,' ',null、undefined 、NaN等,它们放在第一个表达式的位置就不用再运算后面的表达式了,返回结果就是表达式1
逻辑或|| 如果第一个表达式的值为真,返回表达式1;第一个表达式为假,返回表达式2;
var a=0;
console.log(123 || a++);
console.log(a)
这个结果还是0,因为是逻辑或,第一个表达式是正确的,直接输出第一个表达式,后面的不再运行,a++没有执行
赋值运算符
运算符优先级
一元运算符里面的逻辑非!优先级很高
逻辑与比逻辑或优先级高
2.流程控制
顺序结构
没有特定的结构,就是一行一行执行
分支结构
if语句
if(条件表达式){
//条件成立执行的代码语句
}
switch语句
switch语句也是多分支语句,它用于基于不同的条件来执行不同的代码。当要针对变量设置一系列的特定值的选项时,就可以使用switch
switch进行判断,必须是值和数据类型都相同,才能break;如果某个case没有加case,及时在该处停止时正确的,程序也会继续向下运行,输出下一个case的结果
switch (表达式) {
case value1:
表达式
break;
case value2:
表达式
break;
default:
表达式
}
二者区别
三元表达式
有三元运算符组成的式子称为三元表达式
语法结构: 条件表达式 ?表达式1:表达式2
执行思路:如果条件表达式结果为真,则返回表达式1的值;如果条件表达式结果为假,则返回表达式2的值
也可以用if条件句来实现,相当于是if条件句的简易版写法
循环结构
for循环
for (初始变量;条件表达式;操作表达式){
循环体
}
for循环可以执行相同的内容
for循环可以执行不同的内容
双重for循环
while循环
while(条件表达式){
循环体
}
里面也有计数器,进行计算
do-while循环
先执行一遍循环体,再去判断条件表达式是否正确,所以它至少会执行一次
continue关键字
continue关键字用于立即跳出本次循环,继续下一次循环
在吃到第三个包子有问题时,输出的结果是还会是在吃包子,只不过没有”我在吃第三个包子“
break关键字
直接跳出整个循环
在吃到第三个包子不吃时,输出的结果到”我在吃第二个包子“
3.数组
数组的概念
数组的创建
可以用new方法新建一个数组;也可以用数组字面量来创建(即后面加上一个[]),在中括号中可以进行赋值说明
获取数组的元素
利用数组的索引 数组名[索引]
遍历数组
利用for循环和数组长度length即可做到
新增数组元素
通过修改length长度新增数组元素
只增加了length值,但是新添加的位置处的值为空
通过修改数组索引新增数组元素
直接新增如arr[10]=9999,但是不能直接给数组名赋值,这样会覆盖掉以前的数据
新建一个数组,里面放10个整数,通过for循环来实现
筛选数组方法(把一个数组中的元素放到另一个数组中)
第一种方法是设置新数组的索引为0,每在新数组中放置一个元素,索引就加1;第二种方法是利用新数组的长度为0,直接length来放置新的元素
冒泡排序
4.函数
函数的声明和调用
函数的使用方便后续代码重复使用,只需要调用函数就行了
function 函数名(){
函数体代码
}
function是声明函数的关键字,必须小写;通常把函数名命名为动词
调用函数:函数名();
只有调用函数,函数才会执行
形参和实参
在声明函数时,在函数后面的小括号内添加一些参数,这些参数成为形参;在调用该函数时,在函数后小括号内写的具体参数,成为实参
参数的作用:在函数内部的某些值不能固定后,可以通过参数在调用函数时传递不同的值进去
形参和实参的个数相匹配问题
形参的初始值定义为undefined
实参个数等于形参个数,输出正常结果
实参个数大于形参个数,只取到形参的个数
实参个数小于形参个数,多的形参定义为undefined,一个数加上undefined结果为NaN
函数的返回值return
function 函数名(){
return 需要返回的结果
}
函数名()
console.log(函数名())
return后在函数执行体外仍需再调用函数,并赋值
return下面一行的代码是不会被执行的;renturn只能返回一个值,返回最后一个值;任意球两个数的加减乘除结果,在return时把它们放到一个数组中,这样可以全部输出
如果没有写return,那么调用时输出结果是undefined
函数可以相互调用
每个函数都是独立的代码块,一个函数可以调用另一个函数
输出2月天数案例
先定义一个backday方法用来返回2月天数的值,在其调用isRunYear的方法,既判断是否为闰年后再输出结果,调用的时候直接在if的小括号中写,记得调用方法是要写小括号,调用方法时该方法返回的值为true时才执行第一个alert
函数的第二种调用方法
var 变量名= function(函数名){};
变量名(内容)
函数表达式声明方式和声明变量差不多,只不过变量里面存的是值,二函数表达式里面存放的时函数;函数表达式也可以传递参数
注意它设置了一个变量名,最后时以变量名佳小括号,括号中可以添加内容来调用的,同时需要在函数体中console.log(函数名)
5.作用域
JavaScript作用域
代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性,更重要的是减少命名冲突
全局作用域:放在整个script标签中或者是一个单独的js文件
局部作用域:放在函数内部,这个代码只在函数内部起作用
当相同的变量分别放置在全局作用域和局部作用域时,两次调用输出结果不同;如果在一个作用域内两次赋值同一变量,输出的结果是最后一个
全局变量和局部变量
全局变量
- 全局变量在代码的任何位置都可以使用
- 在全局作用域下var声明的变量是全局变量
- 特殊情况下,在函数内不实用var声明的变量也是全局变量
局部变量
在局部作用域下声明的变量成为局部变量(函数内部定义的变量)
- 布局变量只能在该函数内部使用
- 在函数内部用var声明的变量是局部变量
- 函数的形参实际上是局部变量
全局变量:在任何地方都可以使用,比较占内存
局部变量:只在函数内部使用,在代码执行时被执行,会被初始化;当代码运行结束后,就会被销毁,更节省空间
作用域链
函数中还有函数,仍可以在这个作用域中只在诞生一个作用域
根据在函数内部可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就成作为作用域链
如下图,在函数中还可以再写函数,还可以再写作用域;在内部函数调用的变量上级函数和全局作用域中都有时,根据就近原则来调用数值