JavaScript
JavaScript之语法
一、概述
面向对象的编程语言,也称为浏览器解释型语言。
嵌入到HTML中交给浏览器去解释和执行。
1. 组成
- 核心语法(ECMAScript5)
- BOM(Browser Object Model)浏览器对象模型,提供操作窗口的方法
- DOM(Document Object Model)文档对象模型,提供操作页面元素的方法
- Ajax 前后端交互的技术,异步页面刷新(json交互)
- jQuery(JS工具)
二、基本使用
1. 引入JS
-
元素绑定事件方式书写JS代码
事件:用户的行为或元素的状态。例:
onclick
(单击)事件处理:事件发生后的响应
语法:将事件的名称以标签属性的方式绑定到元素上
-
内嵌
例:
<div onclick="">xx</div>
借助
<script></script>
嵌入JS代码,可以书写任意多次,书写在任意位置。不同的书写位置会影响代码执行的结果。书写位置即为JS代码执行的位置
-
外链
创建外部的js文件(***.js),引入方式:在HTML中使用
<script></script>
注意:script标签只能内嵌或外链二选一
JS基础语句:
alert("");
警告框
console.log("","");
控制台输出
prompt("");
带输入框的弹框
document.write();
网页写入(如果写入的内容为标签语法,则解析后呈现),wrtie()
表示动态写入内容,可以识别标签语法;如果通过元素绑定事件方式执行写入,会造成页面重写。
2. 语法规范
- 严格区分大小写;
- 语句可以使用
;
作为结束的标志,也可以不写 - 注释:
//
单行;/* */
多行
三、变量
1. 变量
变量用于存储在程序运行过程中可以随时修改的数据
关键字:var
// 定义
var a ; // 声明变量
a = 100 ; // 给变量赋值
var b = 200; //声明的同时赋值
var c,d,n; // 同时声明多个变量
c = 10;
d = 20;
var k = 100, m = 1000; //同时声明并赋值多个变量
注意:
变零使用var关键字声明,但未赋值,默认为
undefined
省略var关键字给变量赋值,变量可以正常使用,但是影响变量的作用域
变量如果未声明、未赋值,直接使用则会报错
2.常量
常量用于存储一经定义就不能修改的数据。
使用const关键字创建常量,必须声明并赋值。
命名规范:
- 变量名、常量名、函数名、方法名自定义,可以由数字、字母、下划线和
$
组成,禁止以数字开头,禁止与关键字冲突。尽量见名知意,多个单词组成采用小驼峰命名。 - 尽量使用小写字母表示,特殊情况区分。常量名一般采用全大写字母表示,与变量区分
3. 练习
定义变量,常量,计算圆的周长和面积,并保留n位小数
提示:
toFixed(n)
保留n位小数
var r = 6;
const PI = 3.14;
var l = 2 * PI * r;
var s = PI * (r ** 2);
console.log("该圆周长为:",l.toFixed(2));
console.log("该圆面积为:",s.toFixed(2));
四、数据类型
检测数据类型:typeof num /typeof (num)
1.值类型
基础数据类型
1.1 数值型
(1) number
-
整数
var a = 100; // 八进制以0位前缀 var b = 015; // 十六进制以0x为前缀 var c = 0x15;
不管使用哪一种进制表示,最终在控制台都以十进制输出
-
小数
var n = 1.56 // 科学计数法:var k = 1.56e3; 1.56*(10 ** 3) //e表示以10位底,3表示次方数 1.56 * 10 (3)
(2)string
字符串,使用引号表示
var s1 = 'chancey';
console.log(typeof s1 ,s1)
(3) boolean
只有true / false
两个值,可以转换成数值类型,true为1,false为0
(4) ubdefined
两种方式
特殊值,声明未赋值的时候,默认值为undefined
var age;
console.log(s)
console.log(typeof age);
(5) null
var num = null;
console.log(num,typeof num)
一般用于解除对象的引用。
2. 对象
引用数据类型
对象是由属性和方法组成,使用.语法
访问
函数、数组、字符串、日期、自定义对象
五、数据类型转换
1.自动类型转换
1.1 数学运算符
+ - * / %
var r1 = 100 + 10;
var r2 = 5 + "20";
var r3 = 50 + 2 + "1";
console.log(r1,r2,r3);
var r4 = "1" + 2 + 50;
console.log(r4);
var r5 = "100" + true;
var r6 = "100" + undefined;
var r7 = "100" + null;
console.log(r5,r6,r7)
var res2 = "hello" - 10;
console.log(res2);
var res3 = "100" - true;
var res4 = "100a" - true;
console.log(res3,res4)
var res5 = "100" + true;
var res6 = "100" - undefined;
var res7 = "100" - null;
console.log(res5,res6,res7)
1.2 运算规则
字符串与其他类型做+运算,将非字符串自动转为字符串做拼接,结果仍为字符串
其他情况下一律将操作数转number参与数学运算。如果转换number失败则变成NAN参与数学计算,结果一律为NaN
2.强制类型转换
(1) 转字符串 .toString()
将变量装换为字符串并返回
//强制类型转换
var n1 = 100;
var n2 = true;
var n3 = null;
//将其转换为字符串
var s1 = n1.toString();
var s2 = n2.toString();
// var s1 = n3.toString(); //对象不能直接转换
console.log(n1,typeof n1,s1,typeof s1)
console.log(n2,typeof n2,s2,typeof s2)
// console.log(n3.s3,typeof s3)
var n4 = undefined;
console.log(n4,typeof n4)
var s4 = undefined.toString()
null为对象类型无法转换为字符串
undefined特殊,同样不能转换
(2) 转换number
- 整体转number
Number(n)
console.log(Number("100"));
console.log(Number("100a"),Number("hello"));
console.log(Number(undefined),Number(null));
-
解析整数或解析number部分
parseInt(n)
解析整数部分parseFloat(n)
解析整数加小数解析过程:现将数据转换为字符串;从前向后逐位对每一个字符转number,转换失败则停止向后解析,直接返回结果
console.log(parseInt("100")); console.log(parseInt(35.5)); //取整数 console.log(parseInt("35.5a")); console.log(parseInt("a35.5")); console.log(parseInt(true)); console.log(parseFloat(35.5))
(3) 转布尔
Boolean(n)
console.log(Boolean(0))
console.log(Boolean(1))
console.log(Boolean(100))
console.log(Boolean('100'))
console.log(Boolean(0.0))
console.log(Boolean(""))
console.log(Boolean(undefined))
console.log(Boolean(null))
console.log(Boolean(NaN))
除0或者空字符串外,其余都为真,即
true
(0包括undefined / null / NaN
非空字符串也为真)
六、运算符
1.赋值运算符
=
2. 算数运算符
+ - * / %
3. 复合运算符
+= -= *= /= %=
4. 自增自减
++ --
作用:在变量自身值的基础上+1/-1
- 单独与变量结合,做前缀或后缀都可以,包含自动类型转换,在自身number值的基础上+1
- 与其他运算符结合使用,做前缀表示先自增,做后缀表示后自增
// 自增自减运算符
var a = 10;
a ++; // 等同于 a += 1;
++ a;
console.log(a);
var b = "10";
b += 1;
console.log(b)
// ++包含自动类型转换,在自身number值的基础上+1
b ++;
console.log(b)
var c = 10;
var r1 = c++; // 先将c值赋给r1,则r1为10,c还要自增,则c为11
console.log(c,r1)
var r2 = ++c; // c先自增,则c为12,然后将12赋值给r2,则r为12
console.log(c,r2)
var n = 5;
var r = n++ + ++n + n++ + ++n + n
console.log(r,n)
5. 比较运算符
> < <= >= == === != !==
(1) 比较运算符的结果永远是布尔值
(2) 运算规则:
console.log("10" > "2"); // 同为字符串的时候,逐位比较unicode编码值
console.log("15" > "151");
console.log("hello" > "apple");
console.log(r4 = "10" > 2);
console.log(100 > true); // 100>1
console.log(100 > undefined); //100>NaN
console.log(100 > null);
console.log('hello' > 100);
console.log('hello' > undefined); //NaN>NaN
console.log(true > false); //1>0
同为字符串进行比较,不会转换数据类型,逐位比较每位字符的Unicode码值;
其他情况下,一律将操作数转换为number进行比较。如果转换失败则变成NaN参与比较运算,结果一律为false
(3) 相等和全等
相等:包含自动转换类型,只要值相等就成立
全等:不会转换类型,要求数据类型一致并且值相等才会成立
不等:不考虑数据类型,只要值不相等就成立
不全等:数据类型不同或值不等,都不成立
console.log('10' == 10 , '10' === 10) //true false 松散比较和严格比较
console.log('10' != 10 , '10' !== 10) //false true
6. 逻辑运算符
逻辑运算的结果为布尔值
(1) 与&&
全1则1
(2) 或||
有1则1
(3) 非!
对已有结果取反,切换布尔值。除“零”值以外,其他值都为真
console.log(10>5 && 2>3) // false
console.log(10>5 && 2<3) // true
console.log(10>5 || 2>3) // true
console.log(10>5 || 2<3) // true
console.log(! 2>3) // false
console.log(! 2<3) // true
console.log(!2) // false
console.log(!0) // true
console.log(!(3>5)) //true
比较运算优先级:非!
>与&&
>或||
练习:
定义变量表示年份,判断是否为闰年
var year = 2019;
r = year%400==0 || year%4==0 && year%100!=0;
console.log(r)
7. 位运算符
位运算符是指直接对数据的二进制操作
(1)位与&
全1则1
console.log(3 & 5)
(2)位或|
(3)异或^
相同为0,不同为1
//两个变量交换值
var a = 3,b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log(a,b)
8.三目运算符
语法:表达式1 ? 表达式2 : 表达式3;
过程:判断表达式1是否成立,成立则执行或返回表达式2的结果,不成立则返回表达式3的结果
var money = 1000;
console.log( money >= 1000 ? '存款' : '余额');
var score = 85;
console.log(score >= 90 ? "A" : score >= 80 ? "B" : "C");
练习:
输入用户的成绩,判断区间范围
score = prompt("请输入您的成绩")
a = (score >= 80 ? '优秀' : score >= 60 ? '合格' : "不合格")
document.write("您的成绩",a)
输入用户的身高(m)和体重(kg),计算bmi,(bmi = 体重 / (身高*身高)),保留两位小数,判断身体指数,(bmi >= 23.9 偏胖 bmi >=18.5 健康 bmi < 18.5 偏瘦)
m = prompt("请输入身高(单位:m)")
kg = prompt("请输入体重(单位:kg)")
bmi = (kg / (m * m)).toFixed(1)
a = bmi >= 23.9 ? "偏胖" : bmi >= 18.5 ? "健康" : "偏瘦"
document.write("您的健康指数为:",a)
七、流程控制
1. 判断
分支语句
1.1 if
语法:
//单分支
if (判断条件){
条件成立的执行体
}else{
条件不成立的执行体
}
//多重分支
if (判断条件){
条件成立的执行体
}else if(){
前边条件成立的执行体
}else if(){
前边条件成立的执行体
}else{
以上条件均不成立的执行体
}
如果if()之后没有{},则if只控制if后边的一行代码
//单分支
var a = 10;
if(a > 0){
document.write(a,"<br>")
}
if(a < 0) //不跟{}
console.log("a < 0");
console.log("---------");
//多重分支
var b = 10;
if(b < 2){
document.write("成立");
}else{
document.write("不成立");
}
var b = 10;
if(b > 2){
document.write("成立");
}else if(b > 5){
document.write("不成立");
}else{
document.write("哈哈")
}
练习:
// 判断成绩
var s = prompt("请输入成绩");
if(s >= 80){
document.write("成绩优秀");
}else if(s >= 60){
document.write("成绩合格");
}else{
document.write("成绩不合格");
}
// 判断当日是今年的第几天
var year = prompt("请输入年份");
var month = prompt("请输入月份");
var day = prompt("请输入日份");
var sum = 0;
var day = Number(day)
// 闰年判断
var isRun = year%4 == 0 && year%100 != 0 || year%400 ==0
if(month == 1){
sum += day;
}else if(month == 2){
sum = 31 + day;
}else if(month == 3){
sum = 31 + 28 + day;
}else if(month == 4){
sum = 31 + 28 + 31 + day;
}else if(month == 5){
sum = 31 + 28 + 31 + 30 + day;
}else if(month == 6){
sum = 31 + 28 + 31 + 30 + 31 + day;
}else if(month == 7){
sum = 31 + 28 + 31 + 30 + 31 + 30 + day;
}else if(month == 8){
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + day;
}else if(month == 9){
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 30 + day;
}else if(month == 10){
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 30 + 31 + day;
}else if(month == 11){
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 30 + 31 + 30 + day;
}else if(month == 12){
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 30 + 31 + 30 + 31 + day;
}
if(isRun && month > 2){
sum ++
}
document.write("今天是",year,'年',month,'月',day,'日','<br/>',"今天是今年的第",sum,"天")
1.2 switch
用于值的全等匹配
语法:
switch(a){
//依次列举所有可能的值
case 值1:
//匹配全等时执行的代码段
break; //结束匹配
case 值2:
//代码语句
break
default:
//所有case匹配失败以后,执行的默认操作
}
var a = 3;
switch(a){
case 1:
document.write("a===1");
break;
case 2:
document.write("a===2");
break;
case 3:
document.write("匹配成功");
break;
default:
document.write("匹配失败");
}
特殊用法:
省略break,会从当前匹配到case开始向后执行所有的代码语句;
多个case共用代码段
case 1: case 2: //代码段 break;
使用switch改版日期计算
var year = prompt("请输入年份");
var month = prompt("请输入月份");
var day = prompt("请输入日份");
var sum = 0;
var day = Number(day)
// 闰年判断
var isRun = year%4 == 0 && year%100 != 0 || year%400 ==0
switch(month - 1){
case 11:
sum += 30;
case 10:
sum += 31;
case 9:
sum += 30;
case 8:
sum += 31;
case 7:
sum += 31;
case 6:
sum += 30;
case 5:
sum += 31;
case 4:
sum += 30;
case 3:
sum += 31;
case 2:
sum += 28;
if(isRun && month > 2){
sum ++
}
case 1:
sum += 31;
}
document.write("今天是",year,'年',month,'月',day,'日','<br/>',"今天是今年的第",sum,"天")
2. 循环
2.1 while
语法:
var i = 1; //定义循环变量
while(i<101){
//定义循环条件
i++//更新循环变量
}
练习
//打印1-100之间的整数
var i = 0;
while(i<101){
document.write(i,' ');
i ++;
}
// 求1-100之间整数的和
var a = 0;
var i = 0;
while(i<101){
// document.write(i,' ');
a += i;
i ++;
}
document.write(a)
// 输出1-100之间所有3的倍数
var i = 0;
while(i<101){
i ++;
if(i % 3 == 0){
document.write(i," ")
}
}
2.2 do-while
语法:
do{
//循环体
//更新循环变量
}while(循环条件);
while循环先判断条件成立才执行循环,do-while循环先循环一次,然后开始判断条件执行
// 循环让用户输入,直至输入exit结束循环
do{
var input = prompt();
}while(input != "exit");
2.3 for
语法:
for(定义循环变量;循环条件;更新循环变量){
//循环体
}
//打印1-100之间的整数
for(var i = 10 ; i < 101 ; i ++){
document.write(i," ")
}
// 求1-100之间整数的和
var sum = 0;
for(var i = 1 ; i < 101 ; i ++){
sum += i;
}
document.write(sum)
// 输出1-100之间所有3的倍数
for(var i = 1 ; i < 101 ; i ++){
if (i % 3 == 0){
document.write(i,' ')
}
}
2.4 循环控制
break
跳出循环
continue
结束本次循环,开始下次循环
// 循环让用户输入,直至输入exit结束循环
while(true){
input = prompt("");
if(input == "exit"){
break;
}
}
2.5 循环嵌套
// 计算星期几
var year = prompt("请输入年");
var month = prompt("请输入月");
var day = prompt("请输入日");
var sum = 0;
var idRun = year%4 == 0 && year%100 != 0 || year% 400 == 0;
//整年天数的累加
for(var i = 1990 ; i < year - 1 ; i++){
sum += 365;
if(i%4 == 0 && i%100 != 0 || i%400 == 0){
sum++;
}
}
//当前整月天数的累加
for(var j = 1 ; j < month ; j++){
switch(i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
sum += 31;
break;
case 4:
case 6:
case 9:
case 11:
sum += 30;
break;
case 2:
sum += 28;
if(isRun){
sum ++;
}
}
}
//当前月天数的累加
sum += day;
// 计算当前星期几
var week = sum % 7;
var show = "";
switch(week){
case 0:
// show = "日";
week = "日";
break;
case 1:
week = "一";
break;
case 2:
week = "二";
break;
case 3:
week = "三";
break;
case 4:
week = "四";
break;
case 5:
week = "五";
break;
case 6:
week = "六";
break;
}
console.log('今年是星期',week)
// 九九乘法表,要求在控制台输出
for(var i = 1 ; i < 10 ; i++){
var show = "";
for(var j = 1 ; j <= i ; j++){
show += i + "*" + j + "=" + i*j + '\t';
// 拼接每行中所有的表达式
}
console.log(show)
}
八、函数
保存代码或封装功能
1. 定义
使用function
关键字声明函数
function 函数名(参数列表){
//函数体
return 返回值;
}
2. 函数调用
函数名(参数)
// 无参数
function f1() {
console.log("f1 被调用");
}
f1();
// 带参数
function f2(a,b) {
console.log(a,b,a*b);
// arguments 只能在函数体中访问,保存实际参数
console.log(arguments);
}
f2(2,5) // 实参和形参个数一致
f2(2,5,3) // 实参多于形参 只取前边的实参
f2(2) // 实参少于形参 返回NaN
// 允许实参和形参个数不匹配
3. 作用域
作用域分为全局作用域函数作用域
(1)全局变量(全局函数):全局作用域下创建的变量或者函数,在任意地方都能访问和使用。所有省略var关键字创建的变量都是全局变量。
(2)局部变量:函数作用域中使用var关键字创建的变量都为局部变量
var a = 100;
function f1(){
console.log("函数内部访问",a) // 在函数内部访问外部变量
}
console.log("外部访问",a) // 在函数外部访问外部变量
f1();
function f2(){
f1();
var b = 200;
console.log("f2:",b) //在函数内部访问内部变量
}
f2();
// console.log(b) // 报错,局部变量无法在函数外部访问
// 以上代码可以看出,全局变量可以在函数内部和外部都访问
var age = 30;
function fn(){
var age = 18;
username = "张三"; // 无var关键字,则为全局变量
console.log(age); //就近原则。内部访问就是内部的值
}
fn();
console.log(username); //创建时并没有var关键字,所以可以正常访问
4. 匿名函数
function()()
前边的括号是函数自身,后边的实参
// 匿名函数
(function (a){
console.log(a)
})(1000)
//定义变量保存匿名函数,变量名即为函数名
var fun = function (){};
fun();
console.log(fun)
内存回收,用完即销毁
- 匿名函数自执行,否建局部作用域。(函数自身)(实参)
- 定义变量接收匿名函数,变量名即为函数名
九、数组
一组数据
1. 创建
var a = [1,2,3]
字面量方式创建
var b = new Array(1,2,3)
new关键字创建,如果只有一个参数,则代表预分配的长度
2. 操作
数组会自动为每一位元素分配下标,从0开始
3.数组属性
length
:数组长度
4.数组遍历
// 遍历数组
var arr5 = [10,2,3,5,6,2,34];
for (var i = 0 ; i < arr5.length ; i++){
console.log(arr5[i]);
}
for (var i = arr5.length -1 ; i >= 0 ; i--){
console.log(arr5[i]);
}
// for-in,还可以用来遍历对象
for (var i in arr5){
console.log(i,arr5[i])
}
练习:
// 1.循环接收用户输入,存储到数组中,直至输入"exit"结束循环,控制台输出数组
function addData(){
var arr = [];
while (true){
var input = prompt(" ");
if (input == "exit"){
break; // 跳出循环
}
arr[arr.length] = input; //添加元素
}
bianLi(arr);
}
function bianLi(arr){ // 遍历数组
for (var i in arr){
document.write(arr[i],"<br/>")
}
}
addData() // 调用
// 2.定义包含若干number值的数组,求数组中的最大值
function findMax(){ //假设最大的值为arr[0],将其赋值给其他变量,然后依次更改最大值
var arr = [1,56,78,-5,78,-89,666];
var max = arr[0];
for (var i in arr){
if(arr[i] > max){
max = arr[i]
}
}
document.write("最大值为:",max)
}
findMax();
5. 数组方法
5.1 push
push(data);
在数组的末尾添加一个或多个元素
返回添加后的数组长度
var arr = [1,2,3];
r1 = arr.push(10,20); //一次性在数组末尾添加两个元素
5.2 pop
pop();
溢出数组的末尾元素
返回被删除的元素
var arr = [1,2,3];
document.write(arr,"<br/>")
arr.pop(); //只删除末尾元素
document.write(arr)
5.3 unshift
unshift(data);
在数组的头部添加一个或多个元素
var arr = [1,2,3];
arr.unshift("a","b") // 将ab整体添加到头部,即['a','b',1,2,3]
console.log(arr)
arr.unshift("c")
arr.unshift("d") // 分别添加,每次添加到头部,即['d','c','a','b',1,2,3]
5.4 shift
shift();
移除数组的头部元素
var arr = [1,2,3];
arr.shift()
console.log(arr)
5.5 toString
toString();
将数组转换为字符串,返回转换后的结果
5.6 join
join(param);
将数组转换为字符串,参数用于指定数组元素之间的连接符,默认使用逗号
var s1 = arr.toString();
console.log(s1,arr);
var s2 = arr.join("-");
console.log(s2,arr);
var s3 = arr.join("");
console.log(s3,arr)
5.7 reverse
reverse();
翻转数组(倒序重排),对当前数组结构的调整。
5.8 sort
sort();
res = arr.sort(); //默认按照Unicode编码升序排列
console.log(res);
5.9 forEach
forEach(function (){})
数组自带的遍历方法
// 数组自带的遍历的方法
var arr = [1,2,3,4,5]
arr.forEach(function (elem,index){
console.log(elem,index);
});
6. 二维数组
var arr = [[1],[2,3],[6,4,5]];
arr[1][1] //3
// 遍历二维数组
十、字符串
1. 创建
创建字符串有两种方法
var s = 'hello';
var s = new String("world");
// 遍历字符串
for (var i in s1){
console.log(s1[i]);
}
for (var i = 0 ; i < s1.length ; i++){
console.log(s1[i]);
}
2. 特点
字符串采用数组结构存储,自动为每一位字符分配下标,可以使用下标访问每位存储
3. 属性
length:字符串长度
4.方法
(1) 大小写
toUpperCase()
转换大写
toLowerCase()
转换小写
var s3 = "Apple";
var r1 = s3.toUpperCase();
var r2 = s3.toLowerCase();
console.log(s3)
console.log(r1)
console.log(r2)
(2) 下标
根据下标获取指定的字符或字符编码
charAt(index)
charCodeAt(index)
var r1 = s1.charAt(1); // 下标为1的字符
console.log(r1)
var r2 = s1.charCodeAt(1); // 下标为1的字符编码
console.log(r2)
参数可以省略,默认为0
(3) 查下标
indexOf("",fromIndex)
lastIndexOf("",fromIndex)
参数:
指定查找字符串;
fromIndex设置起始下标;
str = 'hello world';
var r3 = s1.indexOf('o',2);
var r4 = s1.lastIndexOf('l',3);
console.log(r3)
console.log(r4)
查找方式:
indexOf从指定的下标开始向后查找字符,找到即返回
lastIndexOf从指定下标开始向前查找字符,找到即返回
如果为-1则表示查找失败
(4) 截取
substring(startIndex,endIndex)
截取start~end-1范围内的字符串,结束下标可以省略。
// 截取字符串
var r5 = s1.substring(2,4);
var r6 = s1.substring(2);
console.log(r5);
console.log(r6);
(5) 分割
split(param)
参数为指定分隔符,返回数组,存放分割结果。
var s1 = "2020-10-10";
var r1 = s1.split("-");
console.log(r1);
var r2 = s1.split('/');
console.log(r2)
注意:
参数必须为字符串中存在的字符,否则分割无效。
// "101=5&201=10&301=8"
s2 = "101=5&201=10&301=8";
var r3 = s2.split("&");
for (i in r3){
var r4 = r3[i].split("=");
console.log(r4[0],r4[1]);
}
(6) 模式匹配
正则表达式(RegExp)
指定的字符串格式
语法:var reg1 = /字符格式/修饰符;
修饰符:i(ignorecase)
忽略大小写,g(global)
全局匹配。
例如:
// 固定查找内容
var reg1 = /知乎/g;
// 固定查找格式
var reg2 = /\d{6,11}/g;
match()
查找
replace()
替换
var s = "上知乎,搜知乎,问知乎,答知乎";
console.log(s.match("知乎"));
var reg = /知乎/;
console.log(s.match(/知乎/)); // 懒惰匹配
console.log(s.match(/知乎/g)); // 贪婪匹配
// 查找并替换
r1 = s.replace("知乎","新浪");
r2 = s.replace(/知乎/g,"新浪");
console.log(r1," ",r2);
练习
指定邮箱字符串,提取用户名和服务商
function mail(){
var email = prompt("请输入邮箱");
var number = email.indexOf("@");
var username = email.substring(0,number);
var server = email.substring(number + 1);
document.write("用户名:",username,"<br/>服务商:",server);
}
从身份证号提取年月日
function id(){
var credId = prompt("请输入身份证号码");
var year = credId.substring(6,10);
var month = credId.substring(10,12);
var day = credId.substring(12,14);
document.write(year,month,day);
}
十一、其他对象
1.RegExp
创建:
属性:
lastIndex
表示下一次匹配的起始下标
方法:
test(str)
验证字符串中是否存在满足正则表达式格式的内容,返回布尔值
全局匹配光标位置不同
// 创建正则表达式
var reg1 = /\d{6}/; // 匹配6位数字
var reg2 = /\d{6}/g; // 全局
var s = "a123456789";
var r1 = reg1.test(s);
var r2 = reg1.test(s);
var r3 = reg1.test(s);
// console.log(r1,r2,r3);
console.log(reg2.lastIndex); // 查看起始索引,即开始匹配的位置
var r4 = reg2.test(s);
console.log(reg2.lastIndex);
var r5 = reg2.test(s);
console.log(reg2.lastIndex);
var r6 = reg2.test(s);
console.log(r4,r5,r6);
console.log(reg2.lastIndex); // 查看起始索引,即开始匹配的位置
var r4 = reg2.test(s);
reg2.lastIndex = 0; //手动指定索引位置
console.log(reg2.lastIndex);
var r5 = reg2.test(s);
reg2.lastIndex = 0;
console.log(reg2.lastIndex);
var r6 = reg2.test(s);
console.log(r4,r5,r6);
2. Math
// Math对象的属性:数学常量
console.log(Math.PI,Math.E); //圆周率,对数
// 方法
console.log(Math.random()); //生成0-1之间的随机小时
console.log(Math.ceil(4.1)); //向上取整:舍弃小数位,整数+1
console.log(Math.floor(4.99)); //向下取整:舍弃小数位,保留整数
console.log(Math.round(4.5)) //四舍五入
3.Date
// 提取时间分量
var year = date.getFullYear(); // 获取年
var month = date.getMonth() + 1; // 返回0-11对应12个月,所以这里必须加1
var day = date.getDate();// 获取日期
var week = date.getDay(); // 获取星期
var hour = date.getHours(); // 获取小时
var mintue = date.getMinutes(); // 获取分
var second = date.getSeconds(); //获取秒
console.log(year,month,day,'星期',week,hour,":",mintue,":",second);
// 转换日期对象的显示格式
var timeStr = date.toLocaleString(); // 转字符串
console.log(timeStr);
// 获取年月日
var str1 = date.toLocaleDateString();
var str2 = date.toLocaleTimeString();
console.log(str1,str2)
十二、例
循环接收用户输入,保存到数组中,exit结束,使用数组相关方法实现
function addData(){
var arr = [];
while (true){
var input = prompt("请输入");
if (input == "exit"){
break;
}
arr.push(input);
}
console.log(arr);
}
模拟验证码
// 模拟验证码
function createCode(length){
// 模拟数据源
var arr = ["a","c","h","q",4,5,"n",8,"c",9,2,"e",6,0,"y"]
var code = "";
for (var i = 1 ; i <= length ; i++){
// 创建随机下标
var index = parseInt( (Math.random()) * arr.length );
// 拼接
code += arr[index]
}
return code;
}
function validate(){
// 1.生成验证码
var code = createCode(4);
// 2.提示输入
var input = prompt("验证码为"+code);
// 3.验证
if(code.toLowerCase() == input.toLowerCase()){
alert("正确");
}else{
alert("错误");
}
}