JavaScript基础知识

目录

一、基本语法模块

1.helloworld编写

2.JS的编写位置

3.注释,字面量,关键字和变量

4.JS六种数据类型

5.强制类型转换

 6.逻辑运算

7. 相等运算符

 8.Unicode编码

8.条件运算符

 9.代码块

10. if条件判断语句

 11.switch条件分支语句

 12.while和for循环

13.对象基本概念 

14.基本和引用数据类型的空间存储

15.对象的字面量

16.函数的创建

17.函数的参数以及返回值

18.立即执行函数

19.方法

20.全局作用域和函数作用域

21.this

22.工厂方法创建对象

23.构造函数

24.原型对象

 25.toString()

26.垃圾回收

27.数组的创建

28.数组的四种常用增删方法

29.数组的遍历

30.数组方法splice和slice

31.数组的其他方法

32.call和apply

33.arguments

34.Date对象

35.Math对象

36.包装类

37.字符串方法

38. 异步js​​​​​​​


一、基本语法模块

1.helloworld编写

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- JS代码 -->
    <script type="text/javascript">
        //控制浏览器弹出一个警告框
        alert("hello world");
        // 在页面中输出一个内容,相当于在body写
        document.write("hello");
        // 向控制台输出一个内容
        console.log("hello");
    </script>

</head>
<body>
    
</body>
</html>

2.JS的编写位置

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>

    <!-- 1. 写在外部表js文件中 -->
    <script type="text/javascript" src="./test.js">
        // 此句被忽略,script标签一旦引入外部文件,内部就不能再写代码了,写了也会被忽略,如需编写内部,可再新建script标签
        alert('hi');
    </script>

    <!-- 2. 写在script标签中 -->
    <script>
        alert('我是script标签中代码')
    </script>
</head>
<body>

    <!-- 写在属性中不方便维护 -->
    <!-- 3. 将JS代码写在元素的onclik属性中 -->
    <button onclick="alert('点我干嘛');">点我</button>
    <!-- 3.将JS写在超链接的href属性中 -->
    <a href="javascript:alert('又干嘛');">再点我</a>
</body>
</html>

3.注释,字面量,关键字和变量

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        /*
        多行注释
        */
    //    单行注释

    // 1.JS严格区分大小写
    // 2.每条语句后有分号;
    // 3.js忽略空格和换行


    // 1.JS的字面量:一些不可以改变的值
    // 2.变量:用于保存字面量且可以改变
    // 3.声明变量:用var关键字来声明 + 赋值变量
    var a=1;
    console.log(a);


    //标识符
    // 1.在JS中可以由我们自主命名的
    // 2.要求:包含字母,数字,下划线,$; 不能以数字开头; 不能是关键字或者保留字
    // 3.一般都采用驼峰命名法,首字母小写,其余单词首字母大写,其余小写:helloWorld
    // 4.JS底层保存的标识符采用Unicode编码,
    </script>
</head>
<body>
</body>
</html>

4.JS六种数据类型

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        /*六种数据类型
        String 字符串
        Number 数值
        Boolean 布尔值
        Null 空值
        Undefined 未定义
        Object 对象

        前五个为基本数据类型,最后为引用数据类型
*/


        // String字符串
        var str="hello";//字符串用引号,单引号或者双引号不混用
        str="nice!"//内部不要由多个引号,不能引号嵌套
        //可以使用\作为转义字符
        str="我说\"hello\"";
        alert(str);



        //Number 数值
        //1.JS中所有的数值:整数,浮点数都是Number类型
        var a=123;
        var b="123"
        alert(a);
        alert(b);
        //如何区分?如何获取变量类型?:typeof
        alert(typeof b);

        // 2. JS中可以表示的数值最大值
        a=Number.MAX_VALUE;
        //如果超过最大值,则输出:Infinity正无穷,-Infinity负无穷
        alert(a*a);
        // 最小值
        a=Number.MIN_VALUE;

        //3.NaN是一种特殊字符,使用typeof检查NaN返回Number,表示Not a Number
        a=NaN;

        //4.在JS中整数运算基本精确
        //浮点数可能不精确,所以尽量不要用JS进行精确计算
        alert(0.1+0.2);



        //Boolean布尔值:true/false



        //Null类型的值只有一个:Null,表示为空的对象
        //使用typeof检查Null返回object,所以Null表示空对象


        //Undefined表示声明了但没有赋值,使用typeof检查Undefined返回Undefined
    </script>
</head>
<body>
    
</body>
</html>

