JavaScript学习笔记

一、JS初体验

目录

一、JS初体验

1、行内式JS

2、内嵌式JS

3、外部JS文件

二、变量的数据类型

1、数字型Number

2、非数字型 isNaN

3、字符串型String

4、布尔型boolean

5、undefined和null

三、获取变量数据类型

1、获取检测变量的数据类型

四、数据类型的转换

1、转换为字符串

2、转换为数字型

3、转换为布尔型

五、JavaScript运算符

六、流程控制、分支结构

1、流程控制

2、顺序流程控制

3、分支流程控制if语句

4、三元表达式

5、分支流程控制switch语句

七、循环

1、for循环

2、双重循环

3、while循环

4、do while循环

5、continue break

八、JavaScript数组

1、数组的概念

2、创建数组

3、遍历数组

4、数组中的新增元素

5、数组案例

6、(数组排序)冒泡排序

九、函数

1、函数的概念

2、函数的使用

3、函数的参数

4、函数的返回值

5、arguments的使用

6、函数案例

7、函数的两种声明方式

十、JavaScript作用域

1、作用域

2、变量的作用域

3、作用域链

十一、JavaScript与解析

1、预解析

2、变量预解析和函数预解析

十二、JS对象

1、对象

2、创建对象的三种方式

3、new关键字

4、遍历对象属性

十三、JS内置对象

1、内置对象

2、查文档

3、Math对象

4、日期对象

5、数组对象

6、字符串对象

十四、JS中的简单数据类型和复杂数据类型

1、简单类型与复杂类型

2、堆和栈

3、简单类型的内存分配

4、复杂类型的内存分配

5、简单类型传参

6、复杂类型传参


JS有3种书写位置,分别为行内、内嵌和外部

1、行内式JS

<input  type="button" value="点我试试" onclick="alert('hello World')"/>
  • 可以将单行或少量JS代码写在HTML标签的事件属性中(以on开头的属性),如:onclick

  • 注意单双引号的使用:再HTML中我们推荐使用双引号,JS中我们推荐使用单引号

  • 可读性性差,在html中编写JS大量代码时,不方便阅读;

  • 引号易错,引号多层嵌套匹配时,非常容易弄混

  • 特殊情况下使用

2、内嵌式JS

<script>
    alert('Hello World');
</script>
  • 可以将多行JS代码写到<script>标签中

  • 内嵌JS是学习时常用的方式

3、外部JS文件

<script src="my.js"><script>
  • 利用HTML页面代码结构化,把大段JS代码独立到HTML页面之外,既美观也方便文件级别的复用

  • 引用外部JS文件的script标签中间不可以写代码

  • 适合于JS代码量比较大的情况

二、变量的数据类型

//int num=10; java
        var num;//这里的num不确定属于哪种数据类型
        var num=10;//num属于数字型
        //JS的变量数据类型是只有程序在运行过程中,根据等号右边的值来确定的
        var str='pink';//str字符串型
        //js是动态语言 变量的数据类型是可以变化的
        var x=10;//x是数字型
        x='pink';//x是字符串型

1、数字型Number

var num=10;//num 数字型
    var PI=3.14;//PI 数字型
    //1、八进制0~7 我们程序里面数字前面加0 表示八进制
    var num1=010;
    console.log(num1);

2、非数字型 isNaN

//isNaN()用这个方法来判断非数字 并返回一个值 如果是数字返回的是false  如果不是数字返回的是true
        console.log(isNaN(12));//false
        console.log(isNaN('HELLO'));

3、字符串型String

 //字符串型String
        var str='我是一个小朋友'
        //引号嵌套,外双内单或者外单内双
        var str='我是一个“小朋友”'
        console.log(str);
        var str="我是一个‘小朋友’"
//字符转义符 都是\开头,这些转义符都要写在引号里面
        var str='我是一个\n大呲花'
        console.log(str);
//1、检测字符串的长度length
    var str='my name is andy';
    console.log(str.length);
    //2、字符串的拼接 +
    console.log('非洲'+'呲花');//字符串的  非洲呲花
    console.log('candy老师'+'呲花');//candy老师呲花
    console.log('pink'+true);//pinktrue
    console.log(12+12);//24
    console.log('12'+12);//1212

4、布尔型boolean

var flag=true;//flag 布尔型
        var flag1=false;//flag1 布尔型
        console.log(flag+1);//true参与加法运算当1来看
        console.log(flag1+1);//false参与加法运算当0来看

5、undefined和null

//如果一个变量声明未赋值,就是undefined 未定义数据类型
        var str;
        var variable=undefined;
        console.log(variable+'pink');//undefinedpink
        console.log(varianle+1);//NaN  underfined和数字相加,最后结果NaN
        //null 空值
        var space =null;
        console.log(space+'pink');//nullpink
        console.log(space+12);//1

三、获取变量数据类型

1、获取检测变量的数据类型

type of可以用来检测变量的数据类型

四、数据类型的转换

1、转换为字符串

to String() 转成字符串 String() 强制转换 加号拼接字符串

//1、把数字型转换为字符串型 toString()
        var num=10;
        var str=num.toString();
        console.log(str);
        console.log(typeof str);
        //2、String(变量)  
        console.log(String(num));
        //3、利用+拼接字符串的方法实现转换效果
        console.log(num + '');

2、转换为数字型

parseInt(String)函数 将string类型转成整数数值型 parseFloat(string)函数 将string类型转成浮点数数值型 Number()强制转换函数 将string类型转换为数值型 js隐式转换(- * /) 利用算术运算隐式转换为数值型

