js书写位置

1、行内式

可以将单行或少量 JS 代码写在HTML标签的事件属性中(以 on 开头的属性),如:onclick

可读性差, 在html中编写JS大量代码时,不方便阅读;

引号易错,引号多层嵌套匹配时,非常容易弄混; 注意单双引号的使用:在HTML中我们推荐使用双引号, JS 中我们推荐使用单引号
特殊情况下使用
2、内嵌式
可以将多行JS代码写到 script 标签中
3、外部JS文件
利于HTML页面代码结构化,把大段 JS代码独立到 HTML 页面之外,既美观,也方便文件级别的复用
引用外部 JS文件的 script 标签中间不可以写代码 <script src="my.js"></script>

注释
    单行注释快捷键   ctrl  +  / 
    多行注释alt +  shift  + a

输入输出语句
    alert(msg):浏览器弹出警示框
    console.log(msg):浏览器控制台打印输出信息
    prompt(info):浏览器弹出输入框,用户可以输入

变量

 变量的概念

        1、变量是用于存放数据的容器
        2、本质:变量是程序在内存中申请的一块用来存放数据的空间。
    变量的使用

声明变量

        var 是一个 JS关键字,用来声明变量( variable 变量的意思 )
        赋值:= 用来把右边的值赋给左边的变量空间中   此处代表赋值的意思
        变量的初始化: 声明一个变量并赋值

    变量语法扩展

    1、一个变量被重新复赋值后,它原有的值就会被覆盖,变量值将以最后一次赋的值为准。
    2、同时声明多个变量时,只需要写一个 var, 多个变量名之间使用英文逗号隔开。
    3、声明变量特殊情况
        只声明 不赋值 undefined
        不声明 不赋值  直接使用 报错
        不声明   只赋值 值
    4、 变量命名规范
        由字母(A-Za-z)、数字(0-9)、下划线(_)、美元符号( $ )组成
        严格区分大小写。var app; 和 var App; 是两个变量
        不能 以数字开头
        不能 是关键字、保留字
        变量名必须有意义
        遵守驼峰命名法。首字母小写,后面单词的首字母需要大写

数据类型

概念  

数据类型就是数据的类别型号
变量是用来存储值的所在处,它们有名字和数据类型
JavaScript 是一种弱类型或者说动态语言
        这意味着不用提前声明变量的类型,在程序运行过程中,类型会被自动确定
        JS引擎 根据 = 右边变量值的数据类型来判断

数据类型分为两类:

简单数据类型 (Number,String,Boolean,Undefined,Null)

数字型 Number
在JS中八进制前面加0,十六进制前面加 0x
最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308
最小值:Number.MIN_VALUE,这个值为:5e-32
                Infinity ,代表无穷大,大于任何数值
                -Infinity ,代表无穷小,小于任何数
                NaN ,Not a number,代表一个非数值
isNaN:判断是否为非数字的类型,是返回false,不是返回true

字符串型 String
字符串引号嵌套:外双内单,外单内双
字符串转义符:
                    \n 换行符
                    \ \  斜杠   \
                    \'  单引号
                    \" 双引号
                    \t  缩进
                    \b 空格
通过字符串的 **length** 属性可以获取整个字符串的长度。
             例: var strMsg = "我是帅气多金的程序猿!";
                alert(strMsg.length); // 显示 11

 字符串拼接

 字符串 + 任何类型 = 拼接之后的新字符串
 变量是不能添加引号的,因为加引号的变量会变成字符串

布尔型Boolean
  布尔类型有两个值:true 和 false 
  布尔型和数字型相加的时候, true 的值为 1 ,false 的值为 0