5.强制类型转换

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //类型转换主要是指建其余类型转为String Number Boolean

        //1.转换为String类型:
            // a.调用被转换数据类型的toString()方法。但是null和Undefined没有toString方法
            var a=123;
            console.log(typeof a);

            var b=a.toString();
            console.log(typeof b);

            a=true;
            a=a.toString();
            console.log(typeof a);

            // b.调用String函数转换
            var c=123;
            c=String(c);
            console.log(typeof c);

            var d=true;
            d=String(d);
            console.log(typeof d);

        //2.转换为Number类型
            //a.使用Number()函数
                // String->Number
                    //如果是纯数字的字符串转为数字
                    //如果含有非数字内容,转为NaN
                    // 如果是空串或者全是空格,转为0
                //Boolean->Number
                    //true=1,false=0
                //Undefined->Number:NaN
                //null->Number:0

            var q="123";
            q=Number(q);
            console.log(typeof q);

            // b.专门针对字符串
            //parseInt(),parseFloat()
            var z="123px";
            z=parseInt(z);//提取字符串中的有效整数
            console.log(z);
            var z="123.987px";
            z=parseFloat(z);
            console.log(z);
            // 对于非STring类型使用parseInt parseFloat 则会先转为字符串


        // 3.转换为Boolean
                // 使用Boolean()函数
                var a=13;
                a=Boolean(a);
                console.log(a);
                //Number->Boolean:除了0和NaN,其余转为true
                // Stringp->Boolean:除了空串,起源于均为true
                // null和Undefined都转为false

    </script>
</head>
<body>  
</body>
</html>

 6.逻辑运算

<!-- 
与:||
或:&&
非:!
 -->
 <!DOCTYPE html>
 <html lang="zh-CN">
 <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>

        //如果第一个值为false返回false, 如果第一个值为true,返回第二个
        var s=1 && 2;//先转换为Boolean,再进行逻辑运算
        console.log(s,typeof s);//s是Number s=2

         var s=0 && 1;//true和false返回false

         var q=NaN && 0;//两个false返回前一个false
         console.log(q,typeof q);

        //  || 如果第一个值为true返回第一个,如果第一个值为false直接返回第二个。
    </script>
 </head>
 <body>
    
 </body>
 </html>

7. 相等运算符

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
         console.log("1"==1);//true,类型不同会自动类型转换
         console.log(true=="1");//true,均转为了Number类型
         //Undefined衍生自null
         console.log(undefined==null);
        //  NaN不和任何值相等,包括自己
        console.log(NaN==NaN);
        // 判断NaN
        var b=NaN;
        console.log(isNaN(b));

        //全等运算===,!==
        //不会做自动类型转换,如果类型不同,直接返回false
        console.log(1==="1");
    </script>
</head>
<body>

 8.Unicode编码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        // 在字符串中输出unicode编码,使用\u转义字符,\u十六进制
        console.log("\uC100");
    </script>
</head>
<body>
    <!-- 网页中使用编码:&#十进制编码 编码使用十进制-->
    <div>&#9856;</div>
</body>
</html>

8.条件运算符

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        // 先求问号之前的真值,为真则返回:之前的语句,为假则返回:之后的语句
        true?alert(1):alert(2);
        1>2?alert(1):alert(2);
    </script>
</head>
<body>
</body>
</html>

 9.代码块

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        // 使用{}包裹,只起到分组作用,并不代表变量的作用域
        {
            alert(1);
            alert(2);
        }
        {
            alert(1);
            alert(2);
        }

    </script>
</head>
<body>
    
</body>
</html>

10. if条件判断语句

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //条件判断语句if
        /*
        if(条件表达式)
           语句
        */
       //不加大括号,仅仅对if后的一条语句有效、

       //1.if语句
       if(10>20){
            alert("hello");
            alert("hi");
        }

        //2.if...else...语句
       if(10>20){
            alert("hello");
            alert("hi");
        }
        else{
            alert("apple");
        }

        //if()...else if()....else if()....else..语句
        var a=10;
        if(a>30){alert(30);}
        else if(a>20){alert(2);}
        else if(a>10){alert(10);}
        else alert(0);

//if语句练习:

    var score=prompt("请输入成绩");//prompt函数用于用户输入
    if(score>90)alert("优秀");
    else if(score>80)alert("良好");
    else alert("不及格");
   
    </script>
</head>
<body>
</body>
</html>

 11.switch条件分支语句

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>

        /*
        switch(条件表达式1){
            case 表达式2:
            语句
            case 表达式3:
            语句
            default:
            语句
            break;
        }
        */
       //表达式1依次与case后的表达式做全等运算
       //结果为false:继续比较
       //结果为true: case后每个case后的语句都会执行
       //可以在每一个case后的语句中加break;保证只执行一条语句