//var age=prompt('请输入你的年龄');
        //1、parseInt(变量) 可以把字符型的转换为数字型 得到的是整数
        //console.log(parseInt(age));
        console.log(parseInt('3.14'));//3取整
        console.log(parseInt('3.98'));//3取整
        console.log(parseInt('120px'));//120  会去掉这个px单位
        console.log(parseInt('rem120px'));//NaN
        //2、parseFloat(变量)可以把字符型的转换为数字型 得到的是小数 浮点数
        console.log(parseFloat(3.14));
        console.log(parseFloat('120px'));//120
        onsole.log(parseFloat('rem120px'));//NaN
    //3、利用Number(变量)
        var str ='123';
        console.log(Number(str));
        console.log(Number('12'));
    //4、利用了算术运算 -  *  /
        console.log('12'- 0);
        console.log('123'-'120

3、转换为布尔型

代表空、否定的值会被转换为false,如:' '、0、NaN、null、undefined 其余值都会被转换为true

五、JavaScript运算符

//1.算术运算符
        console.log(1 + 1);
        console.log(1 - 1);
        console.log(1 * 1);
        console.log(1 / 1);
        console.log(1 % 1);

    //浮点数 算数运算中会出现精度问题
        console.log(0.07 * 100);
        console.log(0.1 + 0.2);
    //不能直接将浮点数进行比较 是否相等
        var num=0.1 + 0.2;
        console.log(num == 0.3);

//2.表达式与返回值
        //由数字、运算符、变量等组成的式子 称为表达式
        console.log(1 + 1);//2 就是返回值
        //在程序里:2 = 1 + 1 把我们右边表达式计算完毕把返回值给左边
        var num = 1 + 1;
        
//3.递增和递减运算符
        //①想要一个变量自己加1 num=num + 1  比较麻烦
        var num = 1;
        num = num + 1;
        console.log(num);//2
        //++num 前置递增运算符  先自加1后返回值
        var age = 10;
        ++age;//类似于 age=age+1
        console.log(age);
        
        var p=10;
        console.log(++p + 10);
        //num++  后置自增运算符  先返回原值后自加1
        var num=10;
        num++;//类似于 num=num+1
        console.log(num);
//4.练习
        var a = 10;
        ++a;//++a 11  a=11
        var b = ++a + 2;//a=12 ++a=12
        console.log(b);//14 

        var c = 10;
        c++;//c++ 11 c=11
        var d = c++ + 2;//c++ =11 c=12
        console.log(d);

        var e = 10;
        var f = e ++ + ++e;// e++ =10 e=11 e=12 ++e=12
        console.log(f);
        //后置自增 先表达式返回原值 后面变量再自加1
//5.比较运算符
        console.log(3 >= 5);//false
        console.log(2 <= 4);//true
        //我们程序里面的等于符号是 == 默认转换数据类型 会把字符串的数据转换为数字型
        console.log(3==5);//false
        console.log('pink老师' =='大呲花');//false
        console.log(18 == 18);//true
        console.log(18 == '18');//true
        //我们程序里面有全等于 === 要求两侧的值还有数据类型完全一致 才可以true
        console.log(18 === 18);
        console.log(18 === '18');//false
//6.逻辑运算符
        //&& 两侧都为true 结果才是true 只要有一侧为false 结果就为 false
        console.log(3 > 5 && 3 > 2);//有一个为假 即假  false
        console.log(3 < 5 && 3 > 2);//true
        // ||  两侧都为假 结果才是假 只要有一侧是true 结果就是true
        console.log(3 > 5 || 3 > 2);//true
        console.log(3 > 5 || 3 < 2);//false
        // ! 
        console.log(!true); 
//练习
        var num =7
        var str ="我爱你~中国~";
        console.log(num > 5 && str.length >= num);//true
        console.log(num < 5 && str.length >= num);//false
        console.log(!(num < 10));//false
        console.log(!(num < 10 || str.length == num));//false
//7.短路运算(逻辑中断)
        //逻辑与短路运算  用我们的布尔值参与的逻辑运算  true && false ==false
        //语法:表达式1&&表达式2  如果第一个表达式为真,则返回表达式2;如果第一个表达式为假,则返回表达式1
        console.log(123 && 456); // 456
        console.log(0 && 456); // 0
        console.log(0 && 1+2 && 456*56789); // 0
        //如果有空的或否定的为假,其余为真  0  '' null undefined NaN
        //逻辑或短路运算  如果表达式1为真,返回表达式1;如果表达式1为假,则返回表达式2
        console.log(123||456);//123
        console.log(123 || 456 || 456+123); //123
        console.log(0 || 456 || 456+123);//456
//8.赋值运算符
        var num = 10;
        //num = num + 1; num++
        num = num + 2;// num += 2;
        num += 2;
        console.log(num); // 12
        num += 5;
        console.log(num);// 15
        var age = 18;
        age *= 2;//age = age * 2
        console.log(age);// 36

六、流程控制、分支结构

1、流程控制

流程控制主要有三种结构,分别是顺序结构、分支结构和循环结构

2、顺序流程控制

3、分支流程控制if语句

if分支语句

<script>
        //1.if的语法结构
        if(条件表达式){
            //执行语句
        }
        //2.执行思路 如果if里面的条件表达式结果为真true则执行大括号里面的执行语句
        //如果if条件表达式结果为假,则不执行大括号里面的语句,则执行if语句后面的代码
        //3.代码体验
        if(3 < 5){
            alert('说散就散');
        }
</script>

进入网吧(案例)

<script>
        //弹出一个输入框,要求用户输入年龄,如果年龄大于等于18岁,允许进入网吧
        //①弹出一个prompt输入框,用户输入年龄,程序把这个值取过来保存到变量中
        //②使用if语句来判断年龄,如果年龄大于18就执行if大括号里面的输出语句

        var age=prompt('请输入您的年龄:');
        if(age>=18){
            alert('大漠孤烟直,长河落日圆');
        }
</script>

if else双分支语句

<script> 
//1.if else双分支语句
        if(条件表达式){
            //执行语句1
        }else{
            //执行语句2
        }
        //2.执行思路 如果if里面的条件表达式结果为真true则执行大括号里面的执行语句1
        //否则执行语句2
        //3.代码验证
        var age=prompt('请输入您的年龄');
        if(age>=18){
            alert('我想带你去海边');
        }else{
            alert('你不配');
        }
</script>

判断闰年(案例)

 <script>
        //接收用户输入的年份,如果是闰年就弹出闰年,否则就弹出是平年
        //①能被4整除且不能整除100的为闰年
        //②弹出prompt输入框,让用户输入年份,把这个值取过来保存到变量中
        //③使用if语句来判断是否是闰年,如果是闰年,就执行if大括号里面的输入语句,否则执行else里的输入语句
        var year=prompt('请您输入年份:');
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
            alert('您输入的年份是闰年');
        }else{
            alert('您输入的年份是平年');
        }
 </script>

if else if 语句(多分支语句)

<script>
        //1.多分支语句 就是利用多个条件来选择不同的语句执行 得到不同的结果,多选1的过程
        //2.语法规范
        if(条件表达式1){
            //语句1;
        }else if(条件表达式2){
            //语句2;
        }else if(条件表达式3){
            //语句3;
        }else{
            //最后的语句;
        }
 </script>

判断成绩级别(案例)

<script>
        var score=prompt('请您输入分数');
        if(score>=90){
            alert('优秀');
        }else if(score>=80){
            alert('良好');
        }else if(score>=70){
            alert('一般');
        }else if(score>=60){
            alert('及格');
        }else{
            alert('不及格');
        }
 </script>

4、三元表达式

<script>
        //1.语法结构
        //条件表达式?表达式1:表达式2
        //2.执行思路
        //如果条件表达式结果为真,则返回表达式1,
       var num=10;
       var result = num>5?'是的':'不是的';
       console.log(result);
       //相当于
       if(num>5){
           result='是的';
       }else{
           result='不是的';
       }
 </script>

数字补0(案例)

<script>
        //用户输入0~59之间的一个数字
        //如果数字小于10,则在这个数字前面补0,(加0)否则不做操作
        //用一个变量接受这个返回值,输出
        var time=prompt('请您输入一个0~59之间的一个数字');
        //三元表达式
        var result=time < 10 ? '0'+time : time;//把返回值赋值给一个变量
        alert(result);
 </script>

5、分支流程控制switch语句

<script>
       // 语法结构
        switch(表达式){
            case value1:
                执行语句1;
                break;
            case value2:
                执行语句2;
                break;
            
            default:
                执行最后的语句;
        }
       //代码验证
        switch(2){
            case 1:
                console.log('这是1');
                break;
            case 2:
                console.log('这是2');
                break;
            default:
                console.log('没有匹配结果');
        }
        //switch注意事项
        var num=3;
        switch(num){
            case 1:
                console.log(1);
                break;
        }
        //1.我们开发里面 表达式经常写成变量
        //2.我们num的值和case里面的值相匹配的时候是全等 必须是值和数据类型一致才可以 num==1
        //3.如果当前的case里没有break则不会退出switch ,会继续执行下一个case
 </script>

查询水果(案例)

<script>
        var fruit=prompt('请您输入查询的水果');
        switch(fruit){
            case '苹果':
                alert('苹果的价格3.5/斤');
                break;
            case '橘子':
                alert('橘子的价格4/斤');
                break;
            default:
                alert('没有这种水果');
        }
 </script>

