常用命令
1.搭建开发环境
(1)浏览器(前端)
浏览器中都有自带的JS解释器
(2)Node.js(后端)
安装Node.js软件
在命令行cmd输入 node -v
(3)运行JS
浏览器
创建01.html和01.js,将js嵌入到html中
<script src = '01.js'></script>
Node.js
命令行cmd下
node 拖拽要运行的JS文件 回车
2.JS的语法规范
区分大小写
每行代码结束的分号可以省略
分为单行注释(//...) 和 多行注释(/*...*/)
变量
1.变量
(1)命名规则变量名称可以使用字母、数字、下划线、美元符号,其中不能以数字开始,不能使用关键字,不能使用汉字,最好取有语义的名字
例如: username user_name userName yongHUming(拼音)
(2)变量赋值
变量声明后未赋值为undefined(未定义),变量可以多次赋值,并且不同类型的值,这也是弱类型语言的特点。
(3)一次声明多个变量
var m1 = 1,m2 = 2,m3;
多个逗号隔开
2.变量
也是用来存储数据
const :声明后必须赋值,不允许重新赋值
const pi = 3.14; //常量 const 常用于常量
3.数据类型
分为原始类型和引用类型
(1)数值型
10进制 1 2 3 ... 7 8 9 10 ...16 8进制:以0开头的数字,例如: 012 1 2 3 ... 7 10 11 12 16进制:以0x开头的数字,a~f代表10~15,不区分大小写 1 2 3 ... 9 a ... f 10
浮点型
3141.5e+1
314.15
31.415e+1
3.1415e+2
(2)字符串型
被引号所包含的值都是字符串型,不区分单双引号
查看任意一个字符的Unicode码
'a'.charCodeAt()
(3)布尔型
只有两个值,分别是true 和 false ,代表真和假
用于存储只有两个值数据
(4)未定义型
只有一个值undefined,表示一个空值,声明变量未赋值则为undefined
(5)空
只有一个值 null ,表示一个空值,结合对象使用
检测数据类型 typeof
数值型 number
字符串型 string
布尔型 boolean
未定义型 undefined
对象型 object
4.数据类型转换
分为隐式转换和强制转换
(1)隐式转换
在运算过程中自动产生的转换
①数值+字符串 数值转为字符串
'3'+5 //'35'
②数值+布尔型 布尔型转为数值 true-->1 false-->0
2+true //3
2+false //2
③字符串+布尔型 布尔型转为字符串
'3'+true //'3true'
加号(+)运算符的作用
数字之间的加法运算
字符串之间的拼接
NaN: not a number,不是一个数字,将一个值转为数值的时候没有成功得到一个数字,结果就是NaN,和任何值执行加减乘除数学运算结果还是NaN
所有的隐式转换为数值会自动调用函数 Number()
(2)强制转换
①强制转为数值
Number()
Number('4'); //4 Number('1a'); //NaN Number(true); //1 Number(false); //0 Number(undefined); //NaN Number(null); //0
②强制转换为整型
parseInt()
用于将小数和字符串转为整型,其他类型转换为的结果为NaN
parseInt(1.9); //1 parseInt('3.14a'); //3 parseInt('a3.14'); //NaN
③强制转换为浮点型
parseFloat()
用于将字符串转为浮点型,其他类型转为的结果为NaN
parseFloat('3.14a'); //3.14 paeseFloat('6'); //6 parseFloat('a3.14'); //NaN
④强制转换为字符串
toString()
只能用于将数值和布尔型转为字符串
//练习1: var n=2; var str = n.toString() //'2' //练习2: var n1='3'+5;//'35' var n2=2+false;//2 var n3='3'+true;//'3true' console.log(n3,typeof n3);
5.运算符
表达式:由数据本身或者由运算符连接的操作数据组成的形式
运算符分为算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符、三目运算符
(1)算术运算符
+ - * / % ++ --
% 取余数
++ 自增,在原来基础上加1
-- 自减,在原来基础上减1
var b1 = 1; //先把b1当前的值赋给b2,然后b1再执行自增 var b2 = b1++; //b1=2,b2=1; var c1 = 1; //先把c1执行自增,再把自增后的值赋给c2 var c2 = ++c1; //c1=2,c2=2;
练习:查看一下程序的运行结果
var n1 = 8; var n2 = n1--; var n3 = --n1; console.log(n1,n2,n3); //练习,有关++运算符 var b1=1; //先把b1当前的值赋给b2,然后b1再执行自增 var b2=b1++; console.log(b1,b2); var c1=1; //先让c1执行自增,再把自增后的值赋给c2 var c2=++c1; console.log(c1,c2);
(2)比较运算符
> < >= <= ==(等于) !=(不等于) ===(全等于) !==(不全等于)
== 等于,只有比较两个值是否相同,可能会产生隐式转换
=== 全等于,不仅比较值,还会比较类型,不会产生因式转换
3 > '10' //false 数字和字符串比较,字符串转为数值
'3' > '10' //true 字符串之间比较的是首个字符的Unicode编码
3 > '10a' //false
3 < '10a' //false
3 == '10a' //false
NaN == NaN //false
NaN和任何值比较符 结果都是false
//字符串之间比较的是首个字符的编码 console.log( '3'.charCodeAt() ); //51 console.log( '1'.charCodeAt() ); //49
//练习:声明变量保存用户输入的用户名和密码,如果用户名是'root',并且密码是'123abc',打印true,否则打印false
var user='root'; var password='123456'; console.log(user==='root' && password==='123abc');
(3)逻辑运算符
&& 逻辑与(并且),关联的两个条件都是true结果true,否则false
|| 逻辑或(或者),关联的两个条件有一个是true,结果是true,否则false
! 逻辑非,去反
//取反向 console.log(!true); //0 console.log(!false); //1
//练习1
闰年:能被4整除,并且不能被100整除,或者能被400整除
练习:声明变量保存任意一个年份,查看是否为闰年,是打印true,不是打印false
var year=2021; console.log(year%4===0 && year%100!==0 || year%400===0); console.log(year%400===0 || year%4===0 && year%100!==0);
逻辑运算符
1.逻辑运算符的优先级
一组运算中同时出现了逻辑与和逻辑或,先执行逻辑与(&&),再执行逻辑或(||)
2.短路逻辑
&& 如果第一个表达式为false,就不再执行第二个表达式
|| 如果第一个表达式为true,就不再执行第二个表达式
![在这里插入图片描述](https://img-blog.csdnimg.cn/ef349fa01c7b4573b48bc27579cf973b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQOS5kOefpeiAhUA=,size_19,color_FFFFFF,t_70,g_se,x_16)
**短路逻辑就是为了查看是否执行第二个表达式
3.运算符
(1)位运算符
模拟计算机底层的运算,先把数据转为2进制然后进行运算,运算完再把结果转为10进制
& 按位与,上下两位都是1结果是1 ,否则是0
| 按位或,上下两位含有1结果都是1,否则是0
^ 按位异或,上下两位不同是1,否则是0
\>> 按位右移。删除最后的位数,在原来的基础之上除以2,小数执行取整
<< 按位左移,在最后补0,在原来基础之上乘以2
(2)赋值运算符
= += -= *= /=
运算赋值:先执行运算再执行赋值
![在这里插入图片描述](https://img-blog.csdnimg.cn/93e8d588b03e40a19e4ebde1d76be601.png)
(3)三目运算符
一目运算符:由一个运算符连接了一个操作数据或者表达式
二目运算符:由一个运算符连接了两个操作数据或者表达式
三目运算符:由两个运算度连接了三个操作数据或者表达式
条件表达式 ? 表达式1 : 表达式2
如果条件表达式为true,执行表达式1;否则条件表达式为false,执行表达式2
(4)浏览器端函数
alert() 弹出警示框
prompt() 弹出提示(输入)框,需要变量保存用户输入的值,类型是字符串型;点击取消返回结果为null
**程序=数据+算法
程序的执行方式:顺序执行、选择执行、循环执行
//练习:声明变量,保存用户输入的两个数字,需要弹出两次提示框;计算这两个数字相加的和,并将结果以警示框弹出
//弹出警示框 alert('WEB'); //弹出提示框 var str=prompt('input user'); console.log(str,typeof str);
//练习:声明变量,保存用户输入的两个数字,需要弹出两次提示框;计算这两个数字相加的和,并将结果以警示框弹出
var n1=prompt('input num1'); var n2=prompt('input num2'); alert(Number(n1)+Number(n2));
(5)流程控制
if语句
if(条件表达式){
语句块
}
如果语句块中只有一行代码,则大括号可以省略的
以下值作为隐式条件转换为false
0 NaN ' ' undefined null
if-else 语句
if (条件表达式){
语句块1
}else{
语句块2
}
if - else 嵌套
if (条件表达式){
语句块1
}else if (条件表达式n){
语句块n
}else{
语句块n+1 //以上所有的条件都是false
}
(6)switch - case 语句
switch (表达式) {
case 值1: //会用表达式和case后的值比较,如果相同执行对应语句
break; //结束,跳出switch - case 语句
case n 值2:
语句块 n
break;
default:
语句块 n+1 //表达式和每个case 后的值比较都是false
}
表达式在和case后的值比较的时候,只有全等于(===)一种比较方式
//练习1:假设从数据库中获取到了一个人的性别的值(1/0),如果性别的值为1打印男,否则为0打印女
var sex=0; if(sex){ console.log('男'); }else{ console.log('女'); } console.log(sex ? '男' : '女');
//使用if-else和三目运算符两种方法
sex=0 ? console.log('男') : console.log('女');
//练习2:声明变量保存订单的状态码,根据订单的状态码打印对应的汉字状态
//1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 var status=2; if(status===1){ console.log('等待付款'); }else if(status===2){ console.log('等待发货'); }else if(status===3){ console.log('运输中'); }else if(status===4){ console.log('已签收'); }else if(status===5){ console.log('已取消'); }else{ console.log('无法追踪'); }
//使用switch-case完成
var status=2;
switch(status){
case 1:
console.log('等待付款');
break;
case 2:
console.log('等待发货');
break;
case 3:
console.log('运输中');
break;
case 4:
console.log('已签收');
break;
case 5:
console.log('已取消');
break;
default:
console.log('无法追踪');
}
//选择将第1个或者第2个赋给a,使用短路逻辑
var a=5 && 2;//2
var b=0 && 2;//0
var c=5 || 2;//5
var d=0 || 2;//2
console.log(c,d);
循环
循环:循环是一遍又一遍相同或者相似的代码
循环的两个要素:
循环条件:控制循环是否往后继续执行
循环体:要执行的相同或者相似的代码
1.while 循环
while (循环条件) {
//循环体
}
//练习:打印1~100之间所有的偶数 //使用if判断之间每个数字是否为偶数 //初始值 var i=1; while(i<=100){//循环条件 //循环体 //i代表所有的整数 //判断i是否为偶数 if(i%2===0){ //i代表偶数 console.log(i); } //增量 i++; }
2.break的作用
break 在循环体中出现,一旦执行就会跳出循环,强制结束循环。
// 练习:当循环条件为true的情况下,计算11~20之间所有整数的乘积 var i=11; //声明变量,用于保存乘积 var s=1; while(true){ //i代表11~20之间所有整数 //console.log(i); //求乘积:每次乘以当前的数字,然后把结果保存到s中 s=s*i; //当i为20的时候,强制结束循环 if(i===20){ break; } //增量 i++; } //循环结束后,打印最终的结果 console.log(s);
3.do - while 循环
do {
//循环体
} while(循环条件);
//练习1:打印2000~2100之间所有的闰年,并统计出一共有多少个闰年 //能被4整除,并且不能被100整除,或者能被400整除 //循环产生所有的年份 var i=2000; //声明变量,用于保存闰年的数量 var count=0; do{ //i代表2000~2100之间所有的年份 //判断i是否为闰年 if(i%4===0 && i%100!==0 || i%400===0){ //i是闰年 console.log(i); //闰年的数量加1 count++; }
i++;
}while(i<=2100);
//循环结束后,打印最终的数量
console.log(count);
//练习2:假设有一张纸厚度是0.0001米,折叠多少次能够达到珠穆朗玛峰的高度(8848米)
//声明变量,记录纸张的厚度
var height=0.0001;
//声明变量,记录折叠的次数
var count=0;
do{
//折叠:每次折叠厚度原来的2倍
height*=2;
console.log(height);
//折叠一次,次数加1
count++;
}while(height<8848); //判断折叠后是否为8848米,如果小于8848继续折叠
//循环结束后,打印最终的次数
console.log(count);
4.for 循环
for (初始值; 循环条件; 增量){
//循环体
}
//练习1:打印1~100之间所有的整除,不包含能被3或者4整除的数字 for(var i=1;i<=100;i++){ //i代表所有的整数 if(i%3===0 || i%4===0){ continue; } console.log(i); }
5.break 和continue
break : 跳出循环,强制结束,不再执行任何循环中的代码
continue :跳出某一次循环,只是跳过剩余的循环体的代码,还会继续执行下一次循环
课后练习:
//练习:打印2000~2100之间的前10个闰年 //声明变量用于记录闰年的数量 for(var i=2000,count=0;i<=2100;i++){ //i代表所有年份 //判断是否为闰年 if(i%4===0 && i%100!==0 || i%400===0){ console.log(i); //闰年的数量加1 count++; //每次数量变量,判断是否达到了10个 if(count===10){ //强制结束循环 break; } } } //循环结束后,打印闰年的数量 console.log(count);
//练习2:计算1~100之间所有整数的和,一旦超过4000结束循环,查看当前的总和是多少,此时i的值是多少
for(var i=1,sum=0;i<=100;i++){ sum+=i; //判断sum是否超过了4000 if(sum>4000){ break;//强制结束循环 } } console.log(sum,i);
//练习3:声明变量保存任意一个数字,查看这个数字是否为素数,如果是打印‘素数’,否则打印‘非素数’
//素数(质数):在1以上的整数中,除了1和自身以外,不能被其它的数字整除;
var n=1000000000000; //循环得到2~n-1之间所有的整数,查看是否有能被n整除的数字 //声明变量记录整除的数量 for(var i=2,count=0;i<n;i++){ //i代表所有的整数 //判断是否有能被n整除的数字 if(n%i===0){ //数量加1 count++; //只要有一个能被整除肯定不是素数,没有必要往后再去循环 break; } } //如果能被整数的数量还是0,说明是素数 if(count===0){ console.log('是素数'); }else{ console.log('不是素数'); }
函数
1.函数
Number()/paseInt()/parseFloat()/alert()/prompt() ...
函数:是一个功能体,需要提供若干个数据,返回处理的结果
函数分为系统函数和自定义函数
自定义函数:目的是为封装那些重复执行的代码
(1)创建函数
function 函数名称(){
//函数体
//封装的重复执行的代码
}
调用 函数名称()
//创建函数 function getSum(){ //求1~100的和 for(var i=1,sum=0;i<=100;i++){ sum+=i; } console.log(sum); } getSum();
(2)创建带有参数的函数
function 函数名称 (参数列表){ //参数列表(形参):用来接受外部的值
//函数体
}
调用 函数名称(参数列表 --实参) //实际传递的值
参数;创建函数时的参数称为形参,调用函数是的参数称为实参;多个参数之间用逗号隔开;形参的数量和实参的数量可以不匹配,如果形参未赋值为undefined
//练习:创建函数getRun,传递两个参数,统计任意两个年份之间的闰年个数,调用多次
function getRun(n1,n2){ //统计n1~n2之间所有闰年的个数 //循环得到所有的年份 for(var i=n1,count=0;i<=n2;i++){ //i代表所以年份 if(i%4===0 && i%100!==0 || i%400===0){ count++; } } console.log(count); } getRun(2000,2100); getRun(1949,2021);
(3)创建带有返回值的函数
function 函数名称(参数列表){
//函数体
return 值; //返回值,函数调用后返回的结果
}
调用 函数名称(参数列表)
返回值:函数中没有return 或者 return 后不加值结果都是 undefined ;一旦执行就会跳出函数,结束函数体执行。
//练习:创建函数getMax,传递任意两个数字,返回最大值。
function getMax(a,b){ if(a>b){ return a; }else{ return b; } return a>b ? a : b; }
2.匿名函数
function (){ }
(1)创建函数
//函数表达式创建
var fun = function (){
}
//变量名称 fun 就是函数名称
//函数声明创建
function fn(){
}
1. 对比 *函数名称()* 和 *函数名称* //区别在于后面有没有()
函数名称() : 调用函数,执行函数体中封装的代码
函数名称 : 本质上就是一个变量,保存一个函数
2. 对比 *函数声明* 和 *函数表达式* 创建函数的区别:
函数声明: 创建的函数会整天提升到所在作用域的最前边,可以先写调用再写创建
函数表达式:创建的函数自存在变量声明的提升,必须先写创建再写调用
//练习:使用函数表达式创建函数getSum,传递任意两个数字,返回两者之间所有整数的和
var getSum;//undefined console.log(getSum(1,100));//getSum不是一个函数 var getSum=function(n1,n2){ //循环产生n1~n2之间所有整数 for(var i=n1,sum=0;i<=n2;i++){ //i代表所有整数 sum+=i; } return sum; } console.log(getSum(1,100));
(2)匿名函数自调用
创建函数作用域,防止全局污染
(function (){
//函数作用域
}) ();
(3)回调函数
将一个函数作为参数传递
function tao (madai) { madai () //通过形参 madai 调用传递进来的函数 } function xin (){} tao (xin); //函数名称 xin 作为参数传递,是回调函数 tao (function (){}); //匿名函数作为参数传递,也是回调函数
(4)系统函数
isNaN (); //检测一个值转为数值后是否为NaN,可以检测字符串是否含有非数字
eval (); //执行字符串中的表达式
(5)对象
对象是一组属性和方法的集合
a.JS中的对象
自定义对象:自己创建的对象
内置对象:JS提供的对象
宿主对象:根据不同的执行环境划分
b.自定义对象创建方式
对象字面量
内置构造函数
自定义构造函数
c.对象字面量
{ 属性名 : 属性值 , 属性名 : 属性值 ... }
属性名的引号可加可不加,如果含有特殊字符必须添加
//练习:创建一个员工对象,包含的属性有编号、姓名、性别、生日、工资
var emp={ eid:2, ename:'果子哥', sex:'男', birthday:'1973-7-15', salary:50000, 'dept-name':'研发部' }
d. 属性的访问
对象.属性名 对象['属性名']
如果属性不存在结果是 undefined
```javascript
//练习:创建一本图书对象,包含的属性有编号,书名,作者,价格;修改图书的价格属性,添加出版社属性;最后打印对象
var book={
bid:10086,
title:'兔子的产后护理',
author:'尼古拉斯',
price:399
}
book.price=599;
book['publish']='非洲人民出版社';
console.log(book);
```
e.内置构造函数
new Object()
创建一个空对象{ } ,需要单独添加每个属性
//内置构造函数 var product=new Object(); //单独添加属性 product.title='小米Air'; product.price=4199; product['made-in']='中国'; console.log(product);
f.遍历属性
依次访问对象中的每个属性
for (var k in 对象) {
k //属性名
对象[k] //属性名对应的属性值
}
3.检测对象中是否含有某个属性
对象.属性名 === undefined false --> 存在 true --> 不存在
对象.hasOwnProperty('属性名') true --> 存在 false -->不存在
'属性名' in 对象 true --> 存在 false--> 不存在
//练习:创建商品对象,包含的属性有编号、标题、价格,如果产地属性不存在则添加该属性,如果价格属性存在,则打九折;最后打印对象
var laptop={ lid:1, title:'小米Air', price:4200 } if(laptop.madeIn===undefined){ laptop.madeIn='中国'; } if(laptop.hasOwnProperty('price')){ laptop.price*=0.9; } console.log(laptop);
对比break 和 return
break 用于循环和 switch - case 语句,跳出循环或者 switch - case
return 用于函数中,跳出函数
//练习:创建函数isRun,传递任意一个年份查看是否为闰年,返回布尔型的值
function isRun(year){ if(year%4===0 && year%100!==0 || year%400===0){ return true; } return false; //方法一 return year%4===0 && year%100!==0 || year%400===0; //方法二 } var r=isRun(2021); console.log(r);
变量的作用域
1.作用域定义
全局作用域:函数外就是全局作用域,声明的变量是**全局变量**,可以在*任意*的作用域下访问到
函数作用域:函数内就是一个函数作用域,声明的变量是**局部变量**,可以在*当前*的作用域下访问到
函数内不加 var 声明的变量是全局变量
作用域链:多个作用域之间嵌套形成的结构,在查找变量的时候,如果当前作用域下没有,会不断往上一层作用域查找
var m=7; function bar(m){ //var m=5;//实参赋给形参 m=m+3;//访问的当前作用域下的m,不会往全局下寻找m } bar(5); console.log(m);
变量的声明提升
程序执行前,会将 var 声明的变量提升到所在作用域的最前边,只是提升声明,赋值不提升
function fun(){ var m1=m2=m3=5; //m3=5 //全局变量 //m2=m3 //全局变量 var m1=m2 //局部变量 } fun(); console.log(m3); //5 console.log(m2); //5 console.log(m1); //报错:找不到m1
函数的提升:程序执行前,会将函数提升到所在作用域的最前边,可以先写调用再创建
console.log(a); //undefined var a=1;
3.递归
递归是函数内调用自身的一种写法
递归默认是一个死循环,一直运行下去会产生内存泄漏(内存被沾满,导致崩溃)
使用递归可以解决循环的问题
递归的使用:找规律、找边界条件、以上两者结合着他return
//阶乘 5!=5*4*3*2*1 //使用递归计算任意数字的阶乘 //计算n的阶乘 = n * (n-1)的阶乘 function jc(n){ //如果n为1的时候 if(n===1){ return 1;//返回1的同时,跳出函数,递归结束 } return n*jc(n-1); } console.log( jc(5) ); /* 5*jc(4) 5*4*jc(3) 5*4*3*jc(2) 5*4*3*2*jc(1) 5*4*3*2*1 */
4.对象中的方法
方法对应的就是一个函数
var person = { play: function () { this //指向的是调用当前方法的对象 } } person.play();
//练习:创建一个圆的对象,包含的属性有半径和圆周率,添加方法计算圆的周长返回结果,添加方法计算圆的面积返回结果;最后调用两个方法
//方法:就是一个函数
var circle={ r:5, pi:3.14, len:function(){ return 2*this.pi*this.r; }, area:function(){ return this.pi*this.r*this.r; } } console.log( circle.len() ); console.log( circle.area() );
数组
1.数据存储
原始类型:直接将数据存储在栈内存中
引用类型:将数据存储在堆内存中,同时自动生成一个地址,然后将地址存储在栈内存中,如:函数、对象、数组
null :空地址,不指向任何堆内存的数据
如果堆内存的数据不被任何地址所指向,就会自动销毁
如果销毁一个引用类型的数据,只需要赋值为null即可
var p1={ name:'华为' } var p2={ name:'华为' } console.log(p1===p2); var obj={ m:2 } function fn(s){ //两者指向同一个对象 //s=obj s.m=5; } //传递的是对象的地址 fn(obj); console.log(obj);
2.数组
是一组数据的聚合,每个数据叫做一个元素
(1)数组字面量创建
[元素1,元素2...]
元素中可以存放任意类型的数据(包括对象)
(2)访问元素
下标(索引):数组为每个元素自动添加的编号,从0开始的整数
数组[下标]
(3)数组的长度
数组.length
可以获取数组元素的个数
数组[ 数组.length ] = 值 在数组的末尾 添加新的元素
//练习:创建空数组,使用数组长度不断添加国家的名称。
var country=[]; country[country.length]='瓦坎达'; country[country.length]='印度'; country[country.length]='日本'; console.log(country);
(4)使用构造函数创建数组
new Array (元素1, 元素2, ..)
new Array (3) 创建数组,初始化长度为3,可以添加更多个元素
(5)数组的分类
索引数组 : 以>=0的整数作为下标
关联数组 : 以字符串作为下标,需要单独添加元素
**数组和对象的区别:
两者都可以保存一组数据,对象保存的数据是无序的,数组保存的数据是有序
(6)数组的遍历
依次访问数组中的每个元素
//方法一:之前学过 for in for (var k in 数组) { k //小标 arr[k] //小标对应的元素 } //推荐写法 for (var i=0; i < 数组.length; i++) [ i //小标 数组[i] //下标对应的元素 }
3.API
JS中预定义的函数和方法
**toString ()** 将数组转为字符串,元素之间逗号隔开
**join ()** 将数组转为字符串,元素之间默认逗号分隔,可以指定分隔得符号
**reverse()** 翻转数组元素
**sort()** 对数组进行排序,默认是按照首个字符Unicode码从小到大
sort (function (a,b)) {
return a-b; //按照数字从小到大
// trturn b-a; //按照数字从大到小
}
**concat (数组1,数组2, ...)** 拼接多个数组,返回拼接后的数组
**slice (start, end)** 截取数组元素,start开始的下标,end结束的下标,不包含 end ,end 为空截取到最后,下标是负数表示倒取,返回截取到的元素,格式为数组
var arr=['锋盛','强','裴腾','王凯','甜甜','张旭','红','安辉','林凯']; //删除数组元素 console.log( arr.splice(2,1) ); console.log( arr.splice(2) ); console.log( arr.splice(-3,0,'蔡明','王鑫') ); console.log(arr);
**splice (start, count, v1, v2, ...)** 删除数组元素,start开始的下标,count删除的数量,count为空表示删除到最后,下标为负数表示倒取,v1,v2 删除后要补充的元素,返回删除的元素,原数组会发生变化
//练习:创建数组包含a~h,每个字母是一个元素,删除de,替换f为m,在下标为1的位置插入z
var arr=['a','b','c','d','e','f','g','h']; arr.splice(3,2); arr.splice(-3,1,'m'); arr.splice(1,0,'z'); console.log(arr);
push () 在数组的末尾添加元素,返回数组的长度,*原数组会发生变化*
pop () 删除数组末尾的一个元素,返回删除的元素,*原数组会发生变化*
unshift () 在数组的开头添加元素,返回数组的长度,*原数组会发生变化*
shift () 删除数组的开头的一个元素,返回删除的元素,*原数组会发生变化*
index () 查找数组中是否含有某个元素,返回找到的下标,找不打返回-1
3.二维数组
对数据进行二次分类,每个元素还是数组
[ [ 元素1, 元素2,... ], [ 元素3, 元素4, ], [], ... ]
//访问
//数组 [下标] [小标]
对象
1.字符串对象
包装对象:目的是为了让原始类型的数据像引用类型数据,具有属性和方法
JS 提供三种包装对象:字符串、 数值、 布尔值
new String () 将字符串包装为对象
String () 将任意的数据转为字符串
(1)转义字符 --- \
改变字符本身的意义
\' //将具有特殊意义的引号转为普通引号
\t //将字符t转义为制表符,产生多个连续空格
\n //将字符n转义为换行符
(2)API
当一个字符串字面量调用属性或者方法的时候,自动将字符串包装为对象,然后再去调用属性或者方法
所有的字符串API都不会对原来的字符串产生影响
**length** 获取字符串的长度
**charAt (下标)** 获取下标对应的字符,也可以使用数组的写法 字符串[下标]
**indexOf ()** 查找字符串中是否含有某个字符串,返回满足条件的第一个的下标,找不到返回 -1
**lastindexOf ()** 查找字符串中是否含有某个字符串,返回满足条件的最后一个的下标,找不到返回 -1
**toUpperCase ()** 英文字母转大写
**toLowerCase ()** 英文字母转小写
**slice (start, end)** 截取字符串,start 开始的下标, end 结束的下标, end 为空截取到最后,下标是负数表示倒取
**split ()** 将字符串转为数组,需要指定分隔的符号
//用符号分隔数组 var arr=['a','b','c']; var str=arr.join('-');//'a-b-c' console.log(str); //字符串转数组,指定分隔的符号 console.log( str.split('-') );
//练习:将一句英文中的每个单词首字母大写,其余字母小写
//'wHAt aRE yOu doING' -> 'What Are You Doing' var str='wHAt aRE yOu doING'; //转为数组,之间按照空格分隔 var arr=str.split(' '); //遍历数组,得到每个单词 for(var i=0;i<arr.length;i++){ //console.log(arr[i]);//每个单词 //截取首个字母转大写 var f=arr[i].slice(0,1).toUpperCase(); //截取其余的字母转小写 var o=arr[i].slice(1).toLowerCase(); //console.log(f+o); //把转换后拼接起来,替换之前的单词 arr[i]=f+o; } //最后再把数组转为字符串,之间用空格分隔 console.log(arr.join(' '));
2.Math对象
不需要 new 来创建,可以直接使用API
random () 获取随机数,范围 >=0, <1
PI 获取圆周率
abs () 计算绝对值
ceil () 向上取整
floor () 向下取整
round () 四舍五入取整
pow (x,y) 计算x的y次方
max () 获取一组数字最大值
min () 获取一组数字最小值
3.Date 对象
用于日期时间的存储和计算
(1)创建
new Date ('2021/10/20 11:40:20')
new Date (2021,9,4,11,40,20) 月份范围0~11 代表1-12月
new Date () 存储当前操作系统的时间
new Date (500) 存储的是时间戳,距离计算机元年(1970-1-1 0:0:0)的毫秒数
(2)获取
getFullYear / getMonth /getDate
月份范围0~11,显示的时候需要+1
getHours / getMinutes / gerSeconds / getMilliseconds(毫秒)
getTime 获取时间戳格式
getDay 获取星期,范围0~6 对应 日---六
(3)转为本地字符串
存在兼容性问题,只能用于调试,不能用于实际项目
toLocaleString () 显示日期+时间
toLocaleDateString () 显示日期部分
toLocaleTimeString () 显示时间部分
(4)设置
修改存储的日期时间
setFullYear / setMonth / setDate
setHours / setMinutes / setSeconds / setMilliseconds
setTime 设置时间戳,产生一个具体日期时间
4.Number 对象
new Number () 将数值包装为对象
Number () 将数据转换为数值
toFixed (n) 强制保留小数点后n位
toString (n) 数值转为字符串,设置转换的进制,例如:2 8 16...
5.Boolean 对象
new Boolean () 将布尔型包装为对象
Boolean () 将数据转换为布尔型
var b1=true;//字面量 var b2=new Boolean(true);//包装对象 //false: 0 NaN '' undefined null 默认为false //[] {} console.log( Boolean({}) ); console.log(b2,typeof b2);
6.错误处理
(1)常见的错误
SyntaxError : 语法错误,书写不符合语法规则,例如:出现中文符号,缺少括号...
ReferenceError : 引用错误,使用了未声明的变量
TypeError : 类型错误,调用的不是一个函数类型
自定义错误 : 程序员自己指定的错误 throw 错误内容
var age=15; //判断,如果不在18~60之间,提示非法年龄 if(age<18 || age>60){ //自定义错误 throw '非法的年龄'; }
(2)错误处理
出现错误后,不再影响后续代码
try {
//尝试执行,可能产生错误
}catch (err){
//捕获错误,把错误放到err中
//执行错误处理代码
}
//尝试执行,可能产生错误,出现错误不影响后续代码 try{ console.log(hello); }catch(err){ //捕获错误,只有try中出现才会执行 //err 收集错误信息 //console.log(err); //解决错误 console.log('hello') }