//不加break
        var num=2;
        switch(num){
            case 1:
                alert(1);
            case 2:
                alert(2);
            case 3:
                alert(3);
            default:
                alert("不知道");
                break;
        }

//加break
        num=3;
        switch(num){
            case 1:
                alert(1);
                break;
            case 2:
                alert(2);
                break;
            case 3:
                alert(3);
                break;
            default:
                alert("不知道");
                break;
        }
        
        
    </script>
</head>
<body>
    
</body>
</html>

 12.while和for循环

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>

        // while循环
        var n=1;
        while(n<10){
            n++;
        }
        // for循环
        alert(n);
        for(var a=0;a<10;a++){//for(初始化;条件;更新)
            a++;
        }
        alert(a);
    </script>
</head>
<body>
    
</body>
</html>

13.对象基本概念 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //对象简介:
        //5中基本数据类型,一种引用数据类型为object
        //对象:复合数据类型
        //对象的分类:
            //1.内建对象:由ES标准中定义的对象,例如:Number,Boolean
            //2.宿主对象:由JS的运行环境提供的对象,例如:console,document
            //3.自建对象:由我们自己创建

        //创建对象
        /*
        使用new关键字调用的函数,constructer构造函数
        使用typeof 检查对象类型返回object
        */
        var obj=new Object()
        /*对象的属性即在对象中保存的值,
        对象.属性名=属性值
        */
       obj.name="孙悟空";//向对象中添加属性
       obj.gender="男";
       console.log(obj);
       console.log(obj.gender);//读取属性
       console.log(obj.age);//不存在的属性返回undefined
       obj.name="猪八戒";//修改属性值
       delete obj.name;//删除属性delete 对象.属性

       //对象的属性名不强制要求符合标识符的规范,任意命名都可以,但尽量遵守
       //如果使用特殊字符来命名,不要采用.的方式,采用obj[]的形式,如下:
       obj["123"]=23;
       console.log(obj[123]);

       //对象的属性值可以是任意值,也可以是一个对象
       var obj2=Object();
       obj.test=obj2;
       console.log(obj);
       console.log(obj2);
       //使用in来检查对象中是否含有某个属性
       console.log("gender" in obj);
    </script>
</head>
<body>
    
</body>
</html>

14.基本和引用数据类型的空间存储

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        /*
        JS中的变量都保存在栈内存中,var|value
            基本数据类型都在栈内存中,值与值之间相互独立

            对象保存在堆内存中,没创建一个对象会在堆中开辟一个新空间
            而变量保存的是对象的内存地址:obj|0x123,即对象的引用
            如果两个变量指向同一个对象地址,一个改变,则另一个对象变量的属性值也会改变

        
        */
       var obj1=new Object();
       obj1.name="he";
       var obj2=obj1;//变量obj1在栈内存的值是obj1对象在堆内存的地址,于是obj1和obj2指向同一个地址
       console.log(obj1.name);
       console.log(obj2.name);

       console.log(obj1);
       console.log(obj2);
       console.log(obj2==obj1);//true,两个对象的地址相同

       var obj3=new Object();
       var obj4=new Object();
       obj3.name="ha";
       obj4.name="ha";
       console.log(obj3==obj4);//false,两个对象的地址不相等

       //当比较两个基本数据类型时,就是比较值
       //当比较两个引用数据类型时,就是比较对象那个的内存地址
    </script>
</head>
<body>
    
</body>
</html>

15.对象的字面量

对象的字面量是一种JS创建对象的语法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        // 使用字面量来创建对象
        //方式一:语法:var obj={};属性单另添加
        var obj={};
        obj.name="孙悟空";
        console.log(obj);

        //方式二:语法:var obj={属性名:属性值,属性名:属性值...};
        //属性名引号可以加也可以不加,建议不加
        var obj2={
            name:"猪八戒",
            gender:"男",
            test:{name:"沙和尚"}
        };
        console.log(obj2);
    </script>
</head>
<body>
    
</body>
</html>

16.函数的创建

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //函数:也是一种对象
        //可以封装一些功能(代码),可以按照需要调用这些功能
         

        //函数的创建:

        //1.使用构造函数,创建一个函数对象,并分装一句代码
        var fun=new Function("console.log('hello');");
        console.log(typeof fun);
        //调用函数
        fun();

        //2.使用函数声明来创建一个函数
        //语法:
            //function 函数名(形参1,形参2...){
            //   语句;
            //  }
        function fun1(){
            alert("hello");
            console.log('fun1');
        }
        fun1();

        //3.使用函数表达式来创建一个函数
        //语法:var 函数名=function(形参1,形参2...){
            //   语句;
            //  }
        var fun3=function(){
            alert("fun3");
        }
        fun3();
    </script>