七、循环

1、for循环

<script>
        //1.for 重复执行某些代码,通常跟计数有关
        //2.for 语法结构
//   for(初始化变量;条件表达式;操作表达式){
            //循环体
//      }
        
    //3.初始化变量 就是用var声明一个普通变量,通常用于作为计数器使用
        //4.条件表达式 就是用来决定每一次循环是否继续执行 就是终止的条件
        //5.操作表达式 是每次循环最后执行的代码 经常用于我们计数器变量进行更新(递增或递减)
        //6.代码体验
        for(var i=1;i<=100;i++){
            console.log('你好');
        }
    //========================================
        //for循环执行相同的代码
        for(var i=1;i<=10;i++){
            console.log('牛奶咖啡');
        }
        //我们可以让用户控制输出的次数
        var num =prompt('请您上输入次数');
        for(var i=1;i<=10;i++){
            console.log('牛奶咖啡');
        }
 //========================================
        //for循环执行不同的代码
        //我们想要输出一个人 1~100岁
        for(var i=1;i<=100;i++){
            console.log('这个人今年' + i + '岁了');
        }
 //=========================================
    //for循环重复某些相同的操作
        //求1~100之间所有整数的累加和
        // ①:需要循环100次,我们需要一个计数器i
        // ②:我们需要一个存储结果的变量sum,但是初始值一定是0
        // ③:核心算法:1+2+3+4...,sum=sum+i;
        var sum=0; //求和的变量
        for(var i=1;i<=100;i++){
            sum=sum+i;
        }
        console.log(sum);
 </script>

for循环案例

<script>
        //1.求1~100之间所有数的平均值
        var sum=0;
        var average=0;
        for(var i=1;i<=100;i++){
            sum=sum+i;
        }
        average =sum/100;
        console.log(average);
        //2.求1~100之间所有偶数和奇数的和 偶数的和变量even 奇数odd
        var even=0;
        var odd=0;
        for(var i=1;i<=100;i++){
            if(i%2==0){
                even=even+i;
            }else{
                odd=odd+i;
            }
        }
        console.log('1~100之间所有的偶数和是'+even);
        console.log('1~100之间所有的奇数和是'+odd);
        
        //3.求1~100之间所有能被3整除的数字的和
        var result=0;
        for(var i=1;i<=100;i++){
            if(i%3==0){
                result=result+i;
            }
        }
        console.log('1~100之间能被3整除的数是'+result);
    
     //一行打印5个*
        var num=prompt('请输入星星的个数');
        var str='';
        for(var i=1;i<=5;i++){
            str=str+'*';
        }
        console.log(str);
 </script>

2、双重循环

<script>
        //双重for循环 语法结构
        for(外层的初始化变量;外层的条件表达式;外层的操作表达式){
            for(里层的初始化变量;里层的条件表达式;里层的操作表达式){
                //执行语句;
            }
        }
        //把里面的循环看作是外层循环的语句
        //外层循环循环一次,里面的循环执行全部
        //代码验证
        for(var i=1;i<=3;i++){
            console.log('这是外层循环第'+i+'次');
            for(var j=1;j<+i;j++){
                console.log('这是里层循环的第'+j+'次');
            }
        }
 </script>

打印五行五列 ; 打印n行n列 * ; 打印倒三角形 ; 九九乘法表

 <script>
 //打印五行*
        var str='';
        for(var i=1;i<=5;i++){//外层循环负责打印五行
            for(var j=1;j<=i;j++){//里层循环负责一行打印五个*
                str = str +'*';
            }
            //如果一行打印完毕5个*就要另起一行 加\n
            str=str+'\n';
        }
        console.log(str);
//=========================================
        //打印n行n列*
        var rows=prompt('请您输入行数:');
        var cols=prompt('请您输入列数:');
        var str='';
        for(var i=1;i<=rows;i++){
            for(var j=1;j<=cols;j++){
                str=str+'*';
            }
            str=str += '\n';
        }
        console.log(str);
//=========================================
      //打印倒三角形
        var str='';
        for(var i=1;i<=10;i++){//外层循环控制行数
            for(var j=i;j<=10;j++){//里层循环打印的个数不一样 
                str=str + '*';
            }
            str += '\n';
        }
        console.log(str);
//=========================================
      //九九乘法表
        var str='';
        for(var i=1;i<=9;i++){
            for(var j=1;j<+i;j++){
                //1*2=2;
                //str=str+'*';
                str += j + '*' + i + '=' + i * j + '\t';
            }
            str += '\n';
        }
        console.log(str);
</script>

3、while循环

 <script>
        //1.while循环语法结构
    //    while(条件表达式){
            //循环体
    //    }
        //2.执行思路
        //3.代码验证
        var num=1;
        while(num<=100){
            console.log('你哈啊');
            num++;
        }
        //4.里面应该有计数器,初始化变量
        //5.里面应该有操作表达式,完成数据器的更新,防止死循环
 </script>

while循环案例 

 <script>
        //while循环案例
        //1.打印人的一生,从1岁到100岁
        var i=1;
        while(i<=100){
            console.log('这个人今年'+i+'岁了');
            i++;
        }
        //2.计算1~100之间所有整数的和
        var sum=0;
        var j=1;
        while(j<=100){
            sum=sum+j;
            j++;
        }
        console.log(sum);
        //3.弹出一个提示框,你爱我吗?如果输入我爱你,就提示结束,否则,一直询问
        var message=prompt('你爱我吗?');
        while(message !='我爱你'){
            message=prompt('你爱我吗?');
        }
        alert('我也爱你啊')
 </script>

4、do while循环

<script>
        //1.do while 循环语法结构
        do{
            //循环体
        }while(条件表达式)
        //2.执行思路
        //先执行一次循环,再判断条件
        //3.代码验证
        var i=1;
        do{
            console.log('你好吗?');
            i++;
        }while(i<=100)
        //4.do while 循环体至少执行一次
 </script>

do  while 循环案例 

<script>
         //1.打印人的一生,从1岁到100岁
        var i=1;
        do{
            console.log('这个人今年'+i+'岁了');
            i++;
        }while(i<=100)
        //2.计算1~100之间所有整数的和
        var sum=0;
        var j=1;
        do{
            sum=sum+j;
            j++;
        }while(j<=100)
        console.log(sum);
        //3.弹出一个提示框,你爱我吗?如果输入我爱你,就提示结束,否则,一直询问
        do{
            var message=prompt('你爱我吗');
        }while(message !='我爱你')
        alert('我也爱你啊');
 </script>

5、continue break

 <script>
        //continue关键字
        for(var i=1;i<=5;i++){
            if(i==3){
                continue;//只要遇见continue就退出本次循环,直接跳到i++
            }
            console.log('我正在吃第'+i+'个包子');
        }
        //求1~100之间,除了能被7整除之外的整数和
        var sum=0;
        for(var i=1;i<=100;i++){
            if(i%7==0){
                continue;
            }
            sum=sum+i;
        }
        console.log(sum);
 </script>
 <script>
        //break关键字 退出整个循环
        for(var i=1;i<=5;i++){
            if(i==3){
                break;
            }
            console.log('我正在吃第'+i+'个包子');
        }
 </script>

八、JavaScript数组

1、数组的概念

数组是指一组数据的集合,其中的每一个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式。