Undefined
   声明后没有被赋值的变量会有一个默认值undefined (
   和数字相加结果为 NaN,和字符串相加是相连

 Null
 存的值为空
 和数字相加时结果为 0+数字,和字符串相加是相连

 复杂数据类型 (object)

 获取变量数据类型

typeof 可用来获取检测变量的数据类型
prompt 取过来的值是 字符型
可以根据控制台数据的颜色判断数据类型 蓝色为数字型 黑色为字符型 深蓝色为布尔型 浅灰色为undefined、null

字面量:字面上表示如何表达这个值

数据类型转换

把一种数据类型的变量转换成另一种数据类型

转换为字符串
            toString()
            String()
            加号拼接字符串转换方式, 这一种方式也称之为隐式转换、

转换为数字型
            parseInt()整数型
            括号里是小数取整不存在进位问题直接去掉小数点后的, 如果括号里是数字加单位会自动去掉单位
            parseFloat()浮点数数值型
            Number()
            隐式转换是我们在进行算数运算的时候,JS 自动转换了数据类型

 转换为布尔型
            Boolean()
            代表空、否定的值会被转换为 false  ,如 ''、0、NaN、null、undefined  
            其余值都会被转换为 true

操作符

算数运算符

算术运算使用的符号,用于执行两个变量或值的算术运算。
加+  减- 乘* 除/ %取余
浮点数的精度问题:不要直接判断两个浮点数是否相等                                                                    表达式和返回值
            是由数字、运算符、变量等组成的式子
            表达式最终都会有一个结果,返回给开发者,称为返回值

递增和递减运算符

反复给数字变量添加或减去
注意:递增和递减运算符必须和变量配合使用

前置递增运算符:先自加,后返回值

后置递增运算符:先返回原值,后自加 

比较运算符

 比较运算后,会返回一个布尔值
 小于<   大于>  大于等于>=  小于等于<=   等于(会转型)== 不等于!= 恒等于(值和数据类型都一致)===  恒不等!==

赋值运算符

= 直接赋值
+=  -= 先加减一个值后赋值
*= /= %= 先乘除取余后赋值

逻辑运算符

逻辑与&&:两边都是 true才返回 true,否则返回 false
逻辑或 ||:两边都是 false才返回 false,否则返回 false
逻辑非 !:取反符,用来取一个布尔值相反的值

 短路运算(逻辑中断)

 当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值;

运算符优先级

1 小括号
2 一元运算符 ++   -- ! 非优先级最高
3 算术运算符 先*/% 后 + -
4 关系运算符 
5 相等运算符
6 逻辑运算符 先&&后||

流程控制

流程控制就是来控制代码按照一定结构顺序来执行

顺序流程控制

按照代码的先后顺序,依次执行

分支流程控制    

if 语句

// 条件成立执行代码
if (条件表达式) {
    // 条件成立执行的代码语句
}
//不成立则往下继续执行if语句后面的代码

 if else语句(双分支语句)

// 条件成立  执行 if 里面代码,否则执行else 里面的代码
if (条件表达式) {
    // [如果] 条件成立执行的代码
} else {
    // [否则] 执行的代码
}

  if else if(多分支语句)

// 适合于检查多重条件。
if (条件表达式1) {
    语句1;
} else if (条件表达式2)  {
    语句2;
} else if (条件表达式3)  {
   语句3;
 ....
} else {
    // 上述条件都不成立执行此处代码
}

 三元表达式

 表达式1 ? 表达式2 : 表达式3;

如果表达式1为 true ,则返回表达式2的值,如果表达式1为 false,则返回表达式3的值
类似于  if  else (双分支) 的简写

 switch分支流程控制

switch( 表达式 ){ 
    case value1:
        // 表达式 等于 value1 时要执行的代码
        break;
    case value2:
        // 表达式 等于 value2 时要执行的代码
        break;
    default:
        // 表达式 不等于任何一个 value 时要执行的代码
}

 注意: 执行case 里面的语句时,如果没有break,则继续执行下一个case里面的语句。
        效率高(直接跳转到匹配值),但范围小(需要固定值)

循环

for循环

语法结构

 for(①初始化变量; ②条件表达式;③ 操作表达式 ){
    //④循环体
}

初始化变量
初始化一个计数器,使用 var声明的变量,帮我们来记录次数
在整个 for 循环只会执行一次

条件表达式
确定每一次循环是否能被执行

操作表达式
用于计数器变量进行更新(递增或递减)

执行过程:
            ①--②--④--③--②--④--③...

断点调试:

断点调试可以帮助观察程序的运行过程
断点调试的流程:
            1、浏览器中按 F12--> sources -->找到需要调试的文件-->在程序的某一行设置断点
            2、Watch: 监视,通过watch可以监视变量的值的变化,非常的常用。
            3、摁下F11,程序单步执行,让程序一行一行的执行,这个时候,观察watch中变量的值的变化。

双重for循环

循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构
语法:

 for (外循环的初始; 外循环的条件; 外循环的操作表达式) {
    for (内循环的初始; 内循环的条件; 内循环的操作表达式) {  
       需执行的代码;
   }
}

内层循环可以看做外层循环的循环体语句
内层循环执行的顺序也要遵循 for 循环的执行顺序 
外层循环执行一次,内层循环要执行全部次数

while循环

 语法结构:

     while (①条件表达式) {
    // ②循环体代码 
}

执行思路:
            ①--②--...
注意:
            使用 while 循环时一定要注意,它必须要有退出条件,否则会成为死循环

do-while循环

语法结构;

    do {
    // ①循环体代码 - 条件表达式为 true 时重复执行循环体代码
} while(②条件表达式);

执行思路:
            ①--②--...
注意:
先再执行循环体,再判断,do…while循环语句至少会执行一次循环体代码

continue、break

continue 
跳出本次循环,继续下一次循环

break 
立即跳出整个循环(循环结束)

数组

概念

把一组相关的数据一起存放,提供方便的访问(获取)方式
是一组数据的集合
其中的每个数据被称作元素
可以存放任意类型的元素

创建数组

利用  new 创建数组  
            var 数组名 = new Array() ;
            注意 Array () ,A 要大写  

利用数组字面量创建数组
            var  数组名 = [];
            数组的字面量是方括号 [ ] 
            声明数组并赋值称为数组的初始化

数组元素的类型

可以存放任意类型的数据,例如字符串,数字,布尔值等。

获取数组中的元素

索引 (下标) :用来访问数组元素的序号(数组下标从 0 开始)
通过索引来访问、设置、修改对应的数组元素
注意:如果访问时数组没有和索引值对应的元素,则得到的值是undefined

遍历数组

把数组中的每个元素从头到尾都访问一次

数组的长度
            默认情况下表示数组中元素的个数
            数组名.length
            设置的length属性值大于数组的元素个数,则会在数组末尾出现空白元素
            置的length属性值小于数组的元素个数,则会把超过该值的数组元素删除

   增加新元素

通过索引增加元素
            arr[i]=新数据
            索引i不存在,在数组的末尾插入新元素
            索引i存在,则替换存在的元素