</head>
<body>
    
</body>
</html>

17.函数的参数以及返回值

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>

        //解析器不会检查实参的类型
        //解析器也不会检查多余形参,多余的不会被实参赋值
        //如果实参数目小于形参,则未被赋值的形参值为undefined
        //实参可以是任何值,包括对象,函数
        function fun(a,b){
            alert(a+b);
        }
        // fun(1,2);
        var obj={name:"孙悟空",gender:"男",age:"18"};

           //实参是函数
        function fun4(a){
            alert("a="+a);
        }
        //实参加了括号就是传函数的返回值
        //实参不加括号就是传函数的本身代码
        // fun4(fun1(1,2,3));
        // fun4(fun1);
        

        
        //没有return语句相当于return undefined
        //return 后可以返回任意类型的值
        function fun1(a,b,c){
            var d=a+b+c;
            return d;//return后的语句不再执行
        }
        // alert(fun1(1,2,3));

        //返回值是任意类型,包括函数
        function fun5(){
            function fun6(){
                alert("hi");
            }
            return fun6();
        }
        a=fun5();//函数的返回值是fun6(),因此在此处会先调用fun6,但是fun6的返回类型为undefined,
        alert( typeof a);
    
    </script>
</head>
<body>
    
</body>
</html>

18.立即执行函数

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //立即执行函数,在定义后直接执行
        (function(){
            alert("hello");
        })();

        //参数列表在结尾处
        (function(a,b){
            alert(a+b);
        })(1,2);
    </script>
</head>
<body>
    
</body>
</html>

19.方法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        var obj={
            a:"1",
            b:"2",
            fun1:function(){
                alert("hi");
            }
        }
        //函数作为对象属性:称它为该对象的方法
       obj.fun=function(a,b){
            alert(a+b);
        }
        // obj.fun(5,5);
        // console.log(obj.fun);

        // 枚举对象中的属性
        //使用for in语句,有几个属性,就循环几次
        //每次循环中,n是属性名,由于n是变量,需要用obj[n]来查看n的值
        for( var n in obj){
            console.log(n);//
            console.log(obj[n]);
        }
    </script>
</head>
<body>
    
</body>
</html>

20.全局作用域和函数作用域

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
              //JS中作用域有两种:全局作用域和函数作用域
        //1.全局作用域:
            //在页面打开时创建,在关闭时销毁
            //在全局作用域中,有一个全局对象window
            //在全局作用域中,创建的变量都是window对象的属性,函数都是window对象的方法

        //使用var关键字声明的变量,会在全部代码执行之前声明,但不会赋值。
        //函数声明形式:function fun(){}语句会在所有代码执行之前调用,var fun2=function(){}不会被
        a1();//调用成功
                 a2();//调用失败
                 console.log(a2);//undefined
                 function a1(){alert("a1");}
                 var a2=function(){alert("a2");}

        //2.函数作用域:
            //调用函数时创建函数作用域,函数执行完毕作用域销毁
            //每调用一次就会创建一个独立的函数作用域
            //函数作用域可以访问全局变量,反之不可以
            //当函数组偶用于中操作变量时,会优先在自身作用域中寻找,不存在则向上一级寻找,直到全局
            //在函数中也有var提前声明的规则
            //形参相当于在函数作用域用var声明


    </script>
</head>
<body>
    
</body>
</html>

21.this

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        // 解析器调用函数每次都会想函数内部传递一个隐藏的参数
        //根据函数调用的方式不同,this指向不同的对象
        function fun(a,b){
         console.log(this);
        }
        fun();//this是window,以函数形式调用,即window.fun()
        
        var obj={
            name:"mayu",
            fun1:fun
        }
        obj.fun1();//this为调用对象,以方法的形式调用函数

        var name="全局";
        function f1(){
            alert(name);
        }

        var obj1={
            name:"sun",
            sayname:f1
        }

        var obj2={
            name:"zhu",
            sayname:f1//注意:f1不加括号
        }

        //输出全为全局
        // obj1.sayname();
        // obj2.name();
        // f1();

        //修改原函数:
        function f1(){
            alert(this.name);
        }

        // 输出为各自的name
        console.log(f1);
        obj1.sayname();
        obj2.sayname();
        f1();
    </script>
</head>
<body>
    
</body>
</html>

22.工厂方法创建对象

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //工厂方法创建对象
        function createPerson(name,age){
            var obj=new Object();
            obj.name=name;
            obj.age=age;
            return obj;
        }
        var obj2=createPerson("张三",18);
        var obj3=createPerson("李四",17);
        console.log(obj2);
        console.log(obj3);
    </script>
