3. JavaScript
3.1 JavaScript 变量及数据结构
3.1.1 变量的命名规范
1、变量名必须是数字、字母、下划线、$这四种字符组成。
2、变量名的首字符不能是数字。
3、变量名区分大小写,如:var a; 与 var A; 是两个不同的变量。
4、变量名不能是 JavaScript 的保留字。如:function、var、return…
5、变量名尽量做到望文生义,如:var name = ‘张三’;
3.1.2 变量的数据类型
JavaScript 的数据类型如下:
1、string 类型,代表字符串类型,可以是单引号或双引号。
2、number 类型,代表各种数字(代表整数和小数)。
3、object 类型,代表所有的对象类型。
4、Array 类型,代表所有的数组类型。
5、undefined 类型,代表未声明的类型。
6、boolean 类型,代表布尔类型,可以取值 true 或 false,一般非 0 即为 true,
‘’ null undefined false 0 isNaN 等都为 false
7、function 类型,代表函数类型。
3.1.3 通过不同的方法查看变量的类型
var a = 10;
var a1 = 1.1;
var s = "hello";
var ss = null;
var b = true;
var arr = [];
function test() {}
// 查看变量类型方法一:typeof [重点掌握]
// typeof: 查看变量的数据类型,使用较多,一般不能查看详细类型
console.log("a的变量类型:" + typeof a); // number
console.log("a1的变量类型:" + typeof a1); // number
console.log("s的变量类型:" + typeof s); // string
console.log("m的变量类型:" + typeof m); // undefined
console.log("ss的变量类型:" + typeof ss); // object
console.log("b的变量类型:" + typeof b); // boolean
console.log("test的变量类型:" + typeof test); // function
console.log("arr的变量类型:" + typeof arr); // object
console.log("--------------------------------------------");
// 查看变量类型方法二:Object.prototype.toString.call(变量名) [了解]
console.log("ss的变量类型:" + Object.prototype.toString.call(ss)); // [object Null]
console.log("arr的变量类型:" + Object.prototype.toString.call(arr)); // [object Array]
console.log("--------------------------------------------");
// 查看变量类型方法三:变量名.constructor [了解]
console.log("arr的变量类型:" + arr.constructor); // function Array() { [native code] }
console.log("a的变量类型:" + a.constructor); // function Number() { [native code] }
3.2 JavaScript 数据类型间的转换
3.2.1 Number 与字符串之间的转换
// 1、Number 类型与字符串之间的转换:
// 1.1、Number -> string
var n = 10;
console.log("n = " + typeof (n + ""));
// 1.2、string -> Number
// 转换方法一:使用 Number()函数完成转换:
var str = "123aa"; // 遇到第一个非数值型字符就停止转换
var str1 = Number(str); // 返回NaN
console.log("str = " + (str1 + 1));
// 缺点:如果字符串中有一个是非数字字符,则转换失败,返回 NaN(not a number)
// 转换方法二(整数):使用 parseInt() 函数完成转换: [只能转换整数]
/*
参数 2 :可以指定进制数,代表待转换的数字的进制,
如:这里的 8 ,代表将需转换的数字 123 当作 8 进制进行转换,返回的是转换后的 10 进制结果。
*/
str = parseInt(str, 8);
console.log("str(parseInt) = " + (str + 1));
console.log("----------------------------------------------");
// 转换方法二 ( 小数 ) :使用 parseFloat() 函数完成转换: [只能转换小数]
var aa = "1.234";
console.log("aa(parseFloat) = " + parseFloat(aa));
3.2.2 布尔类型的转换
// 2.1 一些特殊的数值将被js转换为false
var a = 0;
var b = "";
var c = undefined;
var d = null;
var e = NaN;
// 装换方式一:Boolean()
console.log("a转换为布尔类型:" + Boolean(a));
console.log("b转换为布尔类型:" + Boolean(b));
console.log("c转换为布尔类型:" + Boolean(c));
console.log("d转换为布尔类型:" + Boolean(d));
console.log("e转换为布尔类型:" + Boolean(e));
console.log("--------------------------------------");
// 转换方法二:!! (常用在js开发的一些框架底层源码中)
console.log("a转换为布尔类型:" + !!a);
console.log("b转换为布尔类型:" + !!b);
console.log("c转换为布尔类型:" + !!c);
console.log("d转换为布尔类型:" + !!d);
console.log("e转换为布尔类型:" + !!e);
console.log("--------------------------------------");
// 2.2 一些非零值被转换为true
var f = "abc";
var g = 1.234;
console.log("f转换为布尔类型:" + !!f);
console.log("g转换为布尔类型:" + !!g);
3.3 JavaScript 各种运算符
3.3.1 算术运算符
3.3.1.1 双目运算符
// 1.1 双目运算符: (+ - * / %)
var a = 10;
var b = 3;
console.log("a + b = " + (a + b));
console.log("a - b = " + (a - b));
console.log("a * b = " + a * b);
console.log("a / b = " + a / b);
console.log("a % b = " + (a % b));
3.3.1.2 单目运算符
// 1.2 单目运算符:(++ --)
var aa = 1;
// 1.2.1 ++ 运算符:
// 1.2.1.1 前加
// 情况一:单独使用时
++aa; // 相当于: ① aa = aa + 1;
console.log("aa = " + aa);
// 情况二:与表达式一起使用时
var bb = ++aa; // 相当于: ① aa = aa + 1; ② bb = aa;
console.log("aa = " + aa + ",bb = " + bb);
// 1.2.1.2 后加
// 情况一:单独使用时
aa++; // 相当于: ① aa = aa + 1;
console.log("aa = " + aa);
// 情况二:与表达式一起使用时
bb = aa++; // 相当于: ① bb = aa;② aa = aa +1;
console.log("aa = " + aa + ",bb = " + bb);
// 1.2.2 -- 运算符:
// 1.2.2.1 前减
// 情况一:单独使用时
--aa; // 相当于: aa = aa - 1;
console.log("aa = " + aa);
// 情况二:与表达式一起使用时
bb = --aa; // 相当于: ① aa = aa - 1;② bb = aa;
console.log("aa = " + aa + ",bb = " + bb);
// 1.2.2.2 后减
// 情况一:单独使用时
aa--; // 相当于: aa = aa - 1;
console.log("aa = " + aa);
// 情况二:与表达式一起使用时
bb = aa--; // 相当于: ① bb = aa; ② aa = aa - 1;
console.log("aa = " + aa + ",bb = " + bb);
3.3.2 关系运算符
// 关系运算符 (> >= < <= == != === !==)
var a = 10;
var b = 5;
var c = "10";
console.log("a > b 结果:" + (a > b));
console.log("a < b 结果:" + (a < b));
console.log("a == b 结果:" + (a == b));
console.log("a != b 结果:" + (a != b));
console.log("a == c 结果:" + (a == c));
console.log("a === c 结果:" + (a === c));
面试题:== 与 === 之间的区别
前者是将两个数据转换为同一个数据类型,再比较内容是否相等。而后者是先比较类型是否相等,如果不相等就停止比较,如果相等再比较内容。所以,后者性能更高。
3.3.3 逻辑运算符
3.3.3.1 && 运算符的用法
// 1. && 的用法:
// 情况一:一般用法 , 只有所有参与运算的表达式都为真,整个结果才为真。
var a = 10;
var b = 5;
var c = 18;
var d = 20;
var f = a > b && c > d; // 返回 false, 第一个表达式为 true, 第二个为 false
console.log("f = " + f);
// 情况二:短路用法,当参与运算的表达式中有一个返回 false,其后的表达式不再执行。
f = a++ < --b && ++c > d--;
console.log("a = " + a + ",b = " + b + ",c = " + c + ",d = " + d);
3.3.3.2 || 运算符的用法
// 2. || 的用法
// 情况一:一般用法,只有所有参与运算的表达式都为 false ,整个结果才为 false
// 只要有一个为 true, 整个表达式返回 true
f = a > b || c > d;
console.log("f = " + f);
// 情况二:短路,当参与运算的表达式中有一个返回 true, 其后的表达式就不再执行。
f = a++ < --b || ++c > d--;
console.log(
"a = " + a + ",b = " + b + ",c = " + c + ",d = " + d + ",f = " + f
);
3.4 JavaScript 条件结构
3.4.1 if 条件结构
//if 条件结构:
//1 )简单 if
var a = 10;
if (a > 10) {
console.log("a > 10");
}
//2 )if...else 结构:
if (a > 10) {
console.log("a > 10");
} else {
console.log("a <= 10");
}
//3 )if...else if ....else if ...else... 多重 if 结构
// 案例:根据成绩打印评语。
var score = 83;
if (score > 90) {
console.log("优秀.");
} else if (score > 80) {
console.log("良好");
} else if (score > 70) {
console.log("一般");
} else if (score > 60) {
console.log("及格");
} else {
console.log("不及格");
}
3.4.2 switch…case 结构
// 案例:根据输入的月份数打印天数
var month = 5;
var day = -1; // 代表某个月的天数
switch (month) {
// 情况一:带有 31 天的月份为: 1 3 5 7 8 10 12
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
// 情况二:带有 30 天的月份为: 4 6 9 11
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
// 情况三:带有 28 天的月份为: 2
case 2:
day = 28;
break;
}
console.log(month + "月总共有:" + day + "天!");
3.4.3 三元运算符
var aa = "hello";
console.log(aa === "hello" ? " 成立 " : " 不成立 ");
// 案例:根据输入的三个数字,找出其中的最大值?
var a = 10,
b = 15,
c = 2;
// 方法一:
var max1 = a > b ? a : b;
var max = max1 > c ? max1 : c;
console.log("max = " + max);
console.log("------------------------------------");
// 方法二:
var maxx = (a > b ? a : b) > c ? (a > b ? a : b) : c;
console.log("maxx = " + maxx);
3.5 JavaScript 循环结构
3.5.1 while 循环
.t {
display: inline-block;
width: 40px;
height: 30px;
margin-right: 5px;
margin-bottom: 5px;
background: darkblue;
color: white;
text-align: center;
line-height: 30px;
}
// 案例一:打印 1-100 之间所有数字之和
var i = 1; //① 循环变量
var sum = 0; // 存放累加求和的变量
while (i <= 100) {
//② 循环条件
sum += i;
i++; //③ 循环变量的修改
}
console.log("sum = " + sum);
console.log("----------------------------------------");
// 案例二:输出 1-100 之间个位数为 3 并且每 5 个一换行
// 分析: ① 个位数是 3 , i % 10 == 3 ,
// ② 每五个一换行需要一个计数器
var n = 1; // 代表个位数是 3 的数字的个数
var j = 1;
document.write("1-100 之间个位数为 3 的数字如下:<hr>");
while (j <= 100) {
if (j % 10 == 3) {
// 代表个位数为 3
document.write("<span class='t'>" + j + "</span>");
if (n++ % 5 == 0) {
document.write("<br>");
}
}
j++;
}
3.5.2 do…while 循环
// 案例:寻找 1~1000 之内,所有能被 5 整除、或者能被 6 整除的数字 , 每 20 个一换行。
var i = 1;
var n = 1;
do {
if (i % 5 == 0 || i % 6 == 0) {
document.write("<span class=t>" + i + "</span>");
if (n++ % 20 == 0) {
document.write("<br>");
}
}
i++;
} while (i <= 1000);
3.5.3 for 循环
// 案例一:编写程序 求 求 1-3+5-7+....-99+101 的值
// 分析:此题也看作是累加求和,不过每个数字前面有一个符号,
// 这个符号前的字符是 + - 交替变化的。
var sum = 0; // 定义存放求和结果的变量
var flag = 1; // 代表符号
var n = 1;
for (var i = 1; i <= 101; i += 2) {
if (n++ % 2 == 0) {
flag = -1;
}
sum += flag * i;
flag = 1;
}
console.log("sum = " + sum);
// 案例二:用for循环,输入10个整数,输出最大值
var aa = prompt("请输入第 1 个整数:");
var max = parseInt(aa); // 代表输入的 10 个整数中的最大值
for (var i = 1; i <= 9; i++) {
aa = parseInt(prompt("请输入第" + (i + 1) + "个整数:"));
if (aa > max) {
max = aa;
}
}
console.log("10 个整数中最大值为:" + max);
3.5.4 for…in 循环
// 用法一:遍历数组
var aa = [1, 2, 3, 4, 5, 6];
for (var i in aa) {
console.log(aa[i] + " ");
}
console.log("---------------------------------------");
// 用法二:遍历对象
for (var i in document) {
console.log(i);
}
3.6 JavaScript 数组
3.6.1 数组的基本用法
// 定义一个数组
// 方法一:数组直接量或数组字面量定义数组
var arr = [2, 3, 4, 6];
// 方法二:使用数组的构造函数定义
var arr1 = new Array(2); // 此时,只有一个参数代表数组的长度为 2
var arr2 = new Array(2, 3, 4); // 此时,代表定义了个三个元素的数组
// 为数组赋值
arr[5] = 123;
arr[6] = "abc";
console.log("arr.length: " + arr.length);
arr[arr.length] = 45;
arr[arr.length] = 456;
// 遍历数组元素
for (var i in arr) {
console.log(arr[i]);
}
注意:
1、JS 数组与 java 或C语言区别, JS 的数组长度是变化的,而 java 的长度是固定的。
2、JS 数组中的数据类型可以不一样,但 java 必须一样,但一般我们在 JS 中使用时也定义一样的类型。
3.6.2 与数组相关的API
// 数组的常用API
function text() {
// 1、定义一个数组
let arr1 = new Array(2); // 如果只有一个元素,代表的是数组的长度
console.log("arr1.length:", arr1.length, arr1[0]); // arr1.length: 2 undefined
// 2、使用[]直接声明数组
let arr2 = [1, 2, 3, 4, 5, 6];
console.log(arr2[0], arr2[1], arr2[2]); // 1 2 3
// 3、向数组中添加元素
// 添加元素到数组的未尾
arr2.push(100);
// 添加元素在数组的头部
arr2.unshift(200);
// 从数组头部移走一个元素
arr2.shift();
//(重点) 参数1:代表要删除的索引位置 参数2:代表要删除元素的个数
arr2.splice(5, 2);
//(重点) 参数1:开始截取的位置 参数2:截取到的位置(不包含)
let arr3 = arr2.slice(2, 5);
// 找出某个元素在数组中第一次出现的位置
let index = arr2.indexOf(2);
// 找出某个元素在数组中最后一次出现的位置
let lastIndex = arr2.lastIndexOf(2);
// 判断在数组中是否包含指定元素
let includes = arr2.includes(3);
// 定义排序规则,返回值是一个整数,如果是负数升序,正数降序,类似于java的Comparator接口
// arr2.sort(function (a, b) {
// return b - a;
// });
// 相当于: 箭头函数
// a - b: 升序 b - a: 降序
arr2.sort((a, b) => a - b);
console.log("index:", index);
console.log("lastIndex:", lastIndex);
console.log("includes:", includes);
console.log("arr3:", arr3);
console.log("arr2:", arr2);
console.log("------------------------------------");
// 4、扩展
// 案例一: 将指定数组中的每个元素的值乘以2
// map: 可以修改原数组中的每个元素
let arr4 = arr2.map((a) => a * 2);
console.log(arr4);
// 案例二: 可以筛选出原数组中的偶数
// js中:===首先比较类型再比较内容是否相等,而==只比较内容是否相等
let arr5 = arr2.filter((f) => f % 2 === 0);
console.log("arr5:", arr5);
// 案例三:将上次的值与当前值进行累加运算
// P: 代表上次值 c: 当前值, 0: 初始值
let sum = arr5.reduce((p, c) => p + c, 0);
let fax = arr5.reduce((p, c) => p * c, 1);
console.log("sum:", sum);
console.log("fax:", fax);
}
text();
// 扩展数组方法:Array.prototype.自己定义的扩展方法名 = function(){ 方法实现 }
Array.prototype.sayHello = function () {
console.log("数组元素如下:");
console.log("----------------------------");
for (let i = 0; i < this.length; i++) {
console.log(this[i] + " ");
}
console.log("----------------------------");
};
let arr = [1, 2, 3, 14];
arr.sayHello();
3.6.3 在数组中查找元素
// 在数组中查找元素
var arr = [4, 5, 1, 67, 90, 2];
var e = 67; // 代表要查找的数组元素
// 在数组中查找元素,遍历数组再比较从而找到元素
for (var i = 0; i < arr.length; i++) {
if (arr[i] == e) {
document.write("在位置" + i + "处找到了元素" + e + "!");
break;
}
}
console.log(i);
if (i == arr.length) {
document.write("没有找到元素" + e + "!");
}
3.7 JavaScript 内置对象
2.7.1 Math 对象的用法
// 数学对象的用法
function test() {
// 1、圆周率
let pi = Math.PI;
// 2、求绝对值
let abs = Math.abs(-10);
// 3、求n次幂
let pow = Math.pow(2, 3);
// 4、返回指定数的平方根
let sqrt = Math.sqrt(2);
// 5、最小值
let min = Math.min(1, 2);
// 6、最大值
let max = Math.max(1, 3);
// 7、比指定数要大的最小整数
let ceil = Math.ceil(3.13);
// 8、比指定数要小的最大整数
let floor = Math.floor(3.13);
// 9、产生一个[0,1)随机小数
let rand = Math.random();
// 10、求四舍五入,加0.5取整
let round = Math.round(3.455);
// 11、正弦值
console.log("pi:", pi);
let sin = Math.sin(Math.PI / 3);
console.log("abs:", abs);
console.log("pow:", pow);
console.log("sqrt:", sqrt);
console.log("min:", min);
console.log("max:", max);
console.log("ceil:", ceil);
console.log("floor:", floor);
console.log("rand:", rand);
console.log("round:", round);
console.log("sin:", sin);
}
2.7.2 String 对象的用法
// 字符串函数用法
function test() {
// 定义一个字符串
let str = "hello,world";
// 字符串长度
let len = str.length;
// 返回指定位置字符
let charAt = str.charAt(0);
// 返回某个字符第一次出现的位置
let indexOf = str.indexOf("o");
// 返回某个字符最后一次出现的位置
let lastIndexOf = str.lastIndexOf("o");
// 转换为大写形式
let toUpperCase = str.toUpperCase();
// 转换为小写形式
let toLowerCase = str.toLowerCase();
// 替换指定字符
let replace = str.replace("o", "O");
// 以指定字符开头
let startWith = str.startsWith("he");
// 以指定字符串结束
let endWith = str.endsWith("abc");
// 是否包含指定字符串,java中叫contains()
let includes = str.includes("wor");
// 按照指定字符拆分字符串
let split = str.split(",");
// 截取开始到结束位置的字符串,左闭右开区间
let substring = str.substring(6, str.length);
// 参数1:从指定位置开始截取 参数2:截取的字符个数
let substr = str.substr(6, 5);
console.log("len:", len);
console.log("charAt:", charAt);
console.log("indexOf:", indexOf);
console.log("lastIndexOf:", lastIndexOf);
console.log("toUpperCase:", toUpperCase);
console.log("toLowerCase:", toLowerCase);
console.log("replace:", replace);
console.log("startWith:", startWith);
console.log("endWith:", endWith);
console.log("includes:", includes);
console.log("split:", split);
console.log("substring:", substring);
console.log("substr:", substr);
}
2.7.3 Date 对象的用法
<body>
<div id="d1"></div>
<div id="d2"></div>
</body>
div{
background-color: darkblue;
color:lightyellow;
padding:2px 8px;
margin-bottom: 10px;
}
// js日期对象用法
function test() {
// 第一部分:组装时间
// 1. 构造一个日期对象
let dt = new Date()
// let dt = Date.now() // 得到日期的毫秒值
// let myDate = new Date(dt)
// 2. 得到日期的各个部分
let year = dt.getFullYear()
let month = dt.getMonth() + 1 // 从0开始计算的
let date = dt.getDate()
let hour = dt.getHours()
let minute = dt.getMinutes()
let seconds = dt.getSeconds()
// 3. 得到星期数
let weeks = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]
let index = dt.getDay() // 星期几
let weeName = weeks[index] // 星期名称
//3. 组装成日期
let info = year + "年" + month + "月" + date + "日 " + hour + ":" + minute + ":" + seconds + " " + weeName
console.log("当前时间:",info)
// 第二部分:将日期显示在div层中
document.querySelector("#d1").innerHTML = info
// 第三部分:让时间动起来
// 第一种方法:
// setTimeout(function(){
// test()
// },1000) // 代表每隔一秒调用test()函数
}
// window.onload = test;
// 第二种方法:
// onload: 代表页面元素都加载完毕后,才执行的事件处理函数
window.onload = function(){
test()
// 第二种方法:只用调用一次
setInterval(test,1000) // 只调用一次即可
}