浏览器分成两部分:渲染引擎和JS引擎
ECMAScript——JavaScript语法
DOM——文档对象模型
BOM——浏览器对象模型
js的三种样式,分别为:行内式JS、内部JS、外部JS
示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 内嵌JS // js用单引号,html与css用双引号 alert('this is alert') </script> <!-- 外部JS文件 --> <script src="my.js"></script> </head> <body> <!-- 行内式JS --> <!-- alert('hello word') --> <!-- 可读性差,在html中编写JS大量代码时,不方便阅读;引号易错,引号多层嵌套匹配时,非常容易弄混; --> <input type="button" value="just try" onclick="alert('hello word')"> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 单行注释,快捷键是Ctrl+/ /* 多行注释,需要自行设定快捷键,建议设置为Ctrl+Shift+/ 多行2 多行2 */ </script> </head> <body> </body> </html>
方法 | 说明 | 图示 |
---|---|---|
alert(msg) | 浏览器弹出警示框 | |
console.log(msg) | 浏览器控制台打印输出信息 | |
prompt(info) | 浏览器弹出输入框,用户可以输入 |
变量在使用时分为两步:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 声明变量 /* var是一个JS关键字,用来声明变量(variable变量的意思)。使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员管 age 是程序员定义的变量名,我们要通过变量名来访问内存中分配的空间 */ var age; // 给age这个变量赋值为10 age=18; </script> </head> <body> </body> </html>
我们也可以在声明变量的时候,直接进行初始化
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 变量初始化 var age=18; </script> </head> <body> </body> </html>
案例1:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var myname; myname=prompt("请输入您的姓名"); alert('你输入的姓名是' + myname); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var age=18; age=28; //一个变量被重新复赋值后,它原有的值就会被覆盖,变量值将以最后一次赋的值为准 alert(age) </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 声明多个变量 var age = 10, name = 'zs', sex = 2; </script> </head> <body> </body> </html>
情况 | 说明 | 结果 |
---|---|---|
var age; console.log (age); |
只声明、不赋值 | undefined |
console.log(age) | 不声明、不赋值、直接使用 | 报错 |
age = 10; console.log (age); |
不声明、只赋值 | 10 |
案例:
要求:交换两个变量的值 ( 实现思路:使用一个 临时变量 用来做中间存储 )
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var a=10; var temp; var b=20; temp=a; a=b; b=temp; alert('a的值是' + a); alert('b的值是' + b); </script> </head> <body> </body> </html>
var age = 10; // 这是一个数字型 var areYouOk = '是的'; // 这是一个字符串
var x = 6; // x 为数字 var x = "Bill"; // x 为字符串
JS把数据类型分为两类:
简单数据类型 | 说明 | 默认值 |
---|---|---|
Number | 数字型,包含整型值、浮点型值,如2、2.1 | 0 |
Boolean | 布尔值类型,如ture、false,等价于1和0 | false |
String | 字符串类型,如“张三”,注意:js里面字符串都带引号 | "" |
Undefined | var a; 声明了变量a,但是没有赋值,此时a=undefined | undefined |
Null | var a=null; 声明了a为空值 | null |
var age = 21; // 整数 var Age = 21.3747; // 小数
数字型范围
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> alert(Number.MAX_VALUE); // 1.7976931348623157e+308 alert(Number.MIN_VALUE); // 5e-324 </script> </head> <body> </body> </html>
数字型三个特殊值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> alert(Infinity) //Infinity ,代表无穷大,大于任何数值,输出结果:Infinity alert(-Infinity) //-Infinity ,代表无穷小,小于任何数值,输出结果:-Infinity alert(NaN) // NaN ,Not a number,代表一个非数值,输出结果:NaN </script> </head> <body> </body> </html>
isNaN()
isNaN()用来判断一个变量是否为非数字的类型.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var myage=18; alert(isNaN(myage)); // 结果:false var myname='zhan' alert(isNaN(myname)); // 结果:true </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var strMsg = "我爱北京天安门~"; // 使用双引号表示字符串 var strMsg2 = '我爱吃猪蹄~'; // 使用单引号表示字符串 // 常见错误 var strMsg3 = 我爱大肘子; // 报错,没使用引号,会被认为是js代码,但js没有这些语法 // 引号嵌套 var strMsg4 = '我是"高帅富"程序猿'; // 可以用''包含"" </script> </head> <body> </body> </html>
字符串转义符
转义符 | 解释说明 |
---|---|
\n | 换行符,n是newline的意思 |
\\ | 斜杠\ |
\' | '单引号 |
\" | ”双引号 |
\t | tab缩进 |
\b | 空格,b是blank的意思 |
案例
弹出网页警示框,显示如下内容:
酷热难耐,火辣的太阳底下,我挺拔的身姿,成为了最为独特的风景。我审视四周,这里,是我的舞台,我就是天地间的王者。这一刻,我豪气冲天,终于大喊一声:"收破烂啦~"
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var strMsg; strMsg='酷热难耐,火辣的太阳底下,我挺拔的身姿,成为了最为独特的风景。我审视四周,这里,是我的舞台,我就是天地间的王者。这一刻,我豪气冲天,终于大喊一声:\"收破烂啦~\"' alert(strMsg) </script> </head> <body> </body> </html>
字符串长度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var strMsg = "我是帅气多金的程序猿!"; alert(strMsg.length); // 显示 11 </script> </head> <body> </body> </html>
字符串拼接
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> alert('hello'+' '+'my'+' '+'friend'); // 输出:hello my friend </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var age=18; alert('我的年龄是'+age); // 我的年龄是18 alert('我已经'+age+'岁了!'); // 我已经18岁了! </script> </head> <body> </body> </html>
案例:显示年龄
弹出一个输入框,需要用户输入年龄,之后弹出一个警示框显示“您今年 xx 岁啦”(xx 表示刚才输入的年龄)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var age=prompt("请输入您的年龄"); alert('您今年'+age+'岁啦!'); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> alert(true+1); // 结果:2 alert(false+10); // 结果:10 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 一个声明后没有被赋值的变量会有一个默认值undefined (如果进行相连或者相加时,注意结果) var a; alert(a); // 输出:undefined alert('这个是:'+a); // 输出:这个是:undefined alert(11+a); // 输出:NaN;说明undefined与数值运算,结果为NaN alert(true+a); // 输出:NaN // 一个声明变量给 null 值,里面存的值为空 var b=null; alert(b); // 输出:null alert('这个是:'+b); // 输出:这个是:null alert(11+b); // 输出:11 alert(true+b); // 输出:1 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> alert(typeof 18); // number alert(typeof 'hello'); // string alert(typeof false); // boolean alert(typeof null); // object alert(typeof NaN); // number alert(typeof undefined);// undefined </script> </head> <body> </body> </html>
使用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,而需要转换变量的数据类型。
通俗来说,就是把一种数据类型的变量转换成另外一种数据类型。
我们通常会实现3种方式的转换:
方式 | 说明 | 案例 |
---|---|---|
toString() | 转成字符串 | var num=1; alter(num.toString()); |
String()强制转化 | 转成字符串 | var num=1; alter(String(num)); |
加号拼接 | 转成字符串 | var num=1; alter(num+'xxx'); |
方式 | 说明 |
---|---|
parseInt(string) | 将string类型转化成整数数值型 |
parseFloat(string) | 将string类型转化成浮点数数值型 |
Number()强制转化 | 将string类型转化成数值型 |
js隐式转化(- * /) | 利用算术运算符 隐式转换成数值型 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var a='18'; var b='3.14'; var c='3.94'; var d='120px'; var e='re120px'; var f='120px88px'; // parseInt console.log(parseInt(a)); // 18 console.log(parseInt(b)); // 3 console.log(parseInt(c)); // 3 console.log(parseInt(d)); // 120 console.log(parseInt(e)); // NaN console.log(parseInt(f)); // 120 // parseFloat console.log(parseFloat(a)); // 18 console.log(parseFloat(b)); // 3.14 console.log(parseFloat(c)); // 3.94 console.log(parseFloat(d)); // 120 console.log(parseFloat(e)); // NaN console.log(parseFloat(f)); // 120 // Number() console.log(Number(a)); // 18 console.log(Number(b)); // 3.14 console.log(Number(c)); // 3.94 console.log(Number(e)); // NaN // 隐式转换 console.log('12' - 0); // 12 console.log('123' - '120'); // 3 console.log('123' * 1); // 123 </script> </head> <body> </body> </html>
案例:计算年龄
此案例要求在页面中弹出一个输入框,我们输入出生年份后, 能计算出我们的年龄。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var year=prompt('请您输入的出生的年份') age=2021- year // 隐式转换 alert('您的年龄是'+age); </script> </head> <body> </body> </html>
方式 | 说明 | 案例 |
---|---|---|
Boolean() | 其他类型转化为布尔类型 | Boolean('true'); |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> 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 </script> </head> <body> </body> </html>
运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。
JavaScript中常用的运算符有:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 算术运算符 console.log(10+20); // 30 console.log(10-20); // -10 console.log(10*20); // 200 console.log(10/20); // 0.5 console.log(9%2); // 1 --取余,9除以2等于4余1 // 浮点数的精度问题 // 浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远远不如整数。 alert(0.1 + 0.2) // 结果是:0.30000000000000004 alert(0.07 * 100) // 结果是:7.000000000000001 // 所以:不要直接判断两个浮点数是否相等 ! </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 递增++ 和 递减-- // 注意:前置递增(递减)运算符 与 后置递增(递减)运算符的区别 var num=10; alert(++num + 20); // 31——前置递增运算符,先自增,后返回值在参与运算,故结果是:10+1 +20=31 var num2=10; alert(20 + num2++); // 30——后置递增运算符,先返回值参与运算,后自增,故结果是:20+10=30,然后num2再自增到11 alert(num2); // 11 </script> </head> <body> </body> </html>
概念:比较运算符(关系运算符)是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为比较运算的结果。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var num1 = 10; var num2 = 100; alert(num1 > num2); // false alert(num1 == 11); // false alert(num1 != num2);// true </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 布尔值参与的逻辑运算 console.log(1>4 || 5>2); // true console.log(1>4 && 5>2); // false // 除了上面布尔值参与的逻辑运算,还有表达式参与的逻辑运算 // 短路运算 // 逻辑与的短路运算 如果表达式1 结果为真 则返回表达式2 如果表达式1为假 那么返回表达式1 console.log(123 && 456); // 456 console.log(0 && 456); // 0 console.log('' && 1 + 2 && 456 * 56789) // '' // 逻辑或的短路运算 如果表达式1 结果为真 则返回的是表达式1 如果表达式1 结果为假 则返回表达式2 console.log(123 || 456); // 123 console.log(0 || 456 || 456 + 123); // 456 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var age = 10; age += 5; // 相当于 age = age + 5; age -= 5; // 相当于 age = age - 5; age *= 10; // 相当于 age = age * 10; </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> console.log( 4 >= 6 || '人' != '阿凡达' && !(12 * 2 == 144) && true) // true var num = 10; console.log( 5 == num / 2 && (2 + 2 * num).toString() === '22'); // true </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var score=parseInt(prompt('请输入分数')); if(score>=60){ alert('及格') } </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var score=parseInt(prompt('请输入分数')); if(score>=60){ alert('及格') } else{ alert('不及格') } </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var score=parseInt(prompt('请输入分数')); if(score>=90){ alert('优秀') } else if(score>=80){ alert('良好') } else if(score>=60){ alert('及格') } else{ alert('不及格') } </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 三元表达式:表达式1 ? 表达式2 : 表达式3; var score=parseInt(prompt('请输入分数')); score>=60?alert('及格'):alert('不及格'); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var day=parseInt(prompt('请输入1-7')); switch (day){ case 1: alert('周一') break; case 2: alert('周二') break; case 3: alert('周三') break; case 4: alert('周四') break; case 5: alert('周五') break; case 6: alert('周六') break; case 7: alert('周日') break; } </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 计算1加到100的值,for循环做法 var i=0; var sum=0; for(i;i<=100;i++){ sum += i } alert(sum) </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 打印5行10列的星星,嵌套for循环 var str = ''; for(var hang=1;hang<=5;hang++){ for(var lie=1;lie<=10;lie++){ str += '☆'; } str += '\n'; } console.log(str); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 计算1加到100的值,while循环做法 var i=0; var sum=0; while(i<=100){ sum +=i; i++ } alert(sum) </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 计算1加到100的值,do-while循环做法 var i=0; var sum=0; do{ sum+=i; i++; }while(i<=100) alert(sum) </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // break语句 // 要求用户输入用户名和密码 用户名只要不是admin 密码不是666666,就一直循环,循环到3次跳出 var username=''; var userpwd=''; var i=0; var isok=1; while(username!='admin' || userpwd!='666666'){ username=prompt('请输入您的账号'); userpwd=prompt('请输入您的密码'); i++; if(i==3){ alert('您已输入三次错误账户密码,程序将退出'); isok=0; break; } } if(isok==1){ alert('登录成功') } </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // continue + break语句 // 要求用户输入用户名和密码 用户名只要不是admin 密码不是666666,就一直循环,循环到3次跳出 var username = ''; var userpwd = ''; var i = 0; while (1) { username = prompt('请输入您的账号'); userpwd = prompt('请输入您的密码'); if (username != 'admin' || userpwd != '666666') { i++; if (i == 3) { alert('您已输入三次错误账户密码,程序将退出'); break; } continue; } else { alert('登录成功'); break; } } </script> </head> <body> </body> </html>
var arr=new Array()
var arr = [1, 2, '文本', true]
数组名[索引号]
,索引号从0开始,如arr[2]
获取arr数组的第三个元素案例
定义一个数组,里面存放星期一、星期二…… 直到星期日(共7天),在控制台输出:星期日
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var arr=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']; alert(arr[6]); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var arr=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']; for(var i=0;i<arr.length;i++){ alert(arr[i]); } </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var arr=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']; var str=''; for(var i=0;i<arr.length;i++){ if(i==arr.length-1){ str = str + arr[i] } else { str = str + arr[i] + '|' } } alert(str); // 输出:星期一|星期二|星期三|星期四|星期五|星期六|星期日 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 1. 新增数组元素 修改length长度 var arr=['星期一','星期二','星期三']; arr.length=7; alert(arr); // 星期一,星期二,星期三,,,, alert(arr[5]); // undefined ——新增的空间没有给值,默认为undefined // 2. 新增数组元素 修改索引号 追加数组元素 var brr=['星期一','星期二','星期三']; brr[3]='星期四' brr[4]='星期五' brr[5]='星期六' brr[6]='星期日' alert(brr); // 星期一,星期二,星期三,星期四,星期五,星期六,星期日 // 3.替换原来的元素 brr[0]='周一' alert(brr); // 周一,星期二,星期三,星期四,星期五,星期六,星期日 </script> </head> <body> </body> </html>
案例
要求:将数组 [2, 0, 6, 1, 77, 0, 52, 0, 25, 7] 中大于等于 10 的元素选出来,放入新数组。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 将数组 [2, 0, 6, 1, 77, 0, 52, 0, 25, 7] 中大于等于 10 的元素选出来,放入新数组 var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; var brr=[]; var j=0; for(var i=0; i<arr.length; i++){ if (arr[i]>=10){ brr[j]=arr[i]; j++; } } alert(brr); // 77,52,25 </script> </head> <body> </body> </html>
声明函数
// 声明函数 function 函数名() { //函数体代码 }
调用函数
// 调用函数 函数名(); // 通过调用函数名来执行函数体代码
案例:
利用函数计算1-100之间的累加和
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 定义函数 function getSum(start_num,end_num){ var sum=0; for(var i=start_num; i<=end_num;i++){ sum += i; } alert(sum) } // 函数调用 getSum(1,100); // 5050 getSum(5,50); // 1265 </script> </head> <body> </body> </html>
形参和实参
函数形参和实参个数不匹配问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 定义函数 function getSum(start_num,end_num){ var sum=0; for(var i=start_num; i<=end_num;i++){ sum += i; } alert(sum) } // 函数调用 getSum(1,100); // 5050 getSum(5,50,100); // 1265 getSum(40); // 0,因为sum本身已经定义成0了 </script> </head> <body> </body> </html>
// 声明函数 function 函数名(){ ... return 需要返回的值; } // 调用函数 函数名(); // 此时调用函数就可以得到函数体内return后面的值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 求两个数的最大值 function getMax(num1,num2){ if(num1>num2){ return num1; } else { return num2; } } alert(getMax(100,500)); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // return 语句之后的代码不被执行 function add(num1,num2) { return num1 + num2; alert('我不会被执行,因为前面有 return'); } var resNum = add(21, 6); alert(resNum); // 27 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // return 只能返回一个值。如果用逗号隔开多个值,以最后一个为准。 function add(num1,num2) { return num1,num2; } var resNum = add(21, 6); alert(resNum); // 6 </script> </head> <body> </body> </html>
案例:
利用函数求任意个数的最大值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> function maxValue() { var max = arguments[0]; for (var i = 0; i < arguments.length; i++) { if (max < arguments[i]) { max = arguments[i]; } } return max; } alert(maxValue(2, 4, 5, 9)); alert(maxValue(12, 4, 9)); </script> </head> <body> </body> </html>
自定义函数方式(命名函数)
我们在上面所有的实示例中,都是利用函数关键字function自定义函数方式
function getMax(num1,num2){ if(num1>num2){ return num1; } else { return num2; } }
函数表达式方式(匿名函数)
利用函数表达式方式的写法如下:
// 这是函数表达式写法,匿名函数后面跟分号结束 var fn = function(){...}; // 调用的方式,函数调用必须写到函数体下面 fn();
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 全局作用域——作用于所有代码执行的环境(整个script标签内部)或者一个独立的js文件。 var a=10; // a是全局变量 var b=20; // b是全局变量 alert(a+b); // 局部作用域 (函数作用域)——作用于函数内的代码环境,就是局部作用域。 function getMax(){ var c=20; // c是局部变量 var d=100; // d是局部变量 return c>d?c:d; } alert(getMax()); </script> </head> <body> </body> </html>
块作用域由 { } 包括。
在其他编程语言中(如 java、c#等),在if语句、循环语句中创建的变量,仅仅只能在本if语句、本循环语句中使用
先来思考两个问题:
问题1
如果未声明变量,然后直接输出,会报错
console.log(num1); // Uncaught ReferenceError: num1 is not defined
但是先直接输出,再声明变量,则不会报错,为什么呢?
console.log(num2); // undefined var num2;
问题2
如果先调用函数,再声明命名函数,不会报错
fn(); function fn() { console.log('打印'); // 打印 }
但是如果先调用函数,再声明匿名函数,则会报错,是为什么呢?
fn(); var fn = function(){ console.log('打印'); // Uncaught TypeError: fn is not a function }
造成上面两个问题的原因是:
问题1中,先直接输出变量num2,再声明变量num2,不会出错是因为预解析时先把变量num2在作用域中提前声明了;
问题2中,先调用函数fn,再声明命名函数fn,不会报错也是因为预解析时先把函数fn在作用域中提前声明了。
预解析分为:变量预解析(变量提升)和函数预解析(函数提升)
案例
// 案例——结果是:undefined var num = 10; fun(); function fun() { console.log(num); var num = 20; }
预解析过程
1--全局变量提升:
var num; function fun() { console.log(num); var num = 20; } num=10; fu();
2--函数变量提升:
var num; function fun() { var num; console.log(num); // 此时结果为undefined num = 20; } num=10; fu();
创建盖伦这个对象 盖伦.姓名='德玛西亚之力' 盖伦.血量=20000 盖伦.攻击力=500 盖伦.技能='德玛西亚正义'
在 JavaScript 中,现阶段我们可以采用三种方式创建对象(object):
{ }
创建对象new Object
创建对象{ }
创建对象<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 创建德玛西亚皇子-嘉文四世这个对象 var jarvan={ // 注意:冒号与逗号 name:'Jarvan IV', // 对象里面的变量称为属性,不需要声明,用来描述该对象的特征 nickName:'the Exemplar of Demacia', hp:571.2, mp:302.2, ad:55.71, // 对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用,方法用来描述该对象的行为和功能。 bigSkill:function(){ alert('天崩地裂'); }, }; // 对象的调用 console.log(jarvan.nickName); console.log(jarvan.ad); jarvan.bigSkill(); </script> </head> <body> </body> </html>
运行结果:
new Object
创建对象<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 创建德玛西亚皇子-嘉文四世这个对象 var jarvan=new Object; jarvan.name='Jarvan IV'; jarvan.nickName='the Exemplar of Demacia'; jarvan.hp=571.2; jarvan.mp=302.2; jarvan.ad=55.71; jarvan.bigSkill=function(){ alert('天崩地裂'); }; // 对象的调用 console.log(jarvan.nickName); console.log(jarvan.ad); jarvan.bigSkill(); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 构造函数创建一个英雄类 function Hero(name,nickName,hp){ // 构造函数约定首字母大写 this.name=name; // 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法 this.nickName=nickName; this.hp=hp; this.bigSkill=function(){ alert('天崩地裂'); }; // 构造函数中不需要 return 返回结果 } // 创建德玛西亚皇子-嘉文四世这个对象 var jarvan=new Hero('Jarvan IV','the Exemplar of Demacia',571.2); // 创建对象的时候,必须用 new 来调用构造函数 // 对象的调用 console.log(jarvan.nickName); console.log(jarvan.hp); jarvan.bigSkill(); </script> </head> <body> </body> </html>
构造函数和对象
- 构造函数,如 Stars(),抽象了对象的公共部分,封装到了函数里面,它泛指某一大类(class)
- 创建对象,如 new Stars(),特指某一个,通过 new 关键字创建对象的过程我们也称为对象实例化
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 构造函数创建一个英雄类 function Hero(name,nickName,hp){ this.name=name; this.nickName=nickName; this.hp=hp; this.bigSkill=function(){ alert('天崩地裂'); }; } // 创建德玛西亚皇子-嘉文四世这个对象 var jarvan=new Hero('Jarvan IV','the Exemplar of Demacia',571.2); // 遍历对象属性 for(var k in jarvan){ console.log(k); // 这里的 k 是属性名 console.log(jarvan[k]); // 这里的 obj[k] 是属性值 } </script> </head> <body> </body> </html>
运行结果
Math.PI // 圆周率 Math.floor() // 向下取整 Math.ceil() // 向上取整 Math.round() // 四舍五入版 就近取整 注意 -3.5 结果是 -3 Math.abs() // 绝对值 Math.max()/Math.min() // 求最大和最小值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // Math数学对象 不是一个构造函数 ,所以我们不需要new 来调用 而是直接使用里面的属性和方法即可 console.log(Math.PI); // 一个属性 圆周率 console.log(Math.max(1, 99, 3)); // 99 console.log(Math.max(-1, -10)); // -1 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 利用对象封装自己的数学对象 里面有 PI 最大值和最小值 var myMath = { PI: 3.141592653, max: function() { var max = arguments[0]; for (var i = 1; i < arguments.length; i++) { if (arguments[i] > max) { max = arguments[i]; } } return max; }, min: function() { var min = arguments[0]; for (var i = 1; i < arguments.length; i++) { if (arguments[i] < min) { min = arguments[i]; } } return min; } } console.log(myMath.PI); console.log(myMath.max(1, 5, 9)); console.log(myMath.min(1, 5, 9)); </script> </head> <body> </body> </html>
绝对值方法
console.log(Math.abs(1)); // 1 console.log(Math.abs(-1)); // 1
三个取整方法
// Math.floor()——向下取整,往最小了取值 console.log(Math.floor(1.1)); // 1 console.log(Math.floor(1.9)); // 1 // Math.ceil()——向上取整,往最大了取值 console.log(Math.ceil(1.1)); // 2 console.log(Math.ceil(1.9)); // 2 // Math.round()——四舍五入 console.log(Math.round(1.5)); // 2 console.log(Math.round(1.9)); // 2 console.log(Math.round(-1.1)); // -1
随机数方法
// 随机取得0-1之间的小数 console.log(Math.random());
// 随机取得两个数之间的整数 function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }
案例:猜数字游戏
程序随机生成一个 1~ 10 之间的数字,并让用户输入一个数字,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 随机取得两个数之间的整数 function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // 随机生成1-10之间的整数 var random = getRandom(1, 10); // 循环判断 while (true) { var num = prompt('你来猜? 输入1~10之间的一个数字'); if (num > random) { alert('你猜大了'); } else if (num < random) { alert('你猜小了'); } else { alert('你好帅哦,猜对了'); break; } } </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // Date()日期对象是一个构造函数,必须使用new来调用日期对象 // 使用Date()方法:如果没有参数 返回当前系统的当前时间 var date = new Date(); console.log(date); // Sun Dec 12 2021 01:23:30 GMT+0800 (中国标准时间) // 使用Date()方法:如果Date()里面写参数,就返回括号里面输入的时间 var date1 = new Date(2019, 10, 1); console.log(date1); // Fri Nov 01 2019 00:00:00 GMT+0800 (中国标准时间)。返回的是11月?因为此时的月份是0-11,而不是1-12 var date2 = new Date('2019-10-1 8:8:8'); console.log(date2); // Tue Oct 01 2019 08:08:08 GMT+0800 (中国标准时间) </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 格式化日期 年月日 var date = new Date(); // 2021-12-12 01:41:20 console.log(date.getFullYear()); // 2021 console.log(date.getMonth() + 1); // 12,因为Date中的月份是0-11,而不是1-12,故需要+1 console.log(date.getDate()); // 12 console.log(date.getDay()); // 0,getDay()是获取星期几,0是周日 // 获取现在是时间 var year = date.getFullYear(); var month = date.getMonth() + 1; var dates = date.getDate(); var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']; var day = date.getDay(); console.log('今天是:' + year + '年' + month + '月' + dates + '日 ' + arr[day]); // 今天是:2021年12月12日 星期日 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 格式化日期 时分秒 var date = new Date(); console.log(date.getHours()); // 时 console.log(date.getMinutes()); // 分 console.log(date.getSeconds()); // 秒 // 要求封装一个函数返回当前的时分秒 格式 08:08:08 function getTimer() { var time = new Date(); var h = time.getHours(); h = h < 10 ? '0' + h : h; var m = time.getMinutes(); m = m < 10 ? '0' + m : m; var s = time.getSeconds(); s = s < 10 ? '0' + s : s; return h + ':' + m + ':' + s; } console.log(getTimer()); // 01:49:49 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 获得Date总的毫秒数(时间戳) 不是当前时间的毫秒数 而是距离1970年1月1号过了多少毫秒数。Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00) // 1. 通过 valueOf() getTime() var date = new Date(); console.log(date.valueOf()); // 就是 我们现在时间 距离1970.1.1 总的毫秒数 console.log(date.getTime()); // 2. 简单的写法 (最常用的写法) var date1 = +new Date(); // +new Date() 返回的就是总的毫秒数 console.log(date1); // 3. H5 新增的 获得总的毫秒数,IE浏览器不支持H5 console.log(Date.now()); </script> </head> <body> </body> </html>
案例:倒计时效果
做一个倒计时效果
思路:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> function countDown(endtime){ var endtime_ms = +new Date(endtime); // 将结束时间转化为时间戳 var now_ms = +new Date(); // 将当前时间转化为时间戳 var time_s = (endtime_ms-now_ms)/1000 // 计算两者时间差,转化为秒 var d = parseInt(time_s / 60 / 60 / 24); // 天 d = d < 10 ? '0' + d : d; var h = parseInt(time_s / 60 / 60 % 24); //时 h = h < 10 ? '0' + h : h; var m = parseInt(time_s / 60 % 60); // 分 m = m < 10 ? '0' + m : m; var s = parseInt(time_s % 60); // 当前的秒 s = s < 10 ? '0' + s : s; return d + '天' + h + '时' + m + '分' + s + '秒'; } console.log(countDown('2021-12-15 12:00:00')); // 03天09时35分23秒 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 创建数组的两种方式 // 1. 利用数组字面量 var arr = [1, 2, 3]; // 2. 利用new Array() var arr1 = new Array(); // 创建了一个空的数组 var arr2 = new Array(2); // 这个2 表示 数组的长度为2,里面有2个空的数组元素 var arr3 = new Array(2, 3); // 等价于[2,3],这样写表示里面有2个数组元素,分别是2、3 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 检测是否为数组 // (1) instanceof 运算符 它可以用来检测是否为数组 var arr = []; var obj = {}; console.log(arr instanceof Array); // true console.log(obj instanceof Array); // false // (2) Array.isArray(参数); H5新增的方法 ie9以上版本支持 console.log(Array.isArray(arr)); // true console.log(Array.isArray(obj)); // false </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> /* push()方法:在数组的末尾添加一个或者多个数组元素 push完毕之后,返回的结果是新数组的长度。原数组也会发生变化 */ var arr = [1, 2, 3]; arr.push(4, 'xx'); // [1, 2, 3, 4, 'xx'] console.log(arr); /* unshift()方法:在数组的开头 添加一个或者多个数组元素 unshift完毕之后,返回的结果是新数组的长度。原数组也会发生变化 */ arr.unshift('red', 'purple'); console.log(arr); // ['red', 'purple', 1, 2, 3, 4, 'xx'] /* pop()方法:删除数组的最后一个元素 pop完毕之后,返回的结果是新数组的长度。原数组也会发生变化 */ arr.pop(); console.log(arr); // ['red', 'purple', 1, 2, 3, 4] // 4. shift() 它可以删除数组的第一个元素 /* shift()方法:删除数组的第一个元素 shift完毕之后,返回的结果是新数组的长度。原数组也会发生变化 */ arr.shift(); console.log(arr); // ['purple', 1, 2, 3, 4] </script> </head> <body> </body> </html>
案例:筛选数组
有一个包含工资的数组[1500, 1200, 2000, 2100, 1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> var arr=[1500, 1200, 2000, 2100, 1800]; var brr=[]; for (var i=0; i<=arr.length;i++){ if(arr[i]<2000){ brr.push(arr[i]); } } console.log(brr) // [1500, 1200, 1800] </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 1. 翻转数组 var arr = ['pink', 'red', 'blue']; arr.reverse(); console.log(arr); // ['blue', 'red', 'pink'] // 2. 数组排序 var arr1 = [1,4,5,8]; arr1.sort(); console.log(arr1); // [1, 4, 5, 8] // 但是下面这种sort()方法就会出错 var arr2 = [1,4,16,5,8,48]; arr2.sort(); console.log(arr2); // [1, 16, 4, 48, 5, 8] // 为了解决上面的问题,可以在sort方法内加入一个函数 var arr3 = [1,4,16,5,8,48]; arr3.sort(function(a,b){ return a-b }) console.log(arr3); // [1, 4, 5, 8, 16, 48] // 上面的方法,将a、b位置对换,则可以降序排序 var arr4 = [1,4,16,5,8,48]; arr4.sort(function(a,b){ return b-a }) console.log(arr4); // [48, 16, 8, 5, 4, 1] </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> /* indexOf(数组元素)——返回该数组元素的索引号,从前面开始查找,只返回第一个满足条件的索引号,如果在该数组里面找不到元素,则返回的是 -1 lastIndexOf(数组元素)——返回该数组元素的索引号,从后面开始查找 */ var arr = ['red', 'green', 'blue', 'pink', 'blue']; console.log(arr.indexOf('blue')); // 2,即第三个 console.log(arr.indexOf('while')); // -1,即没找到 console.log(arr.lastIndexOf('blue')); // 4,从后面找,最后一个blue的索引就是4 </script> </head> <body> </body> </html>
案例: 数组去重
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 数组去重 ['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b'] 要求去除数组中重复的元素。 // 核心算法: 我们遍历旧数组, 然后拿着旧数组元素去查询新数组, 如果该元素在新数组里面没有出现过, 我们就添加, 否则不添加。 function unique(arr) { var newArr = []; for (var i = 0; i < arr.length; i++) { if (newArr.indexOf(arr[i]) === -1) { newArr.push(arr[i]); } } return newArr; } var demo = unique(['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b']) console.log(demo); // ['c', 'a', 'z', 'x', 'b'] </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 数组转换为字符串 // 1. toString() 将数组转换为字符串 var arr = [1, 2, 3]; console.log(arr.toString()); // 1,2,3 // 2. join(分隔符) var arr1 = ['green', 'blue', 'pink']; console.log(arr1.join()); // green,blue,pink console.log(arr1.join('-')); // green-blue-pink console.log(arr1.join('&')); // green&blue&pink </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> var text='hello'; console.log(text.length); // 5 /* 思考一个问题: 按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,为什么? 这是因为 js 会把基本数据类型包装为复杂数据类型,其执行过程如下 : var temp = new String('hello'); // 1. 生成临时变量,把简单类型包装为复杂数据类型 text=temp; // 2. 赋值给我们声明的字符变量 temp=null; // 3. 销毁临时变量 */ </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 字符串的不可变 var str = 'andy'; console.log(str); // andy str = 'red'; console.log(str); // red /* 思考: 字符串既然是不可变的,但是上面的例子中的字符串为什么可以变更呢? 因为虽然看上去可以改变内容,但其实是内存中的地址变了,内存中新开辟了一个内存空间。 */ // 因为我们字符串的不可变所以不要大量的拼接字符串 // var str = ''; // for (var i = 1; i <= 1000000000; i++) { // str += i; // } // console.log(str); </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // indexOf('要查找的字符', [起始的位置])——从前往后找——找不到返回-1 // lastIndexof('要查找的字符', [起始的位置])——从后往前找——找不到返回-1 var str = '改革春风吹满地,春天来了'; console.log(str.indexOf('春')); // 2 console.log(str.indexOf('春', 5)); // 8 console.log(str.indexOf('山')); // -1 console.log(str.lastIndexOf('春')); // 8 console.log(str.lastIndexOf('春',6)); // 2 console.log(str.lastIndexOf('山')); // -1 </script> </head> <body> </body> </html>
案例:返回字符位置
查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数 var str = 'abcoefoxyozzopp'; var num=0; // 出现的次数 var index = str.indexOf('o'); while(index !== -1){ console.log(index); num++; index = str.indexOf('o',index+1); } console.log('o出现的次数是: ' + num); // 结果是: 3 6 9 12 o出现的次数是: 4 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> // 根据位置返回字符 // 1. charAt(index) 根据位置返回字符 var str = 'andy'; console.log(str.charAt(3)); // y // 遍历所有的字符 for (var i = 0; i < str.length; i++) { console.log(str.charAt(i)); } // a n d y // 2. charCodeAt(index) 返回相应索引号的字符ASCII值 console.log(str.charCodeAt(0)); // 97 ——a的ASCII值是97 // 3. str[index] H5 新增的 console.log(str[0]); // a </script> </head> <body> </body> </html>
案例:
判断一个字符串 'abcoefoxyozzopp' 中出现次数最多的字符,并统计其次数。
1.先来看下面的例子,用一个 对象['属性名']
来判断对象是否有该属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 有一个对象o,可以用 对象['属性名'] 来判断是否有该属性 var o = { age: 18 } if (o['age']) { console.log('里面有该属性'); } else { console.log('没有该属性'); } </script> </head> <body> </body> </html>
2.判断字符串 'abcoefoxyozzopp' 中每个字符出现的次数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var str='abcoefoxyozzopp'; var o={}; // 1.创建一个空对象 // 2.遍历字符串 for (var i=0; i<str.length; i++){ var ch = str.charAt(i); // 3.获取单个字符 if(o[ch]){ o[ch]++; // 5.如果字符已经存在,则o[字符]自增1 } else { o[ch]=1; // 4.如果字符不存在,则o[字符]=1——即第一次出现 } } console.log(o); // 6.打印出来 </script> </head> <body> </body> </html>
结果如下:
3.遍历对象取出最大次数的对象属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var str='abcoefoxyozzopp'; var o={}; // 1.创建一个空对象 // 2.遍历字符串 for (var i=0; i<str.length; i++){ var ch = str.charAt(i); // 3.获取单个字符 if(o[ch]){ o[ch]++; // 5.如果字符已经存在,则o[字符]自增1 } else { o[ch]=1; // 4.如果字符不存在,则o[字符]=1——即第一次出现 } } console.log(o); // 6.打印出来 // 7.遍历对象取出最大次数的对象属性 var max = 0; var charr = ''; for(var k in o){ // k 得到是 属性名 // o[k] 得到的是属性值 if(o[k]>max){ max=o[k]; charr=k } } console.log('最多的字符是'+charr+'总出现'+max+'次'); // 最多的字符是o总出现4次 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> // 1. concat('字符串1','字符串2'....) var str = 'andy'; console.log(str.concat('red')); // andyred // 2. substr('截取的起始位置', '截取几个字符'); var str1 = '改革春风吹满地'; console.log(str1.substr(2, 2)); // 春风——从第3个字符开始,截取2个 // 3. 替换字符 replace('被替换的字符', '替换为的字符') 只会替换第一个字符 var str3 = 'andyandy'; console.log(str3.replace('a', 'b')); // bndyandy // 4. 字符转换为数组 split('分隔符') var str4 = 'red, pink, blue'; console.log(str4.split(',')); // ['red', ' pink', ' blue'] var str5 = 'red&pink&blue'; console.log(str5.split('&')); // ['red', ' pink', ' blue'] </script> </head> <body> </body> </html>