</head>
<body>
    
</body>
</h

23.构造函数

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //构造函数习惯性首字母大写
        //就是一个普通函数,区别是调用方式不同,使用new关键字来调用,普通函数不使用new
        //执行流程:
            //1.一旦调用,立刻创建一个新对象
            //2.将新建的对象设置为this
            //3.逐行执行代码
            //4.将新建的对象返回

        //使用同一个构造函数创建的对象那个称为一类,这些对象的是实例
        function Person(name,age){
            this.name=name;
            this.age=age;
        }
        // var p1=new Person("张十三",19);
        // console.log(p1.age);
        // console.log(p1 instanceof Person);
        // console.log(p1 instanceof Object);//所有的对象都是Object的实例


        //修改构造函数
        //每执行一次,创建一个新的方法
        function Dog(name,age){
            this.name=name;
            this.age=age;
            this.sayname=function(){
                alert(this.name);
            }
        }
        var d1=new Dog("tom",1);
        var d2=new Dog("tina",2);
        // d1.sayname();
        // d2.sayname();
        alert(d1.sayname==d2.sayname);//fales
        
        //将函数定义在全局作用域中
        function sayname1(){
                alert(this.name);
            }
         alert(d1.sayname1==d2.sayname1);//true
    </script>
</head>
<body>
    
</body>
</html>

24.原型对象

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //原型:prototype
        //每个函数,解析器都会添加一个prototype属性
        //该属性对应一个对象,即原型对象
        //将函数作为普通函数调用,prototype没有作用

        //以构造函数形式调用,创建的对象中有一个隐含的属性
            //指向该构造函数的原型对象
        //相当于一个公共的区域,同一个类的实例都可以访问到,因此可以将共有的属性放在原型对象中
        //当访问对象那个的某个属性,陷在自身找,没有回在原型对象中寻找
        function myclass(){

        }
        var mc1=new myclass();
        var mc2=new myclass();
        //函数本身通过prototype访问,实例对象通过__proto__书信给访问原型对象
        console.log(myclass.prototype==mc1.__proto__);
        myclass.prototype.a=123;//公共属性a
        console.log(mc1.a,mc2.a);//123 123

        //使用in来检查对象中是否有某个属性,但会包括原型范围
        console.log("a" in mc1);//true
        console.log(mc1.hasOwnProperty("a"));//false,仅在自身查看
        console.log(mc1.hasOwnProperty("hasOwnProperty"));//false

        //原型对象也是对象,他也有原型对象
        console.log(mc1.__proto__.hasOwnProperty("hasOwnProperty"))//false
        console.log(mc1.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));//true
        console.log(mc1.__proto__.__proto__);//object,它没有原型
        console.log(mc1.__proto__.__proto__.__proto__);//null
    </script>
</head>
<body>
    
</body>
</html>

 25.toString()

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>  
    function Person(name,age){
        this.name=name;
        this.age=age;
    }
     var p1= new Person("zhangsna",18); 
     console.log(p1); 
     console.log(p1.toString()); //即直接输出p1
      
    p1.toString=function(){
        return "hahahh";
    }
    console.log(p1.toString()); //hahahh,但不改变原型
    var p2=new Person("zhu",19);

    //修改原型toString
    Person.prototype.toString=function(){
        return "我是"+this.name+",我"+this.age;
    }
    console.log(p2.toString());//输出修改后的
    </script>
</head>
<body>
    
</body>
</html>

26.垃圾回收

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        /*
        程序运行过程中产生的垃圾
        */
        function Person(name,age){
        this.name=name;
        this.age=age;
    }
        var obj=new Person();
        obj=null;//不指向堆内存任何地址,即为垃圾

        //JS中有自动的垃圾回收机制,不需要我们手动进行
        //我们需要的仅仅是将不需要的对象手动设置为null
        
    </script>
</head>
<body>
    
</body>
</html>

27.数组的创建

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //内建对象:由ES标砖定义

        //数组:也是对象,用于存储值,
            //普通对象使用字符串作为属性,数组用数字索引从0开始
            
        //创建数组对象
        var arr=new Array();
        // console.log(arr);
        //添加元素
        arr[0]=10;
        arr[1]=33;
        //读取
        // console.log(arr[1]);

        //获取数组长度(连续数组)
        // console.log(arr.length);//length是Array中的属性,不是方法
        // arr[10]=1;//非连续数组跳过中间索引,长度变为最大索引加一
        // console.log(arr.length);
        // console.log(arr);

        //修改length:小于原长,会删除多余的元素
        arr.length=10;
        //向数组最后一个位置添加元素
        arr[arr.length]=12;
        // console.log(arr);


        //数组字面量
        var arr1=[];
        // console.log(typeof arr1);
     
        var arr2=[1,2,3,4,5,6];
        // console.log(arr2);
        

        //构造函数
        var arr3=new Array(1,2,3);
        console.log(arr3);

        //
        var  arr4=new Array(10);//length=10
        console.log(arr4);

        //数组里的元素可以是任何数据类型
        var arr5=[10];//length=1
        console.log(arr5);
        arr5[1]="hello";
        arr5[2]=arr4;
        arr5[3]=true;
        arr5[4]=function(){alert(1);};
        console.log(arr5);

      
    </script>