2、创建数组

JS中创建数组有两种方式:

①利用new创建数组;②利用数组字面量创建数组

<script>
        //利用new创建数组
        var arr = new Array();//创建了一个空的数组
        //利用数组字面量创建数组[]
        var arr =[];//创建了一个空的数组
        var arr1 = [1,2,'hello',true];
        //数组里面的数据用逗号分隔
        //数组里面的数据,称为数组元素
    //=================================================
    //获取数组元素  格式  数组名[索引号]  索引号从0开始
        console.log(arr1[2]);//hello
        console.log(arr1[3]);//true
    //访问数组
        var arr2=['王俊凯','易烊千玺','王源'];
        console.log(arr2[0]);
        console.log(arr2[1]);
        console.log(arr2[2]);
        console.log(arr2[3]);//因为没有这个数组元素,所以输出的结果是undefined
        
 </script>

3、遍历数组

<script>
        var arr = ['red','green','blue']
        for (var i=0; i < 3 ; i++) {
            console.log(arr[i]);
        }
        //1.因为数组的索引号是从0开始,所以i必须从0开始 i < 3
        //2.输出的时候 arr[i] i 计数器当索引号使用
//=========================================
    //数组长度   数组名.length
        var arr = ['关羽','张飞','马超','赵云','黄忠','刘备','姜维'];
        //方式一
        for(var i = 0; i < 7; i++){
            console.log(arr[i]);
        }
        console.log(arr.length);
        //方式二
        for(var i = 0; i < arr.length; i++){
            console.log(arr[i]);
        }
        //1. 数组的长度是元素个数 不要个索引号混淆
        //2. arr.length 动态检测数组元素的个数
 </script>
<script>
    //求数组[2,6,1,7,4]里面所有元素的和以及平均值
    //①:声明一个求和变量sum ②:遍历这个数组,把里面每一个数组元素加到sum里面、
    //③:用求和变量sum除以数组的长度就可以得到数组的平均值
     var sum = 0;
     var arr = [2,6,1,7,4];
     var average = 0;
     for (var i = 0; i < arr.length; i++){
         sum += arr[i];//我们加的是数组元素 arr[i] 不是计数器i
     }
     average = sum / arr.length;
     console.log(sum, average);
 </script>
<script>
//求数组[2,6,1,77,52,25,7]中的最大值
    //①:声明一个保存元素的变量max ②:默认最大值可以取数组中的第一个元素 
    //③:遍历这个数组,把里面每个数组元素和max相比较 ④:如果这个数组元素大于max就把这个数组元素存到max里面,否则继续下一轮比较
    //最后输出max
    var arr = [2,6,1,77,52,25,7];
    var max = arr[0];
    for (var i = 1; i < arr.length; i++){
        if (arr[i] > max){
            max = arr[i];
        }
    }
    console.log('该数组里面的最大值是'+ max);
</script>
<script>
    //数组转换为分割字符串。要求:将数组['red','green','blue','pink']转换为字符串,并且用|或其他符号分割
    //输出:'red|green|blue|pink'
    //①:需要一个新变量用于存放转换完的字符串str ②:遍历原来的数组,分别把里面数据取出来,加到字符串里面 ③:同时在后面多加一个分隔符
    var arr = ['red','green','blue','pink']; 
    var str='';
    var sep='!';
    for (var i =0; i < arr.length; i++) {
        str = str + arr[i] + sep;
    }
    console.log(str);
</script>

4、数组中的新增元素

<script>
        //1.新增数组元素  修改length长度
        var arr =['red','green','blue'];
        console.log(arr.length);
        arr.length = 5;//把数组的长度修改为了5 ,里面应该有5个元素
        console.log(arr);
        console.log(arr[3]);//undefined
        console.log(arr[4]);//undefined
        
        //2.新增数组元素 修改索引号 追加数组元素
        var arr1 = ['red','green','blue'];
        arr1[3]='pink';
        console.log(arr1);
        arr1[4]='hotpink';
        console.log(arr1);
        arr1[0]='yellow';//这里是替换原来的数组元素
        console.log(arr1);
        arr1='有点意思';
        console.log(arr1);//不要直接给数组名赋值,否则会覆盖掉以前的数据
 </script>
案例:
<script>
        //新建一个数组,里面存放10个整数(1~10)
        //核心原理:使用循环来追加数组
        //1、声明一个空数组arr
        //2、循环中的计数器i 可以作为数组元素存入
        //3、由于数组的索引号是从0开始的,因此计数器从0开始更合适,存入的数组元素要+1
        var arr= [];
        for(var i=0;i<10;i++){
            //arr = i;不要直接给数组名赋值 否则以前的元素都没了
            arr[i] = i + 1;
        }
        console.log(arr);
 </script>
案例:筛选数组
<script>
//将数组[2,0,6,1,77,0,52,0,25,7]中大于等于10的元素选出来,放入数组中
        //1、声明一个新的数组用于存放新数据newArr
        //2、遍历原来的旧数组,找出大于等于10的元素
        //3、依次追加新数组newArr。
        var arr = [2,0,6,1,77,0,52,0,25,7];
        var newArr = [];
        var j = 0;
        for (var i = 0; i < arr.length; i++){
            if(arr[i] > 10){
                //新数组应该从0开始,依次递增
                newArr[j] = arr [i];
                j++;
            }
        }
        console.log(newArr);
     //方法二:
        var arr = [2,0,6,1,77,0,52,0,25,7];
        var newArr = [];
        //刚开始newArr.length就是0
        for (var i = 0; i < arr.length; i++){
            if(arr[i] > 10){
                //新数组应该从0开始,依次递增
                newArr[newArr.length] = arr [i];
            }
        }
        console.log(newArr);
</script>

5、数组案例

<script>
        //删除指定数组元素
        //将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后,形成一个不包含0的新数组
        //①:需要一个新数组用于存放筛选之后的数据 
        //②:遍历原来的数组,把不是0的数据添加到新数组里面(此时注意采用数组名+索引的格式接收数据)
        //③:新数组里面的个数,用length不断累加
        var arr = [2,0,6,1,77,0,52,0,25,7];
        var newArr = [];
        for (var i = 0;i < arr.length;i++){
            if(arr[i] !=0){
                newArr[newArr.length]=arr[i];
            }
        }
        console.log(newArr);

        //翻转数组
        //将数组['red','green','blue','pink',purple]的内容反过来存放
        //输出:['purple','pink','blue','green','red']
        var arr=['red','green','blue','pink',purple];
        var newArr = [];
        for(var i = arr.length-1; i >= 0; i--){
            newArr[newArr.length] = arr[i];
        }
        console.log(newArr);
 </script>

6、(数组排序)冒泡排序

冒泡排序:是一种算法,把一系列的数据按照一定的顺序进行排列显示(从小到大或从大到小)

