书写方式

  1. 内部式 body的结束标签之上(先执行标签,后执行js)
  2. 外部式 .js文件 script src=“ 路径 ” 引入 (引入后中间不在写代码,会被忽略)
  3. 行内式 写在标签内

注释

  • 单行注释 ctrl+/
  • 块注释 shift+alt+a

变量

变量的命名规则和规范

  • 规则:必须遵守,不遵守会报错
    • 不能用关键字(js内置的一些英语词汇)
    • 只能用下划线、字母、数字、$组成,且数字不能开头
    • 字母严格区分大小写(Age和age是不同的变量)
  • 规范:建议,不遵守不会报错,但不符合业内通识
    • 起名要有意义
    • 遵循小驼峰命名法:第一个单词首字母小写,但后面每隔单词首字母大写(如:userName)

变量的声明

  • 声明并赋值:(推荐使用)
    • let 变量名 = 值
  • 先声明后赋值:
    • let uname uname=张三
  • 同时声明多变量:(开发中不推荐使用,代码可读性差)
    • let num1 = 10,num2 = 20

常量

值无无法修改,不能修改的数据,存储到常量
const 常量名 = 值


数据类型

  • typeof:检测当前数据的类型,加到括号里面名的前面
  • number数字型(数字,不区分整数和小数)在控制台式深蓝的
    • NaN是一个不确定的数字,不可以参与运算
    • 算术运算符:+求和、-求差、*求积、/求商、%取余数
  • string字符串型(带单引号、双引号、反引号的)在控制台式黑的
    • 同类型的引号不可以互相嵌套,同类型的引号非要嵌套使用\替意,
    • 不同类型的可以互相嵌套
    • 拼接:+(可以拼接两个变量,也可以拼接两个不同类型的数据)
    • 字符串模板:都写在```内${}`包住变量
  • boolean布尔型
    • 判断真假,配合条件判断使用,只有两个值:ture / false
  • undefined未定义型
    • 定义了变量但没有赋值,会出现
  • null 空类型
    • 当有一个对象,没有具体的数据的时候,使用null

语句

表达式:表达式是可以求值的代码(有结果的都交表达式)
语句:一段可以执行的代码就是语句(每一句可执行的代码都是语句)

程序三大流程控制语句

  • 顺序语句:从上到下执行
  • 分支语句:根据条件选择执行代码
    • if语句
      • 单分支语法:(条件不成立,什么也不执行)
        • if(条件){条件成立要执行的代码}
      • 双分支语法:
        • if(条件){条件成立要执行的代码}else{条件不成立要执行的代码}
      • 多分支语法:(从上往下判断,满足条件几就执行代码几,其他不执行,所有条件都不满足,执行else里的代码)
        • if(条件1){代码1} else if (条件2){代码2} else if (条件3){代码3}else{代码n}
    • switch语句
      • 判断数据全等的case值,并里面的执行代码,没有全等则执行default里的代码,没有break 会自上而下全部执行
      • switch(数据){case 值1:代码1 break case 值2:代码2 break default:代码n break}
  • 循环语句:某段代码被重复执行
    • 循环三要素:(缺一不可,否则会变成死循环)
      • 1.变量起始值
      • 2.终止变量
      • 3.变量变化量(自增或自减)
    • 循环退出:
      • continue:退出当前一次,接着执行下一次
      • break:终止循环
    • while循环:(满足条件期间,重复执行代码)
      • 语法:whie(循环条件){要重复执行的代码(循环体)}
    • for:()里面放循环三要素,{}里面放需要重复执行的代码
      • 语法:for(循环变量;循环条件;变化值){ 循环体 }
      • 无限循环:for(;;){}
      • 循环嵌套:内层循环执行完才会进入外层循环的第二次

运算符

赋值运算符

  • 先运算再把结果赋值到变量
  • += 、 -= 、 *= 、 /= 、%=
  • num1 = num1 + 1 化简 num1 += 1

三元运算符:(简易版的双分支)

  • 语法:条件 ? 条件成立执行的代码 :条件不成立执行的代码

一元运算符

  • ++ 表示+1 —表示-1 (只有加一或者减一,才可以这样简写)
  • 前置自增:(++num)先自增,后运算(自增后的参与运算)
  • 后置自增:(num++)先运算,后自增(自增后的不参与运算)