</head>
<body>
    
</body>
</html>

28.数组的四种常用增删方法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        var arr1=new Array();
        //push(),在数组末尾添加一个或者多个元素,返回值为数组长度
        arr1.push(1);
        arr1.push("hi","hello");
        console.log(arr1,arr1.push(2));

        //pop(),删除最后一个元素,返回删除的元素
        arr1.pop();
        console.log(arr1,arr1.pop());

        //unshift(),在数组来头添加一个或者多个元素,并返回数组长度
        arr1.unshift(10,11);
        console.log(arr1,arr1.unshift(12));

        //shift(),删除第一个元素,返回删除的元素
        arr1.shift();
        console.log(arr1,arr1.shift());
    </script>
</head>
<body>
    
</body>
</html>

29.数组的遍历

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    
        var a1=new Array(7,8,9,10,4,5);
        //遍历1
        for(var i=0;i<a1.length;i++){
            console.log(a1[i]);
        }

        //遍历2,forEach()仅支持IE8以上的浏览器,将函数作为参数
        //数组中有几个元素,函数执行几次
        //每次遍历时,将遍历到的元素以实参的形式传递进函数,共有三个参数
        //第一个参数:当前遍历元素value;第二个参数:当前遍历的索引号index;第三个参数:当前数组obj
    a1.forEach(function(a,b,c){
        console.log("a="+a+" b="+b+" c="+c);
    });
    </script>
  
</head>
<body>
    
</body>
</html>

30.数组方法splice和slice

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
           var a1=new Array(7,8,9,10,4,5);
           
           //slice()从数组中提取指定范围元素
            //参数:截取开始的索引位置,截取结尾的位置索引
            //截取元素不包含末尾位置元素
            //第二个参数可以不写,默认截取开始位置以后的所有元素
            //第二个参数也可以为负值:-1倒数第一个元素,-2倒数第二个元素
           var result=a1.slice(2,4);
           console.log(result);//9,10

           var result1=a1.slice(2,-1);
           console.log(result1);//9,10,4

           //splice(),删除元素并返回删除元素,并添加新元素,
           //两个参数,第一个为七十位置,第二个为删除元素的数量
           var r1=a1.splice(0,2);
           console.log(r1,a1);
           var r1=a1.splice(0,2,"hi","hello");//自动替换被删除的元素
           console.log(r1,a1);

           //练习:去除数组中重复的数字
           var a1=[1,2,3,1,2,3,4,2,3];
           for(var i=0;i<a1.length;i++){
            for(var j=i+1;j<a1.length;j++){
                if(a1[j]==a1[i]){
                    a1.splice(j,1);
                    j--;//注意
                }
            }
           }
           console.log(a1);


    </script>
</head>
<body>

</body>
</html>

31.数组的其他方法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>

    var a1=[1,2,3];
    var a2=["hi","he","ha"];
    var a3=[7,8,9];
    
    //1.连接多个数组或者元素
    var r1=a1.concat(a2,a3,10);
    console.log(r1);

    //2.将数组转换为字符串,默认用逗号连接
    var r2=a2.join();
    var r3=a2.join("-");
    console.log(typeof r2,r2,r3);

    //3.反转数组
    a1.reverse();
    console.log(a1);

    //4.sort排序,按照unicode编码,默认升序
    a2.sort();
    console.log(a2);
    //自定义排序规则:添加回调函数
    //返回值为1,交换,返回值-1或者0不交换
    arr=[4,5,6,9,6,3,2];
    arr.sort(function(a,b){//a和b不确定,但a一定在b的前面
        // if(a>b){
        //     return 1;//交换
        // }
        // else if(a<b){
        //     return -1;
        // }
        // else{
        //     return 0;
        // }
        return b-a;//降序
    })
    console.log(arr);

    </script>
</head>
<body>
    
</body>
</html>