<script>
        //冒泡排序
        var arr = [5,4,3,2,1];
        for(var i = 0; i <= arr.length-1; i++){//外层循环管趟数
            for(var j = 0; j <= arr.length-i-1; j++){//里层循环管 每一趟的交换次数
                //内部交换两个变量的值 前一个和后一个数组元素相比较
                if(arr[j] > arr[j+1]){
                    var temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        console.log(arr);
 </script>

九、函数

1、函数的概念

<script>
        //1.求1~100的累加和
        var sum = 0;
        for(var i=1; i<=100; i++){
            sum += i;
        }
        console.log(sum);

        //2.求10~50的累加和
        var sum = 0;
        for (var i = 10; i <= 50; i++){
            sum += i;
        }
        console.log(sum);

        //3.函数  就是封装了一段可以被重复执行调用的代码块 目的:就是让大量代码重复使用
        function getSum(num1,num2) {
            var sum = 0;
            for (var i = num1; i <= num2; i++){
                sum += i;
            }
            console.log(sum);
        }
        getSum(1,100);
        getSum(10,50);
 </script>

2、函数的使用

  <script>
        //函数使用分为两步:声明函数 和 调用函数
        //1.声明函数
//          function 函数名(){
                //函数体
//          }

        function sayHi(){
            console.log('hi~');
        }
        //①:function 声明函数的关键字,全部小写
        //②:函数是做件某事,函数名一般是动词 sayHi
        //③:函数不调用自己不执行

        //2.调用函数
//      函数名();
        sayHi();
        //①:调用函数不要忘记加小括号
 </script>
<script>
    //利用函数计算1~100之间的累加和
       //1.声明函数
       function getSum() {
           var sum = 0;
           for (var i = 1;i <= 100; i++){
               sum += i;
           }
           console.log(sum);
       }
       //2.调用函数
       getSum();
</script>

 

3、函数的参数

<script>
        //1.函数可以重复相同的代码
        function cook (){
            console.log('酸辣土豆丝');
        }
        cook();
        cook();
    
        //2.我们可以利用函数的参数实现函数重复不同的代码
        function 函数名(形参1,形参2...) { //在声明函数的小括号里面是 形参(形式上的参数)

        }
        函数名(实参1,实参2...); //在函数调用的小括号里面是实参()实际的参数
    
        //3.形参和实参的执行过程
        function cook(aru) { //形参是接受实参的 aru = '鱼香肉丝' 形参类似于一个变量
            console.log(aru);
        }
        cook('鱼香肉丝');
        cook('糖醋里脊');
        //4.函数的参数可以有,也可以没有,个数不限
 </script>
 <script>
        //1.利用函数求任意两个数的和
        function getSum(num1, num2) {
            console.log(num1 + num2);
        }
        getSum(1, 3);
        getSum(3, 8);
        //2.利用函数求任意两个数之间的和
        function getSums(start, end){
            var sum = 0;
            for (var i = start; i <= end; i++){
                sum += i;
            }
            console.log(sum);
        }
        getSums(1, 100);
        getSums(1, 10);
        //3.注意点:① 多个参数之间用逗号隔开 ② 形参可以看作是不用声明的变量
 </script>
  <script>
        //函数形参实参个数匹配
        function getSum(num1, num2){
            console.log(num1 + num2);
        }
        //1.如果实参的个数和形参的个数一致,则正常输出结果
        getSum(1, 2);
        //2.如果实参的个数多于形参的个数,会取到形参的个数
        getSum(1, 2, 3);
        //3.如果实参的个数小于形参的个数,多于的形参定义为undefined 最终的结果就是NaN
        //形参可以看作是不用声明的变量 num2 是一个变量但没有接收值 结果就是undefined
        getSum(1);//NaN
 </script>

4、函数的返回值

<script>
        //1.函数是做某件事或者实现某种功能
/*        function cook(aru) {
            console.log(aru);
        }
        cook('大肘子');
*/
        //2.函数返回值格式
/*        function 函数名() {
            return 需要返回的结果;
        }
        函数名();
*/
        //①:函数是实现某种功能,最终结果需要返回给函数的调用者函数名() 通过return 实现
        //②:只要函数遇到return 就把后面的结果返回给函数的调用者 函数名()=return后面的结果
        //3.代码验证
        function getResult(){
            return 666;
        }
        getResult(); //getResult()=666
        console.log(getResult());
        //1.中像以下这么写才对
        function cook(aru) {
            return aru;
        }
        console.log(cook('大肘子'));
     </script>
<script>
    //利用函数求任意两个数的最大值
        function getMax(num1, num2) {
            // if (num1 > num2){
            //     return num1;
            // } else {
            //     return num2;
            // }
            //或者
            return num1 > num2 ? num1 : num2;
        }
        console.log(getMax(1, 3));
        console.log(getMax(11, 3));
 </script>
<script>
    //利用函数求数组[5,2,99,101,67,77]中的最大数值
        function getArr(arr){
            var max = arr[0];
            for(var i = 1; i <= arr.length; i++){
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
            return max;
        }
       // getArrMax([5,2,99,101,67,77]);//实参是一个数组送过去  
       //实际开发中采取以下格式,经常用一个变量来接收 函数返回结果,使用更简单
       var re = getArrMax([5,2,99,101,67,77]);
       console.log(re);
</script>

 

return终止函数

<script>
//函数返回值注意事项
//1.return 终止函数
function getSum(num1, num2){
      return num1 + num2;
      alert('我是不会被执行的');//return后面的代码不会被执行
}
console.log(getSum(1,2));
    
//2.return只能返回一个值
    function fn(num1,num2){
        return num1,num2;//返回结果是最后一个值
    }
    console.log(fn(1,2));
    
    //3.我们求任意两个数的加减乘除结果
    function getResult(num1,num2){
         return [num1+num2,num1-num2,num1*num2,num1/num2];
    }
    var re=getResult(1,2);//返回的是一个数组
    console.log(re);
    
    //4.我们的函数如果有return则返回的是return 后面的值,如果函数没有return则返回undefined
    function fun1(){
        return 666;
    }
    console.log(fun1());//返回666
    function fun2(){
        
    }
    console.log(fun2());//没有return函数返回undefined
</script>

5、arguments的使用

<script>
        //arguments的使用  只有函数才有arguments对象 而且是每个函数都内置好了这个arguments
        function fn(){
            console.log(arguments);  //里面存储了所有传递过来的实参
            console.log(arguments.length);
            console.log(arguments[2]);
            //我们可以按照数组的方式遍历arguments
            for(var i=0; i< arguments.length; i++){
                console.log(arguments[i]);
            }
        }
        fn(1,2,3);
        fn(1, 2, 3, 4, 5);
        //伪数组 并不是真正意义上的数组
        //1.具有数组的length属性
        //2.按照索引的方式进行存储
        //3.没有真正数组的一些方法 pop() push()等
 </script>
<script>
        //利用函数求任意个数的最大值
        function getMax(){
            var max = arguments[0];
            for(var i = 1; i < arguments.length; i++){
                if (arguments[i] > max) {
                    max = arguments[i];
                }
            }
            return max;
        }
        console.log(getMax(1, 2, 3));
        console.log(getMax(1, 2, 3, 4));
        console.log(getMax(11, 2, 34, 44, 5, 100));
 </script>

6、函数案例

利用函数翻转任意数组

<script>
        //利用函数翻转任意数组
        function reverse(arr) {
            var newArr = [];
            for (var i = arr.length-1; i >= 0; i--){
                newArr[newArr.length] = arr[i];
            }
            return newArr;
        }
        var arr1 = reverse([1, 2, 3, 4, 5]);
        console.log(arr1);
        var arr2 = reverse([2, 5, 4, 7, 1]);
        console.log(arr2);
 </script>

利用函数对数组排序 

<script>
    //利用函数封装的方式,对数组排序--冒泡排序
        function sort(arr) {
            for (var i = 0; i < arr.length-1; i++){
                for(var j = 0; j < arr.length - i -1; j++){
                    if(arr[j] > arr[j + 1]){
                        var temp=arr[j+1];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
            }
            return arr;
        }
        var arr1 = sort ([1, 4, 2, 9]);
        console.log(arr1);
        var arr2 = sort([11, 3, 1, 999]);
        console.log(arr2);
</script>

 判断闰年

<script>
    //判断闰年
        function isRunYear(year){
            //如果是闰年返回true否则返回false
            var flag = false;
            if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
                flag = true;
            }
            return flag;
        }
        console.log(isRunYear(2000));
        console.log(isRunYear(1999));
</script>

7、函数的两种声明方式

<script>
        //函数的2种声明方式
        //1.利用函数关键字自定义函数(命名函数)
        function fn(){

        }
        fn();
        //2.函数表达式(匿名函数)
        // var 变量名 = function(){};
        var fun = function(){
            console.log('我是函数表达式');
        }
        fun();
        //①:fun是变量名 不是函数名
        //②:函数表达式声明方式跟声明变量差不多,只不过变量里面存的是值而函数表达式里面存的是函数
        //③:函数表达式也可以进行传递参数
 </script>

十、JavaScript作用域

1、作用域

 <script>
        //1.javaScript作用域:就是代码名字在某个(变量)范围内其作用和效果,目的:提高程序的可靠性,减少命名冲突
        //2.js的作用域(es6)之前:全局作用域   局部作用域
        
        //3.全局作用域:整个script标签  或者是一个单独的js文件
        var num = 10;
        
        //4.局部作用域:在函数内部的,只在函数内部其效果和作用的
        function fn(){
            //局部作用域
            var num = 20;
            console.log(num);
        }
        fn();
 </script>

2、变量的作用域

 <script>
        //变量的作用域:根据作用域的不同,变量分为全局变量和局部变量
        //1.全局变量:在全局作用域下的变量 在全局下都可以使用
        //注意:如果在函数内部没有声明直接赋值的变量也属于全局变量
        var num = 10; //num就是一个全局变量
        console.log(num);

        function fn() {
            console.log(num);
        }
        fn();
        //2.局部变量 在局部作用域下的变量 后者在函数内部的变量就是 局部变量
        //注意:函数的形参也可以看做是局部变量
        function fun() {
            var num1 = 10; // num1就是全局变量 只能在函数内部使用
            num2 = 20;
        }
        fun();
        console.log(num1);

        //3.从执行效率来看全局变量和局部变量
        //(1)全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
        //(2)局部变量 当我们程序执行完毕就会销毁
 </script>
js中没有块级作用域  js作用域:全局作用域  局部作用域

3、作用域链

<script>
        //作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式决定取哪个值  就近原则
        var num = 10;

        function fn() {  //外部函数
            var num = 20;

            function fun() {  //内部函数
                console.log(num);
            }
            fun();
        }
        fn();
 </script>

十一、JavaScript与解析

1、预解析

<script>
        //1问
        console.log(num);

        //2问
        console.log(num);
        var num = 10; // undefined  坑1
        //相当于执行了以下代码 先进行预解析
        // var num;
        // console.log(num);
        // num=10;

        //3问
        fn();
        function fn() {
            console.log(11);
        }

        //4问
        fun();  //报错 坑2
        var fun = function() {
            console.log(22);
        }
        //函数表达式 调用必须写在函数表达式的下面
        //首先预解析再进行代码执行,相当于执行了以下代码
        var fun;
        fun();
        fun = function(){
            console.log(22);
        }

        //1.js引擎运行js分两步:预解析  代码执行
        //①:预解析 js 引擎会把js里面所有的var 还有function 提升到当前作用域的最前面
        //②:代码执行 按照代码书写的顺序从上往下执行
        //2.预解析分为 变量预解析(变量提升)和函数预解析(函数提升)
        //①:变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
        //②:函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
 </script>

2、变量预解析和函数预解析

十二、JS对象

1、对象

在JS中,对象是一组无序的相关属性和方法的集合,所有事物都是对象,例如字符串、数值、数组、函数等。

对象由属性和方法组成。属性:事物的特征 方法:事物的行为

2、创建对象的三种方式

在JS中,采用三种方式创建对象(object) 利用字面量创建对象 利用new Object创建对象 利用构造函数创建对象

 <script>
     对象的字面量:就是花括号{ }里面包含了表达这个具体事物(对象)的属性和方法
        //1.利用对象字面量创建对象 {}
        var obj = {};//创建了一个空的对象
        var obj = {
            uname:'易烊千玺',
            age:21,
            sex:'男',
            sayHi:function() {
                console.log('hi');
            }
        }
        //(1)里面的属性或者方法采取键值对的形式 键 属性名:值 属性值
        //(2)多个属性或者方法中间用逗号隔开的形式
        //(3)方法冒号后面跟的是一个匿名函数
        //2.使用对象
        //(1)调用对象的属性  采取  对象名.属性名
        console.log(obj.uname);
        //(2)调用属性的第二种方法 对象名['属性名']
        console.log(obj['age']);
        //(3)调用对象的方法 对象名.方法名()  不要忘记添加小括号
        obj.sayHi();
 </script>

变量、属性、函数、方法的区别 1、变量和属性的相同:都是用来存储数据的 变量:单独声明并赋值,使用的时候直接写变量名,单独存在。 属性:在对象里面的不需要声明,使用的时候必须是 对象.属性 2、函数和方法的相同点:都是实现某种功能,做某件事 函数是单独声明,并且调用的 函数名( ) 单独存在 方法 在对象里面 调用的时候 对象.方法( )

<script>
        //利用new Object创建对象
        var obj = new Object(); //创建了一个空的对象
        obj.uname = '陈飞宇';
        obj.age = 20;
        obj.sex = '男';
        obj.sayHi = function() {
            console.log('hi~');
        }
        //(1)利用等号= 赋值的方法 添加对象的属性和方法
        //(2)每个属性和方法之间用分号结束
 </script>
<script>
        //利用构造函数创建对象
        //创建四大天王的对象
        //构造函数的语法格式
/*        function 构造函数名() {
            this.属性 = 值;
            this.方法 = function() {}
        }
        new 构造函数名();
*/
        function Star(uname, age, sex) {
            this.name = uname;
            this.age = age;
            this.sex = sex;
            this.sing = function() {}
            console.log();
        }
        var ldh = new Star('刘德华',18,'男');//调用对象返回的是一个对象
        console.log(ldh.name);
        lde.sing('冰雨');
        //(1)构造函数名首字母大写
        //(2)构造函数不需要return 就可以返回结果
        //(3)要用构造函数必须使用new
        //(4)只要new Star() 调用函数就创建一个对象 lde{}
        //(5)我们的属性和方法前必须加this    
 </script>
构造函数和对象:
构造函数,如Star(),抽象了对象的公共部分,封装到了函数里面,它泛指某一大类(class)
创建对象,如new Stars(),特指某一个,通过new关键字创建对象的过程我们也称为对象的实例化

3、new关键字

<script>
        //new关键字的使用
        //1.new构造函数可以在内存中创建一个空的对象
        //2.this 就会指向刚才创建的空的对象
        //3.执行构造函数里面的代码,给这个空对象添加属性和方法
        //4.返回这个对象
        function Star() {
            this.name = uname;
            this.age = age;
            this.sex = sex;
            this.sing = function(sang) {
                console.log(sang);
            }
        }
        var ldh = new star('刘德华', 18, '男');
 </script>

4、遍历对象属性

 <script>
        //遍历对象
        var obj = {
            name:'英语老师',
            age:18,
            sex:'男'
        }
        console.log(obj.name);
        console.log(obj.age);
        console.log(obj.sex);
        //for in 遍历对象
/*        for (变量 in 对象) {

        }
*/
        for (var k in obj) {
            console.log(k); //k 变量 输出 得到的是 属性名
            console.log(obj[k]); //obj[k] 得到的是 属性值
        }
        //使用for in 里面的变量 喜欢写k 或者 key
 </script>

十三、JS内置对象

1、内置对象

js种对象分3种:自定义对象、内置对象、浏览器对象

内置对象就是指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)

内置对象最大的优点就是帮助我们快速开发

JS提供了多个内置对象:Math、Date、Array、String等

2、查文档

学习一个内置对象的使用,只要学会其常用成员的使用即可,我们可以通过查文档学习,可以通过MDN/W3C来查询。Mozilla开发者网络(MDN)提供了有关开放网络技术(Open Web)的信息,包括HTML、CSS和万维网及HTML5应用的API。

3、Math对象

<script>
        //Math数学对象 不是一个构造函数,所以我们不需要new来调用,而是直接使用里面的属性和方法即可
        console.log(Math.PI); //一个属性  圆周率
        console.log(Math.max(1,33,0,2)); //33
        console.log(Math.max(-1,-2,-9)); //-1
        console.log(Math.max(1,99,'拉萨')); //NaN
        console.log(Math.max()); //-Infinity
 </script>
<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) {

                    }
                }
                return max;
            },
            min:function() {
                var max = arguments[0];
                for (var i = 1; i < arguments.length; i++){
                    if (arguments[i] > max) {

                    }
            }
            return min;
        } 
    }
    console.log(myMath.PI);
    console.log(myMath.max(1,5,9));
    console.log(myMath.min(1,5,9));
 </script>