比较运算符

  • 、>= 、<、 <=、 ==、 ===、 !== 只会输出两个值 ture false(不用小数作比较,有精度问题)

  • == 左右两边的值是否相等(只判断数值,不判断数据类型)
  • ===左右两边的值和类型都相等
  • !== 判断不相等 不相等返回ture,相等返回false
  • NaN:不确定的数字,任何值与其判断都不相等

逻辑运算符

  • && 逻辑与 两边都是ture结果才为ture 一假则假
  • || 逻辑或 两边有一个ture结果为ture 一真则真
  • ! 逻辑非 ture变false false变ture 真变假,假变真

运算符优先级

运算符优先级表格.png

计算机约定

正常的数字都是ture,例如:1,2,3,…
非正常的数字都是false,例如:NaN ,undefined,null,0


循环

  • 语法:for(循环变量;循环条件;变化值){ 循环体 }
  • 循环嵌套:内层循环执行完才会进入外层循环的第二次

    数组遍历

    取出数组中的每一个数据

  1. let names = ['张三','李四','王五','赵六']
  2. for(let i = 0;i < names.length; i++){
  3. console.log(names[i])
  4. }

增加

  • 数组名.push(新增内容)结尾增加数据,逗号隔开数据
  • 数组名.unshift(新增内容)开头增加数据,逗号隔开数据

    删除

  • 数组名.pop()删除结尾的数据

  • 数组名.shift()删除开头的数据
  • 数组名.splice(操作位置的下标,删除的个数,添加的参数)

函数

封装代码,方便重复使用 定义时代码不执行,调用时代码才执行

函数使用

定义:function 函数名 () { 函数体 }
调用:函数名()

函数传参

  • 形参
    • 定义时()里面写等待接收数据的
  • 实参
    • 调用时()里面写真实数据
  • 默认参数
    • 定义形参的时候给出默认的数据
    • 没有收到具体的数据时,使用定义的形参
    • function 函数名 (a = 0,b = 2) { 函数体 }

函数返回值

  • return 数据 / 变量名 / 数组
  • 返回的位置是函数调用的位置 / 单写return表示退出函数

匿名函数

  • function() {}
    • 这样无法直接调用
    • 将匿名函数赋值给一个变量,并通过这个变量名+()进行调用(相当于变量名=函数名)

立即执行函数

避免全局变量之间的污染 多个立即执行函数要用;隔开,不然会报错;加在前或后

  • (匿名函数) ()第二个括号表示直接调用
  • (匿名函数 () ) 括号里面的括号表示直接调用

对象

object 一种数据类型,(无序的数据集合,数组是有序的)

  • 声明:let 对象名 = { } / let 对象名 = new object()
  • 使用:let 对象名 = { 属性名:属性值,方法名:函数 }
    • 逗号隔开,属性名引号可有可无
    • 遇到特殊字符必须加引号,如:中横线

对象查找

  • 属性值查找
    • .写法,.的后面必须是属性名
      • 对象名.属性名(用.连接)
    • []写法,[]内可以放属性名,也可以放变量名
      • 对象名['属性名'](属性名需要写在’’内)
  • 方法的查找
    • 对象名.方法名()

修改

查找之后重新赋值

  • 属性值修改
    • 对象名.属性名 = 修改的值
    • 对象名[‘属性名’] = 修改的值
  • 方法的修改:
    • 对象名.方法名 = function (){修改的值}

新增

  • 属性新增:
    • 对象名.新增属性名 = 值
    • 对象名[‘新增属性名’] = 值
  • 方法的新增:
    • 对象名.新增方法名 = function (){值}

删除

  • 属性的删除:
    • delete 对象名.属性名
  • 方法的删除:
    • delete 对象名.方法名

对象方法(函数)的使用:定义中的函数()内写形参,调用的()内写实参

对象遍历:

for (let 变量名 in 遍历的对象名) { console.log(对象名[变量名])}

对象数组遍历:

for (let i = 0; i < 数组名.length; i++) {

  1. i = 索引值
  2. 数组名[i] = 对象名
  3. 数组名[i].属性名 = 属性值
  4. }

内置对象

  • Math:Math.方法名()
    • 常用方法:floor向下取整 random()*随机数

N~M的随机数代码:

  • Math.floor(Math.random() * (M - N + 1)) + N