32.call和apply

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        function fun(){
            alert(this);
        }

        var obj={
            name:"sun",
            sayname:function(){
                console.log(this.name);
            }
        };
        var obj2={
            name:"sun2",
            sayname:function(){
                console.log(this.name);
            }
        };
        
        function fun1(a,b){
        alert(a+b);
        }
        //函数的方法call和apply
        //函数调用两种方法后都会执行函数
        //可以将一个对象作为第一个参数传入这两种方法,这个对象会成为函数执行时的this
        //call方法可以在第一个对象参数后面依次传入函数参数,apply需要将参数封装在数组里

        //1.call()
        // fun.call(obj);//obj
        
        //2.apply()
        // fun.apply();//window

        // obj.sayname.apply(obj2);//this=obj2

        fun1.call(obj,2,3);
        fun1.apply(obj,[2,3]);
    </script>
</head>
<body>
    
</body>
</html>

33.arguments


<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //调用函数时,会传入一个隐藏的参数arguments,封装实参的对象,
        //是一个类数组对象,arguments[0],arguments[1]依次对应传入的实参
        // callee属性对应当前正在则会那个在指向的函数对象
        function fun(){
            console.log(arguments instanceof Object);
            console.log(Array.isArray(arguments));
            console.log(arguments.length);
            console.log(arguments[1]);
            console.log(arguments.callee);
        }

        fun(1,"heool");
    </script>
</head>
<body>
    
</body>
</html>

34.Date对象

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        var d=new Date();
        console.log(d);//当前代码执行时间

        //创建一个指定的时间,格式如下
        var d1=new Date("11/03/2021 11:30:45");
        console.log(d1);

        //对象方法和属性
        var date=d1.getDate();//获取日
        console.log(date);
        var day=d1.getDay();//获取星期
        console.log(day);
        var month=d1.getMonth();//获取月份,12月为0
        console.log(month);
        var year=d1.getFullYear();//获取年份
        console.log(year);

        var time=d.getTime();//获取时间戳,毫秒
        console.log(time);
        
        time=Date.now();//获取当前时间戳
        console.log(time);

    </script>
</head>
<body>
    
</body>
</html

35.Math对象

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        //Math不是构造函数,是一个工具类,不用于创建对象
        //Math,PI
        var b=-1;
        console.log(Math.abs(b));//绝对值
        console.log(Math.ceil(2.3));//向上取整
        console.log(Math.floor(6.8));//向下取整
        console.log(Math.round(5.5));//四舍五入
        console.log(Math.random());//生成0-1之间的随机数
        console.log(Math.round(Math.random()*(20-10)+10));//生成10-20之间的随机数
        console.log(Math.max(10,20,30));
        console.log(Math.min(10,20,30));
        console.log(Math.pow(2,3));//2的3次方
        console.log(Math.sqrt(64));//开方
        
    </script>
</head>
<body>
    
</body>
</html>

36.包装类

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    //Js提供了三个包装类,将基本数据类型转换为对象
    //String Number Boolean

    var num=new Number(3);
    console.log(num,typeof num);
    var str=new String();
    var bool=new Boolean();
    
    num.name="hello num";
    
//如果给基本数据类型调用方法或者添加属性时,浏览器会将其临时转换为对象,调用后再转回基本数据类型

    </script>
</head>
<body>
    
</body>
</html>

37.字符串方法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        var str="hello";
        //在底层字符串以字符数组的形式保存
        console.log(str.length);//5
        console.log(str[0]);//h

        //定位字符
        console.log(str.charAt(0));//h
        console.log(str.charCodeAt(0));//str[0]的字符Unicode编码
        
        console.log(String.fromCharCode(104));//由字符编码获取字符
        console.log(str.concat("你好"));//相当于+

        console.log(str.indexOf("e",2));//检索字符是否存在,不存在返回-1,存在返回第一次出现的位置,第二个参数可以指定开始查找的位置
        console.log(str.lastIndexOf("l"));//从后往前索引,也可以指定查找开始位置

        console.log(str.slice(0,2));//截取str[0-1],不包含str[2]
        console.log(str.substring(0,2));//效果于slice一样,不同的是substring不接受负值参数,如果参数2小于参数1则自动调整位置
        console.log(str.substr(0,2));

        str="abc,dr,gh";
        console.log(str.split(','));//将字符串拆分成数组,与join相反

        str="abcdefg";
        console.log(str.toUpperCase());//转为大写
        var str1="ABCDEFG";
        console.log(str1.toLowerCase());//转为小写

    </script>
</head>
<body>
    
</body>
</html>

38. 异步js

目的:解决回调函数多层嵌套产生的回调陷阱,promise使用了链式的方式来表达相同的含义。