//==========================================
<script>
    //1.绝对值方法
    console.log(Math.abs(1));//1
    console.log(Math.abs(-1));//1
    console.log(Math.abs('1'));隐式转换 会把字符串-1转换伪数字型
    console.log(Math.abs('pink'));//NaN
    //2.三个取整方法
    //(1)Math.floor()  向下取整 往最小了取值
    console.log(Math.floor(1.1));//1
    console.log(Math.floor(1.9));//1
    //(2)Math.ceil()  向上取整  往大了取值
    console.log(Math.ceil(1.1));//2
    console.log(Math.ceil(1.9));//2
    //(3) Math.round()  四舍五入
    console.log(Math.round(1.1));//1
    console.log(Math.round(1.5));//2
    console.log(Math.round(1.9));//2
    console.log(Math.round(-1.1));//-1
    console.log(Math.round(-1.5));//-1 其他数字都是四舍五入,但是 .5 特殊 它往大了取
</script>

随机数方法random( )

<script>
    //1.Math对象随机数方法 random() 返回一个随机的小数 0 =< x <1
    //2.这个方法里面不跟参数
    //3.代码验证
    console.log(Math.random());
    //4.我们想要得到两个数之间的随机数 并且 包含这2个整数
    //Math.floor(Math.random() * (max - min + 1)) + min
    function getRandom(min, max) {
       return  Math.floor(Math.random() * (max - min + 1)) + min
    }
    console.log(getRandom(1,10));
    //5.随机点名
    var arr = ['张三' ,'李四' ,'王五'];
    //console.log(arr[0]);
    console.log(arr[getRandom(0, arr.length-1)]);
