常用命令

 

 

 

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')
}