JavaScript(基础与流程控制)
一、基础
1、JS的组成
- ECMAScript(JavaScript语法)
- ECMAScript规定了JS编程语法和基础核心知识,是所有浏览器厂商共同遵守的一套JS语法工业标准
- DOM(页面文档对象模型)
- 通过DOM提供的接口可以对页面上的各种元素进行操作(大小、位置、颜色等)
- BOM(浏览器对象模型)
- 通过BOM可以操作窗口,比如弹出框、控制浏览器跳转、获取分辨率等
2、书写位置
- 行内
- 内嵌
- 外部
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 内嵌式 -->
<script>
alert('已点击')
</script>
<!-- 外部引入 -->
<script src="my.js"></script>
</head>
<body>
<!-- 行内 直接写在元素内部 -->
<input type="button" value="chick" onclick="alert('已点击')">
</body>
</html>
3、注释
// 单行注释
/* 多行注释 */
4、输入输出语句
方法 | 说明 | 归属 |
---|---|---|
alert(msg) | 浏览器弹出警示框 | 浏览器 |
console.log(msg) | 浏览器控制台打印输出信息 | 浏览器 |
prompt(info) | 浏览器弹出输入框,用户可以输入 | 浏览器 |
5、变量
变量是程序在内存中申请的一块用来存放数据的空间
5.1、变量使用
- 声明变量
- 赋值
// 声明一个变量名为age的变量
var age;
// 变量赋值为18
age = 18;
// 变量初始化
var myname = '张三';
5.2、更新变量
一个变量被重新赋值后,它原有的值就会被覆盖,变量值将以最后一次赋值为准
var name = '张三'
console.log(name) // 张三
name = '李四'
console.log(name) // 李四
5.3、声明多个变量
// 声明多个变量,只需要一个var,中间英文逗号隔开
var name,age,address,gender;
5.4、声明变量的特殊情况
// 只声明不赋值
var gender;
console.log(gender); // undefined
// 不声明不赋值
console.log(telephone); // 报错
// 不声明直接赋值使用(不提倡)
qq = 110;
console.log(qq); // 110
5.5、命名规范
- 可包含字母,下划线,数字,$这些可用的字符
- 不能用数字开头
- 不能使用关键字和保留字
- 严格区分大小写
- 建议变量的命名要有意义
- 建议使用驼峰命名法
6、数据类型
在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型
6.1、变量的数据类型
JavaScript是一种弱类型或者说动态语言。不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。
在代码运行时,变量的数据类型是由JS引擎根据 “等于号(=)”右边的变量值的数据类型来判断的。
JavaScript拥有动态类型,同时意味着相同的变量可用作不同的类型
6.2、数据类型的分类
6.2.1、简单数据类型
复杂数据类型 |
---|
object |
简单数据类型 | 说明 | 默认值 |
---|---|---|
Number | 数字型,包含整型值和浮点型值,如21、0.21 | 0 |
Boolean | 布尔值类型,如true、false,等价于1和0 | false |
String | 字符串类型,如"张三"。在JS中字符串都带引号 | "" |
Undefined | var a;声明了变量a,但是没有赋值,此时a = undefined | undefined |
Null | var a=null;声明了变量a 为空值 | null |
-
数字型
-
0开头代表八进制,0x开头代表16进制
-
数值的最大值和最小值
// JS中数值的最大值和最小值 console.log(Number.MAX_VALUE); // 最大值:1.7976931348623157e+308 console.log(Number.MIN_VALUE); // 最小值:5e-324
-
三个特殊值
console.log(Number.MAX_VALUE * 2); // Infinity: 无穷大,大于任何数值 console.log(-Number.MAX_VALUE * 2); // -Infinity:无穷小,小于任何数值 console.log('字符串' - 100); // NaN:Not a number的缩写,代表一个非数值
-
isNaN()
// 判断一个变量是否是非数字型。是数字,false;不是数字:true console.log(isNaN(10)); // false console.log(isNaN('字符串')); // true
-
-
字符串型
-
一定要加引号(""或''),推荐用单引号('')
-
引号嵌套(外双内单 或 外单内双)
-
转义符(都是以\开头)
转义符 解释说明 \n 换行符,n是newline的意思 \\ 斜杠\ \' 单引号 \" 双引号 \t tab 缩进 \b 空格,b 是 blank的意思 -
字符串的长度:
'字符串'.length
-
字符串拼接:不管什么类型的数据,和字符串拼接,最终结果总是字符串类型
'字符串1' + '字符串2 = '字符串1字符串2'
'12' + 12 = '1212'
-
字符串拼接加强
var age = 18; console.log('我今年' + age + '岁')
-
-
布尔型
var flag1 = true; var flag2 = false; console.log(flag1 + 1); // 2 console.log(flag2 + 1); // 1
-
undefined
var str; console.log(str); // undefined console.log(str + '字符串') // undefined字符串 console.log(str + 1) // NaN(不是一个数字)
-
NULL
var space = null; console.log(space + '字符串') // null字符串 console.log(space + 1) // 1
6.2.2、typeof
// 判断数据类型
var num = 10;
console.log(typeof num); // number
var str = '10';
console.log(typeof str); // string
var flag = true;
console.log(typeof flag); // boolean
var vari = undefined;
console.log(typeof vari); // undefined
var timer = null;
console.log(typeof timer); // object(对象)
// 控制台打印颜色
number。控制台打印颜色:蓝色
string。控制台打印颜色:黑色
boolean。控制台打印颜色:蓝色
undefined。控制台打印颜色:浅灰色
null。控制台打印颜色:浅灰色
6.2.3、字面量
字面量是在源代码中一个固定值的表示法,通俗来说,就是字面量表示如何表达这个值
- 数字值字面量:8,9,10
- 字符串字面量:'字符串'
- 布尔字面量:true、false
6.3、数据类型的转换
把一种数据类型转换为另外一种数据类型
-
转换为字符串
方式 说明 案例 toString() 转成字符串 var num=1;alert(num.toString()) String()强制转换 转成字符串 var num=1;alert(String(num)) 加号"+"拼接(隐式转换) 和字符串拼接结果都是字符串 var num =1;alert(num+'字符串') -
转换为数字型
方式 说明 案例 parseInt(string)函数 将string类型转成整数数值型 parseInt('78') parseFloat(string)函数 将string类型转成浮点数数值型 parseFloat('78.21') Number()强制转换函数 将string类型转换为数值型 Number('12') js隐式转换 (- * /) 利用算数运算隐式转换为数值型 '12' - 0 /* 需要注意 */ // parseInt console.log(parseInt('3.14')); // 3 取整 console.log(parseInt('120px')); // 120 去除单位,保留数字 console.log(parseInt('re120px')); // NaN 不是数字 // parseFloat console.log(parseFloat('3.14')); // 3.14 console.log(parseFloat('120px')); // 120 去除单位,保留数字 console.log(parseFloat('re120px')); // NaN 不是数字 // (- * /) console.log('123' - '120') // 3
-
转换为布尔型
console.log(Boolean('')); // false console.log(Boolean(0)); // false console.log(Boolean(NaN)); // false console.log(Boolean(null)); // false console.log(Boolean(undefined)); // false console.log(Boolean('字符串')); // true console.log(Boolean(12)); // true
6.4、扩展
6.4.1、解释性语言与编译型语言
- 区别
- 翻译时间点不同
- 编译器是在代码执行之前进行编译,生成中间文件
- 解释器是在运行时进行解释,并立即执行(当编译器以解释方式运行的时候,也称之为解释器)
6.4.2、标识符、关键字、保留字
- 标识符
- 指开发人员为变量、属性、函数、参数取的名字
- 不能是关键字和保留字
- 关键字
- 指JS本身已经使用的字,不能再用它们充当变量名、方法名
- 保留字
- 预留的“关键字”。现在不是关键字,将来可能是关键字。
7、运算符
也被成为操作符。实现赋值、比较和执行算数运算等功能的符号
7.1、算数运算符
算数运算使用的符号,用于执行两个变量或值的算术运算。
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 | 10+20=30 |
- | 减 | 10-20=-10 |
* | 乘 | 10*20=200 |
/ | 除 | 10/20=0.5 |
% | 取余数(取模) | 返回除法的余数9%2=1 |
console.log(1+1); // 2
console.log(1-1); // 0
console.log(1*1); // 1
console.log(1/1); // 1
// 1 %
console.log(4%2); // 0
console.log(5%3); // 2
console.log(3%5); // 3
// 2 浮点数 算数运算可能存在问题 最好避免直接小数运算
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.07 * 100); // 7.000000000000001
// 3 不要直接判断两个浮点数是否相等
var num = 0.1 + 0.2
console.log(num == 0.3) // false
-
补充
- 取余(%)的主要用途是判断一个数是否可以被整除。根据余数是0判断
- 运算符优先级,先乘除,后加减,有小括号先算小括号里边的
-
表达式
- 由数字、运算符、变量等组成的式子
1 + 1
- 由数字、运算符、变量等组成的式子
-
返回值
2 = 1 + 1
中的2就是返回值
7.2、递增和递减运算符
如果需要反复给数字变量添加或者减去1,可以使用递增(++)或递减(--)运算符来完成。
在JS中,递增和递减运算符可以放在变量前边,也可以放在变量后边。
放在变量前边时,称为前置递增(递减)运算符
放在变量后边时,称为后置递增(递减)运算符
注意:递增和递减运算符必须和变量配合使用
// 前置递增运算符
var age = 10;
++age; // 类似 age = age + 1
// 先自加1 后返回值
var p =10;
console.log(++p + 10) // 21
// 后置递增运算符
var age = 10;
age++; // 类似 age = age + 1
// 先返回原值 再加1
var p = 10;
console.log(p++ + 10) // 20
console.log(p) // 11
-
前置与后置运算符的区别
- 单独使用,没有区别
- 前置,先自加1 后返回值(先己后人)
- 后置,先返回原值 再加1(先人后己)
-
练习
var a = 10; ++a; // ++a=11 a=11 var b = ++a + 2; // ++a=12 console.log(b); // 14 var c = 10; c++; // c++=10 c=11 var d = c++ + 2 // c++=11 c=12 console.log(d); // 13 var e = 10; var f = e++ + ++e; // e++=11 e=11; ++e=11 e=12 console.log(f); // 22
7.2、比较运算符
也叫关系运算符。是两个数据进行比较时所使用的运算符,比较运算后,返回一个布尔值作为比较运算的结果。
运算符名称 | 说明 | 案例 | 结果 |
---|---|---|---|
< | 小于号 | 1<2 | true |
> | 大于号 | 1>2 | false |
>= | 大于等于号 | 2>=2 | true |
<= | 小于等于号 | 3<=2 | false |
== | 判等号(会转型) | 37 == '37' | true |
!= | 不等号 | 37 != 37 | false |
=== | 全等号 (要求值和数据类型都一致) | 37 === '37' | false |
!== | 不绝对等于(值和类型有一个不相等,或两个都不相等) | 5 !== '5' | true |
7.3、逻辑运算符
用来进行布尔值运算的运算符,其返回值也是布尔值。
逻辑运算符 | 说明 | 案例 | 结果 |
---|---|---|---|
&& | ”逻辑与“,简称”与“ and | true && false | false |
|| | ”逻辑或“,简称”或“ or | true || false | true |
! | ”逻辑非“,简称”非“ not | !true | false |
-
短路运算(逻辑中断)
- 当有多个表达式(值)时,左边的表达式值可以确定结果是,就不再继续运算右边的表达式的值
// 逻辑与 // 如果左表达式为true,则返回右表达式 console.log(123 && 456) // 456 // 如果左表达式为false,则返回左表达式 console.log(0 && 456) // 0 console.log(0 && 456 && 567) // 0 // 逻辑或 // 如果左表达式为true,则返回左表达式 console.log(123 || 456) // 123 // 如果左表达式为false,则返回右表达式 console.log(0 || 456) // 456 console.log(0 || 456 || 789) // 456 // 代码应用 var num = 0; console.log(123 || num++); // 123 console.log(num); // 0。因为在(123 || num++)时,逻辑或短路,num++并未执行
7.4、赋值运算符
用来把数据赋值给变量的运算符
赋值运算符 | 说明 | 案例 |
---|---|---|
= | 直接赋值 | var age =18 |
+=、-= | 加、减一个数后再赋值 | var age=10;age+=5;// 15 |
*=、/=、%= | 乘、除、取模后再赋值 | var age=2;age*=5;// 10 |
7.5、运算符优先级
优先级 | 运算符 | 顺序 |
---|---|---|
1 | 小括号 | () |
2 | 一元运算符 | ++ == ! |
3 | 算术运算符 | 先* / % 后 + - |
4 | 关系运算符 | > >= < <= |
5 | 相等运算符 | == != === !== |
6 | 逻辑运算符 | 先 && 后 || |
7 | 赋值运算符 | = |
8 | 逗号运算符 | , |
二、流程控制
在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的。很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能。
1、顺序结构
- 程序会按代码的先后顺序,依次执行
2、分支结构
- 由上到下执行代码过程中,根据不同的条件,执行不同的代码,得到不同的结果
2.1、if
// if
// 如果条件表达式结果为真,执行{}中语句
// 如果条件表达式结果为假,执行if语句后边的代码
if(条件表达式){
// 执行语句
}
// if else
// 如果条件表达式结果为真,执行{执行语句1}
// 如果条件表达式结果为假,执行{执行语句2}
if(条件表达式){
// 执行语句1
}else{
// 执行语句2
}
// if else if
// 如果{条件表达式1}结果为真,执行{执行语句1}
// 如果{条件表达式2}结果为真,执行{执行语句2}
// 如果{条件表达式1,条件表达式2}结果都为假,执行{其他语句}
if(条件表达式1){
// 执行语句1
}else if(条件表达式2){
// 执行语句2
}else{
// 其他语句
}
2.2、switch
// 基于不同的条件来执行不同的代码。当针对变量设置一系列的特定值的选项时,就可以用switch。
// 语法结构
switch(表达式){
case value1:
执行语句1;
break;
case value2:
执行语句2;
break;
...
default:
执行最后语句
}
// 如果{ 表达式 匹配 value1 },执行{执行语句1}
// 如果{ 表达式 匹配 value2 },执行{执行语句2}
// 如果{ 表达式 均为匹配 },执行default中代码{执行最后语句}
var num = 2;
switch(num){
case 1:
console.log(1);
break;
case 2:
console.log(2); // 执行。打印2
break;
case 3:
console.log(3);
break;
default:
console.log('没有匹配结果');
}
- 匹配指的是 值和数据类型全相等。(===)
- 如果没有break,不会退出循环。会继续依次向下执行,直到运行到default或遇到break
2.3、三元表达式
// 语法结构
// 条件表达式 ? 表达式1 : 表达式2
// 如果{条件表达式}为真,返回{表达式1}的值
// 如果{条件表达式}为假,返回{表达式2}的值
console.log(2 > 1 ? true : false) // true
console.log(2 < 1 ? true : false) // false
2.4、if与switch区别
- 一般情况下,两个语句可以相互替换
- if else范围判断,更加灵活。switch case 处理比较确定的值
- switch语句进行条件判断后直接执行到程序的条件语句,效率更高。if else有几种条件,就判断多少次
- 当分支较少时,if...else语句的执行效率比switch语句高
3、循环结构
目的是重复执行某些语句。
在程序中,一组被重复执行的语句被称之为循环体,能否继续重复执行,却决于循环的终止条件。
由循环体和循环的终止条件组成的语句,称之为循环语句
3.1、for循环
// 重复执行某些代码 通常跟计数有关系
for(初始化变量;条件表达式;操作表达式){
// 循环体
}
// 初始化变量:就是var声明的普通变量,通常用于用作计数器
// 条件表达式:决定每一次循环是否继续执行,就是终止条件
// 操作表达式:每次循环最后执行的代码 经常用于计数器变量进行更新(递增或递减)
// ----------------------------------------------------------------
for(var i=1;i<=100;i++){
console.log(i)
}
// 首先执行计数器变量 var i = 1 (for循环中只执行一次)
// 其次执行条件表达式 i<=100 满足条件(1<=100 = true);不满足则退出
// 最后执行i++(此时i=2)
// 第二轮开始执行条件表达式,直到条件表达式不满足条件为止
3.2、while循环
while(条件表达式){
// 循环体
}
// 当条件表达式结果为true,则执行循环体;否则退出循环
// -----------------------------------------
var num = 1;
while(num <= 100){
console.log(num);
num++;
}
3.3、do while循环
do {
// 循环体
} while(条件表达式)
// 先执行一次循环体,再判断条件
// 如果条件表达式为true,则继续执行循环体
// 如果条件表达式为false,则退出循环
// -----------------------------------
var i = 1;
do {
console.log(i);
i++;
} while (i <= 100)
3.4、断点调试
浏览器开发者工具(F12) -- Sources -- 找到对应JS文件 -- 点击想要断点的行号 -- F11下一步
3.5、continue
用于立即跳出本次循环,继续下一次循环(本次循环中continue后的代码少执行一次)
3.6、break
立即跳出整个循环(循环结束)
该内容学习自 传智播客JavaScript基础课程 javaScript零基础通关必备教程