</script>

4、日期对象

Date概述 Date对象和Math对象不一样,它是一个构造函数,需要实例化后才能使用。 Date实例后用来处理日期和时间

<script>
        //Date() 日期对象 是一个构造函数 必须使用new 来调用创建我们的日期对象
        var arr = new Array(); //创建一个数组对象
        var obj = new Object(); //创建了一个对象实例
        //1.使用Date 如果没有参数,返回当前系统的当前时间
        var date = new Date();
        console.log(date);
        //2.参数常用的写法 数字型 2019, 10, 01  或者是 字符串型'2019-10-1 8:8:8'
        var date1 = new Date(2019, 10, 1);
        console.log(date1); //返回的是11月 不是10月
        var date2 = new Date('2019-10-1 8:8:8');
        console.log(date2);
 </script>
 <script>
        //格式化日期 年月日
/*        var date = new Date();
        console.log(date.getFullYear()); //返回当前日期的年  
        console.log(date.getMonth() + 1); //月份 返回当前月份小1个月  记得月份+1
        console.log(date.getDate()); //返回的是几号
        console.log(date.getDay()); //周一返回的是 1 周六返回的是6 但是周日返回的是0
*/
        //写一个2022年1月25日 星期二
        var date = new Date();
        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]);
     
      //格式化 时分秒
        var date = new Date();
        console.log(date.getHours()); //时
        console.log(date.getMinutes()); //分
        console.log(date.getSeconds()); //秒
        //要求封装一个函数返回当前的时分秒 格式08:08:08
        function getTime() {
            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(getTime());
     
     //获得Date总的毫秒数 不是当前时间的毫秒数 而是距离1970年1月1号过了多少毫秒数
        //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新增的 获得总的毫秒数
        console.log(Date.now());
 </script>
 <script>
     //倒计时案例
    //案例分析
    //①:核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时,但是不能拿着时分秒相减,比如05分减去25分,结果会是负数
    //②:用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数。
    //③:把剩余时间总的毫秒数转换为天、时、分、秒(时间戳转换为时分秒)
    function countDown(time) {
        var nowTime = +new Date(); //返回的是当前时间总的毫秒数
        var inputTime = +new Date(time); //返回的是用户输入时间总的毫秒数
        var times = (inputTime - nowTime) / 1000; //time是剩余时间总的秒数
        //var d = parseInt(总秒数/60/60/24);
        var d = parseInt(times / 60 / 60 / 24); //天
        d = d < 10 ? '0' + d : d;
        var h = parseInt(times / 60 / 60 % 24); //时
        d = h < 10 ? '0' + h : h;
        var m = parseInt(times / 60 % 60); //分
        d = m < 10 ? '0' + m : m;
        var s = parseInt(times % 60 ); //秒
        d = s < 10 ? '0' + s : s;
        return d + '天' + h +'时' + m + '分' + s + '秒';
    }
    console.log(countDown('2019-5-1 18:00:00'));
    var date = new Date();
    console.log(date);
 </script>

5、数组对象

 <script>
        //创建数组的两种方式
        //1.利用数组字面量
        var arr = [1, 2, 3];
        console.log(arr[0]);
        //2.利用new Array()
        var arr1 = new Array(); //创建了一个空的数组
        var arr1 = new Array(2); //这个2表示 数组的长度为2 里面有2个空的数组元素
        var arr1 = new Array(2, 3); //等价于[2, 3]这样写表示里面有2个数组元素 是2和3
        console.log(arr1);
 </script>
 <script>
 //翻转数组
        function reverse(arr) {
            if(arr instanceof Array) {
                var newArray = [];
                for (var i = arr.length-1; i>=0; i--){
                    newArr[newArr.length] = arr[i];
                }
                return newArr;
            }else {
                return 'error 这个参数要求必须是数组格式[1, 2, 3]'
            }
        }
        console.log(reverse([1, 2, 3]));
        console.log(reverse(1,2,3));
        //检测是否为数组
        //(1)instanceof 运算符 可以用来检测是否为数组
        var arr = [];
        var obj = {};
        console.log(arr instanceof Array);
        console.log(obj instanceof Array);
        //(2)Array.isArray(参数)  H5新增的方法,ie9以上版本支持
        console.log(Array.isArray(arr));
        console.log(Array.isArray(obj));
    </script>
<script>
        //添加删除数组元素方法
        //1.push()在数组末尾添加一个或者多个数组元素 push 推
        var arr = [1, 2, 3];
        //arr.push(4, 'pink');
        console.log(arr.push(4, 'pink'));
        console.log(arr);
        //(1)push 是可以给数组追加新的元素
        //(2)push() 参数直接写 数组元素就可以了
        //(3) push完毕之后 返回的结果是新数组的长度
        //(4) 原数组也会发生变化

        //2. unshift() 在数组的开头 添加一个或多个数组元素
        console.log(arr.unshift('red', 'blue'));  //arr.unshift('red', 'blue');
        console.log(arr);
        //(1)unshift是可以给数组前面追加新的元素
        //(2)unshift() 参数直接写 数组元素就可以了
        //(3)unshift完毕后 返回的结果是新数组的长度
        //(4)原数组也会发生变化
    
        //3. pop() 删除数组的最后一个元素
        //arr.pop();
        console.log(arr.pop());
        console.log(arr);
        //(1)pop是可以给删除数组的最后一个元素,一次只能删除一个元素
        //(2)pop() 没有参数
        //(3)pop完毕后 返回的结果是删除的那个元素
        //(4)原数组也会发生变化

        //4. shift() 可以删除数组的第一个元素
        console.log(arr.shift());
        console.log(arr);
        //(1)shift是可以给删除数组的第一个元素,一次只能删除一个元素
        //(2)shift() 没有参数
        //(3)shift完毕后 返回的结果是删除的那个元素
        //(4)原数组也会发生变化
    </script>
 <script>
        //筛选数组 有一个包含工资的数组[1500,1200,2100,1800],
        //要求把数组中工资超过2000的删除,剩余的放到新的数组里面
        var arr = [1500,1200,2100,1800];
        for (var i = 0; i < arr.length; i++){
            if(arr[i] < 2000) {
               // newArr[newArr.length] = arr[i];  或者
               newArr.push(arr[i]);
            }
        }
        console.log(newArr);
 </script>
<script>
        //数组排序
        //1.翻转数组
        var arr = ['pink', 'red', 'blue'];
        arr.reverse();
        console.log(arr);
         
        //2.数组排序(冒泡排序)
        // var arr1 = [3, 4, 7,1];
       //arr1.sort();
        var arr1 = [13, 4, 77, 1, 7];
        arr1.sort(function(a, b){
         //   return a - b; 升序的顺序排列
              return b - a; //降序的顺序排列
        });
        console.log(arr1);

        //返回数组元素索引号方法  indexOf(数组元素) 作用返回该数组元素的索引号  从前面开始查找
        //它只返回第一个满足条件的索引号
        //它如果在该数组里面找不到元素,则返回的是-1  例:var arr = ['red','green','pink'];  //-1
        var arr = ['red', 'green', 'blue', 'pink'];
        console.log(arr.lastIndexOf('blue'));
        //返回数组元素索引号方法  indexOf(数组元素) 作用返回该数组元素的索引号 从后面开始查找
        var arr = ['red', 'green', 'blue', 'pink'];
        console.log(arr.lastIndexOf('blue')); //4
    </script>
 <script>
        //数组去重['c','a','z','a','x','a','x','c','b']要求去除数组中重复的元素。
        //1.目标:把旧数组里面不重复的元素选取出来放到新数组中,重复的元素只保留一个,放到新数组中去重。
        //2.核心算法:我们遍历旧数组,然后拿着旧数组元素查询新数组,如果该元素在新数组里面没有出现过,我们就添加,否则不添加。
        //3.我们怎么知道该元素没有存在? 利用 新数组 .indexOf(数组元素)如果返回是-1 就说明新数组里面没有该元素
        //封装一个去重的函数 unique 
        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);
 </script>
 <script>
        //数组转换为字符串
        //1.toStrig() 将我们的数组转换为字符串
        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>