使用方法:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        function doSomething(num) {
            return new Promise((resolve,reject)=>{
                //这里模拟一个简单的异步操作
                    // let test = 0;
                    // setTimeout(()=>{
                    //     console.log("done");
                    //     test = 1;
                    // },200); 

                    if(true){
                        // 如果成功 使用resolve改变promise的状态为fulfilled
                        resolve(num);
                    } else {
                        // 如果失败 使用reject改变promise的状态为rejected
                        reject(new Error("操作失败"));
                    }         
            });
        }

        function doSomethingElse(result) {
            return new Promise((resolve, reject) => {
                resolve(result+1);
            });
        }
        /*
       1. promise对象:用来表示一个异步操作的执行结果
       2. 在这里我们期望函数返回一个promise对象:
            使用Promise构造函数创建一个promise对象,构造函数有一个必选参数为:执行器函数。
            执行器函数接受两个参数resolve和reject,都是promise的内置函数,用于改变promise对象的状态。
                promise对象有三种状态:
                    Pending(等待中):初始状态
                    Fulfilled(已完成):意味着操作成功
                    Rejected(已拒绝):意味着操作失败
                resolve函数:pending->fulfilled;reject函数:pending->rejected
                需要在传入的执行器函数中显示的调用resolve()或者reject()来改变状态,否则状态一直为pending
                状态一旦从 "pending" 变为 "fulfilled" 或 "rejected",它将永远保持这个状态
                resolve或reject函数接收的参数作为promise的结果,存放在该promise的PromiseResult字段中 
       3. promise.then(onFullfilled onRejected(可选)),then方法在当promise状态改变时调用,接受两个参数
            若状态变化为:pending->fulfilled,onFullfilled函数被调用,有一个默认参数value为promise的结果值,也就是传入resolve的参数
            若状态变化为:pending->rejected, onRejected函数会被调用,有一个默认参数error,一般为传入reject()的参数
            promise.then的返回值:
                立即返回一个新的 Promise 对象,该对象始终处于待定状态,无论当前 Promise 对象的状态如何。
                 // 假设由then返回的新promise对象为p,则then的参数:回调函数的返回值:
                 // 为非promise值,作为由p的值
                 // 没有返回值,p的值为undefined
                 // 抛出错误,作为p的拒绝原因
                 // 返回一个已兑现的 Promise 对象:p 以该 Promise 的值作为其兑现值。
                 // 返回一个已拒绝的 Promise 对象:p 以该 Promise 的值作为其拒绝值。
                 // 返回另一个待定的 Promise 对象:p 保持待定状态,并在该 Promise 对象被兑现/拒绝后立即以该 Promise 的值作为其兑现/拒绝值。          
                */

        function successCallback(value) {
            console.log('successCallback:value ' ,value);
                 return value+1;
        }

        function failCallback(error) {
            console.log("failCallback:error ",error.message);
        }

        // 创建promise
        const promise = doSomething(1);
        console.log('promise:',promise);

        const promise2 = Promise.resolve(3);
        const promise3 = 42;
        const promise4 = new Promise((resolve, reject) => {
            setTimeout(resolve, 100, 'foo');
        });
        const promise5 = new Promise((resolve,reject)=>{
        setTimeout(reject,50,'too');
        });
        //迭代对象
        const promises = [promise2, promise3, promise4];
        const racePromises = [promise4,promise5];

        // 实例方法: then catch finally

        // 1.  promise.then()
        const promise1 = promise.then(successCallback,failCallback);
        promise.then(
            value => console.log('简写callback:',value),
            error => console.log('简写callback:',error.message)
        );
       console.log('promise1:',promise1);

       // 2. promise.catch: catch(onRejected) = then(null,onRejected)
       // 3. promise.finally: 无论成功还是失败,都会被调用 .finally(onFinally) = .then(onFinally,onFinally)
       promise.catch((error)=>{
        console.log("catchError:",error);
       }).finally(()=>{
        console.log('finally');
       });


     
        
        //静态方法:

        // 1. Promise.all 等待所有兑现(或第一个拒绝)的结果。
        Promise.all(promises).then((values) => {
             console.log('all:',values);
        });

        // 2.promise.allsetled 
        // 当所有输入的 Promise 都已敲定时(包括传入空的可迭代对象时),返回的 Promise 将被兑现,并带有描述每个 Promise 结果的对象数组。
        Promise.allSettled(promises).then((values)=>{
            console.log('allsettled:',values);
        });

        // 3. promise.any 返回第一个fulfilled的promise对象的value值
        Promise.any(racePromises).then(value=>console.log('any: ',value));

        // 4. promise.race: 返回第一个确定为fulfilled或者rejected的promise的value或reson
        Promise.race(racePromises).then( value => console.log('race:', value));
    </script>
</head>
<body>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值