6、字符串对象

<script>
        //基本包装类型
        var str = 'andy';
        console.log(str.length);
        //对象 才有 属性和方法 复杂数据类型才有 属性和方法
        //简单数据类型为什么会有length属性呢?
        //基本包装类型:就是把简单数据类型 包装为复杂数据类型
        //(1)把简单数据类型包装称为复杂数据类型
        var temp = new String('andy');
        //(2)把临时变量的值给str
        str = temp;
        //(3)销毁这个临时变量
        temp = null;
 </script>
 <script>
        //查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
        //核心算法:选查找第一个o出现的位置
        //然后只要indexof返回的结果不是-1就继续往后查找
        //因为indexOf只能查找到第一个,所以后面的查找,一定是当前索引加1,从而继续查找
        var str = "abcoefoxyozzopp";
        var index = str.indexOf('o');
        var num = 0;
        //console.log(index);
        while(index !== -1){
            console.log(index);
            num++;
            index = str.indexOf('o',index + 1);
        }
        console.log('o出现的次数是:' + num); 
 </script>
<script>
        //根据位置返回字符
        //(1)charAt(index) 根据位置返回字符
        var str = 'andy';
        console.log(str.charAt(3));
        //遍历所有的字符
        for(var i = 0;i<str.length;i++){
            console.log(str.charAt(i));
        }
        //(2)charCodeAt(index) 返回相应索引号的字符ASCII值,目的:判断用户按下哪个键
        console.log(str.charCodeAt(0)); //97
        //(3)str[index] H5新增的
        console.log(str[0]); //a
    </script>
<script>
        //字符串操作方法
        //1.concat('字符串1', '字符串2'...)
        var str = 'andy';
        console.log(str.concat('red'));
        //2.substr('截取的起始位置', '截取几个字符')
        var str1 = '改革春风吹满地';
        console.log(str1.substr(2,2));//第一个2是索引号2   第二个2是取几个字符

        //替换字符replace('被替换的字符','替换为的字符') 它只会替换第一个字符
        var str = 'andyandy';
        console.log(str.replace('a', 'b'));
        //有一个字符串'abcoefoxyozzopp'要求把里面所有的o替换为*
        var str1 = 'abcoefoxyozzopp';
        while (str1.indexOf('o') !== -1){
            str1 = str1.replace('o', '*');
        }

        //字符转换为数组 split('分隔符') 前面学过join把数组转换为字符串
        var str2 = 'red, pink, blue';
        console.log(str2.split(','));
        var str3 = 'red&pink&blue';
        console.log(str3.split('&'));

 </script>

十四、JS中的简单数据类型和复杂数据类型

1、简单类型与复杂类型

简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型 值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型 如:string,number,boolean,undefined,null 引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型 通过new关键字创建的对象(系统对象,自定义对象)如Object,Array,Date等

2、堆和栈

堆栈空间分配区别:

1、栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈 简单数据类型存放到栈里面 2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收 复杂数据类型存放到堆里面

3、简单类型的内存分配

//1.简单数据类型 是存放在栈里面 里面直接开辟一个空间存放的是值

4、复杂类型的内存分配

//2.复杂数据类型 首先在栈里面存放地址 十六进制表示 然后这个地址指向堆里面的数据

5、简单类型传参

6、复杂类型传参

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值