js常见简单编程

js算法题

1、求和计算器

用prompt和alert制作一个求两个数和的计算器?

<script>
    // 创建两个变量来存放输入的值,输入的值默认是字符串类型,需要先转换为数字类型

    var a=Number(prompt('请输入第一个值'));
    var b=Number(prompt('请输入第二个值'));

    // 两个数值求和
    var sum=a+b;
    // 弹出结果
    alert('数值'+a+'与数值'+b+'的结果是'+ sum);
</script>

2、求π(莱布尼茨公式)

根据用户输入的值计算相应精度的π?

  • 累加器作为总和
  • 累乘器作为每一块的元素结果

image-20210916183320834

<script>
        // 根据用户输入的值,根据莱布尼茨计算公式计算π
        var n=Number(prompt("请输入一个值"));
        // 存放值的和,因为公式第一项是1,所以先加1
        var sum=1;
        // 存放每一项的值
        var item=1;
        for(var i=1;i<n;i++){
            // 每一项都是前边项的基础上再乘以一个i/(2i+1),item就是当前项的结果
            item*=(i/(2*i+1));
            // 用sum值加上每一项乘机的结果
            sum+=item;
        }
        // 莱布尼茨计算的是2分之π,所以结果要乘以2才得到的是π
        alert(sum*2);
    </script>

3.喇叭花数

    <script>
        // 喇叭花数:一个三位整数,各位数阶乘的和等于这个三位数: abc=a!+b!+c!
        // 首先定义求阶乘的函数
        function factorial(n) {
            for(var i=1,result=1;i<=n;i++){
                result*=i;
            }
            return result;
            
        }
        // 遍历所有三位数判断它是否为喇叭花数

        for(var i=100;i<=999;i++){
            // 将三位数拆分
            var str=String(i);
            a=str[0];
            b=str[1];
            c=str[2];

            if(factorial(a)+factorial(b)+factorial(c)==i){
                console.log(i+"是蝴蝶数");
            }
        }


    </script>

4.递归

4.1用递归求n的阶乘

    <!-- 用递归求4的阶乘 -->
    <script>
        
        function digui(n){
            if(n==1) return 1;
            return n*(digui(n-1));

        }
        alert(digui(5));
    </script>

4.2递归求1-100的和

    <script>
        // 求1-100的和
        function fun(n){
            if(n==1) return 1;
            return n+fun(n-1);
        }
        alert(fun(100));

    </script>

4.3菲波那切数列

    <script>
        // 求斐波那契数列第n项的值:从第三项开始,每一项等于前两项的和

        function fib(n){
            if(n==0||n==1) return 1;

            return fib(n-1)+fib(n-2);
        }
        for(i=0;i<10;i++){
            console.log(fib(i));
        }
        
    </script>

4.4工资涨幅

    <script>
        //小慕入职新公司,月薪一万元。工资每年涨幅5%。计算出小慕工作20年后,月薪为少
        var n=20;
        var t=0.05;
        function fun(n){
            if(n==1) return 10000;
            return fun(n-1)*0.05+fun(n-1);
        }
        console.log(fun(20));
    </script>

4.5如何实现深克隆

    <script>
        // 实现深克隆
        // 定义一个多维数组
        var array = [1, 2, 3, 5, 6, 8[26, 32, [55, 25]]];
        function deepClone(arr) {
            // 在函数内定义结果,为的是每一次调用时都会有一个初始result
            var result = [];

            for (var i = 0; i < arr.length; i++) {
                //判断这个数据项是不是一个更深层次的数组,如果是,就再一次调用克隆
                if (Array.isArray(arr[i])){
                    // 数组深度总有一个结尾,当调用到最后一组,则所有的数据项都不是数组了,就可以将数据项push到新数组中了,这样一层一层往回返
                    result.push(deepClone(arr[i]));
                }else{
                    // 如果不是数组,则直接输入到新数组中
                    result.push(arr[i]);
                }
            }
            // 将浅克隆的结果返回给它的调用官方
            return result;

        }
        var deep=deepClone(array);
        console.log(deep);
        console.log(array);
        console.log(deep==array);//false
        //深克隆成功


    </script>

5.对象问题

1.输出执行结果?

  • obj.name寻找的是name属性名的值
  • obj[name]寻找的是name变量名的值
    <script>
        var obj={
            name:"lili",
            age:18
        }
        var name="zhufeng";
        console.log(obj.name);//"lili"
        console.log(obj["name"]);//"lili"
        console.log(obj[name]);//obj["zhufeng"]====>undefined
		console.log(obj[job]);//obj[找不到job这个变量]====>报错:job is not defined

		
    </script>

2.引用数据类型改变指向地址问题?

    <script>
        var a = 12;
        var b = a;//b和a是基本数据类型,所以b克隆a的值
        console.log(b);//12
        var obj1 = { "name": "lili", "age": 12 };
        var obj2 = obj1;//obj1和obj2是引用数据类型,所以obj1将数据地址传给obj2
        obj2.age = 18;//obj2修改堆空间中的值,obj1也会看到obj2的修改的值
        console.log(obj1.age);//18
        obj2={};//让obj2又执行了另一个数据空间,所以obj2断掉对原来数据地址的引用,从新指向新地址
        console.log(obj1.age);//18,obj1仍然指向原地址
    </script>

3.对象内存创建顺序问题?

    <script>
        
        var obj = {
            n: 10,
            b: obj.n * 10//由于这里obj的值还没有创建成功,所以报错,obj未定义undefined
        }
        console.log(obj.b);
    </script> 

6.全局与局部变量

1.考察局部变量的声明提升?

    <script>
        // 局部变量,变量的声明提升
        var a=10;//这是全局变量
        function fun(){
            a++;//只要函数中有定义该变量,即使先调用再定义的,它就不会用全局变量,而是使用声明提升的局部变量,所以a的值是undefined,a++的值是NaN
            var a=5;//a的值由NaN转为5
            console.log(a);//5
        }
        console.log(a);//10,全局变量不受局部变量的变化影响

    </script>

2.考察形参变量的作用域

    <script>

        var a=123;
        var b=22;
        function fun(a){
            document.write(a);//undefined,因为调用参数传没有传入值,则默认为undefined值
            a=34;
            document.write(b);//22,因为没有形参b,所以会向上寻找定义了的b.
        }
        fun();
        document.write(a);//这是函数外边,寻找全局变量
    </script>

7.BAT

1.判断输出结果?

typeof []//"object"

typeof typeof []//"string"

2.判断输出结果?

var num=parseInt("px35.5");//num=NaN
if(num==35.5){//不成立
    alert(0)
}else if(num==35){//不成立
    alert(1)
}else if(num==NaN){//NaN不自等(坑)
    alert(3)
}else if(typeof num=='number'){//成立,NaN也是number类型
    alert(4)//输出4
}else{
   alert(5)
}

3.1.阿里xue案题

  • 访问执行优先级高于赋值

    a.x=a={
       n:2;  
    }
    a.x是访问对象属性
    a是对象
    所以先给a.x赋值,给a赋值
    
    
        <script>
            let a = {
                n: 1
            }
            let b = a;
            a.x = a = {
                n: 2
            }
            console.log(a.x);//undefined
            console.log(b);//{n:2,x:地址值}
        </script>
    

    img

8.闭包

8.1闭包的记忆性案例?

<script>
        // 闭包实例:测量体温标准,A校区不能超过37.3度,B校区不能超过37.0度
        // 外边这层函数,就是闭包封锁的函数,传入的形参biaozhun就是会被记忆的值
        function creatTemp(biaozhun){
            //定义局部函数,在调用闭包时传入的值是给这个函数传值
            function Temp(n){
                //
                if(n>biaozhun){
                    alert("你的温度过高");
                }else{
                    alert("你的温度正常");
                }
            }
            return Temp;//注意,返回的是函数名,不是Temp()调用函数
        }

        // 定义完函数之后,需要换一个地方执行,给creatTemp一个标准值
        // 定义A小区的的标准体温为37.3,闭包之后只要调用Temp_A函数就可以以37.3为标准
        var Temp_A=creatTemp(37.3);
        Temp_A(37.2);//温度正常
        Temp_A(37.6);//温度过高
        // 定义B小区的标准体温为37.0,闭包之后只要调用Temp_B函数就可以以37.0为标准
        var Temp_B=creatTemp(37.0);
        Temp_B(37.3);//温度过高
        Temp_B(36.9);//温度正常

    </script>

8.2闭包的模拟私有变量?

  • 核心要素是封装,不能直接获取函数中的私有变量,想要对私有变量进行操作,需要先定义相应的函数,否则操作不了。
  //题目:定义一个变量a,要求是能保证这个a只能被进行指定操作(如加1、乘2),而不能进行其他操作。

<script>
        function fun(){
            //a是局部变量,所以,函数外是无法访问到a的
            var a=0;
            //我们想要获取a,就可以定义一个对象,再在外部通过闭包的方式获取它
            
            return {
                // 获取a的值属性名是我们需要调用的函数名,属性值是函数表达式(匿名函数)
                getA:function(){
                    return a;
                },
                // 另a+1
                add:function(){
                    a++;
                },
                pow: function(){
                    a*=2;
                }
                
            }

        }

        // 在外面将外层函数进行闭包
        var obj=fun();
        // 这时obj就可以使用fun函数中定义的对象属性了
        obj.getA();//0
        obj.add();//a+1
        obj.pow();//a*2



    </script>

8.3生成多个闭包时的运算结果?

    <script>
        function fun(){
            var count=0;
            return function(){
                count=count+1;
                console.log(count);

            };
        }
        // 定义了两个闭包,他们两个互不关联,都获得了fun的初始值
        var fun1=fun();//定义一个新的fun闭包
        var fun2=fun();//定义一个新的fun闭包

        fun1();//1
        fun2();//1,因为他们两个互不关联,所以上面的count+1与fun2中的count无关
        fun2();//2,
        fun1()//2
    </script>

9.js实现鼠标划过变色

1.js实现交叉颜色,并且鼠标划上变色?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        ul {
            list-style: none;
        }

        #lists {
            width: 500px;
            height: 500px;
            margin: 0 auto;
            border: 1px solid #333;
            display: flex;
            flex-direction: column;
            align-items: stretch;

        }

        li {
            flex: 1;
        }
    </style>
</head>

<body>
    <ul id="lists">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>

</body>

</html>
<script>
    var ols = document.getElementById("lists");
    var lis = ols.querySelectorAll("#lists>li");
    function color() {
        for (i = 0; i < lis.length; i++) {
            if (i % 2 == 0) {
                lis[i].style.background = "red";
             
            } else {
                lis[i].style.background = "green";
                
            }
            lis[i].onmouseover = function () {
                this.oldColor=this.style.backgroundColor;
                this.style.background = "pink";
            };
            lis[i].onmouseout = function () {
                    this.style.background = this.oldColor;
                }
        }
    };


    color();
</script>

image-20210922183318699

10.节点

10.1节点创建一个20行13列的表格

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        td {
            width: 5px;
            height: 5px;
            border: 1px solid #333;
        }
    </style>
</head>

<body>

    <table id="tb" class="tab"></table>
    <script>
        // 获取到table节点
        var otb = document.getElementById("tb");
        //挂载到table节点
        for (i = 0; i < 20; i++) {
            //创建孤儿节点tr
            var otr = document.createElement("tr");
            for (j = 0; j < 13; j++) {
                // 创建孤儿节点td
                var otd = document.createElement("td");
                otr.appendChild(otd);
            }
            otb.appendChild(otr);
        }
    </script>
</body>

11.事件

11.1文本域只能输入30个字符,动态提示用户剩余输入字符个数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>字数限制在30字内,<span>您还可以输入<b>30</b></span></p>
    <textarea id="text" cols="50" rows="70"></textarea>

    <script>
        // 文本域标签
        var otext=document.getElementById("text");
        //span标签
        var ospan=document.querySelector("span");

        otext.onkeyup=function(){
            var content=otext.value;
            var count=content.length;
            if(count<=30){
                var remain=30-count;
                ospan.innerHTML="您还可以输入<b>"+remain+"</b>字";
            }
            else{
                var remain=count-30;
                ospan.innerHTML="您已经超出了<b>"+remain+"</b>字";
            }
        }


    </script>

</body>
</html>

11.2实现下拉框动态改变div的背景颜色

<body>
    <span>请选择你喜欢的颜色</span>
    <select name="" id="color">
        <option value="0">请选择</option>
        <option value="yellow">黄色</option>
        <option value="orange">橙色</option>
        <option value="pink">粉色</option>
        <option value="blue">蓝色</option>
    </select>
    <div id="div">我是div</div>

    <script>
        var oselect=document.getElementById('color');
        var ooptions=oselect.querySelectorAll("option");

        var odiv=document.getElementById("div");
       
            oselect.onchange=function(){
            var col=oselect.value;
            if(col==0){
                odiv.innerText="我没有发生任何变化";
                odiv.style.background="white";
            }else{
                odiv.innerText="我是div";
                odiv.style.background=col;
            }
   
        }


    </script>
</body>

12.数组去重

1.数组去重?

  • 数组去重有三种方式:
    • 各数组项一一向后对比
    • 借用对象辅助判断去重
    • 借用新数组放不重复数据

方式一:数组从左往右挑出每一个值,与后面的项一一对比

<script>
        // 思路:数组从左往右挑出每一个值,与后面的项一一对比,如果相同,就删除掉后面重复的数据项
        // ary.length-1:是因为数组最后一项后面没有值了,所以这一项不需要比较了
        // j=i+1:这是因为第i向只需要从它后面一项开始一一比较,它本身以及前面的项不需要比较了
        // j--:是因为删除这一项后,后面的每一项会向前移,填补这一项,所以减一来继续监测这个索引的数据值


        function rem(ary){
            
        for(var i=0;i<ary.length-1;i++){
            // 获取数组的第i项数据项
            var item=ary[i];
            //再次遍历,这次是遍历第i项后面的所有项
            for(var j=i+1;j<ary.length;j++){
                if(ary[j]==item){
                    // 删除后面重复的那一项
                    ary.splice(j,1);
                    // 放置数组塌陷
                    j--;
                }
            }
        }
        // 一定记得要返回,否则外边获取的值就是undefined
        return arr;
        }
        var arr=[1,2,3,5,2,4];

        alert(rem(arr));


    </script>

方式二:使用对象存储已经存在的数组数据项,对象的属性名和属性值都是数组某个数据项的数据值,如果对象中存在这个属性名,则代表数组中已经存在这个数据值了,后面在出现这个数据值,则是重复的值,就可以删除


    <script>
        // 思路:使用对象存储已经存在的数组数据项,对象的属性名和属性值都是数组某个数据项的数据值,如果对象中存在这个属性名,则代表数组中已经存在这个数据值了,后面在出现这个数据值,则是重复的值,就可以删除

        function unique(arr){
            // 对象是辅助判断作用,只接收数组中第一次出现的数据项,添加到对象 属性名:属性值都是数据项的值
            
            var obj={};
            for(var i=0;i<arr.length;i++){
                if(obj[arr[i]]==arr[i]){
                    // 走到这里说明数组中已经出现过这个值了,所以需要删除掉
                    arr.splice(i,1);
                    i--;
                }
                // 走到这里说明该数据项值在数组中第一次出现,添加到对象中
                obj[arr[i]]=arr[i];
            }
            return arr;
            
        }
        var arr=[1,5,6,5,5,7,8];
        console.log(unique(arr));

    </script>

方式三:使用新数组接收不重复数据项

<body>

    <script>
        //方式三:使用新数组接收不重复数据项
        var arr = [7, 2, 4, 5, 6, 2, 3, 2, 1];
        // 创建新数组,用来存放不重复的值

        function unique(arr) {
            var newArr = [];
            for (var i = 0; i < arr.length; i++) {
                // 判断是否重复,如果不重复
                if (!newArr.includes(arr[i])) {
                    newArr.push(arr[i]);
                    i--;
                }
            }
            // 一定要返回
            return newArr;
        }

        alert(unique(arr));
        

    </script>

13.排序

1.冒泡排序实现?

    <!-- 冒泡排序 -->
        /* 
 冒泡排序:
 目的:从小到大进行排序
 var ary=[2,1,5,8];
 // 两两进行比较,如果前者比后者大,就交换顺序, 经过一轮比较之后,得到了一个最大值8
 //--------- 需要比较多少轮?ary.length-1 轮(因为最后一个数字不用比,就是最小的)
 // 每一轮我需要比较多少次?------ary.length-1-已比较的轮数
 var ary=[8,2,1,5];// 正常情况下,两两比较的次数: ary.length-1
 第一轮的:[2,1,5,8];// 经过一轮比较得到了一个最大值8  比了三次
 第二轮的:[1,2,5,8];//经过二轮比较得到了一个最大值5   比了两次 ary.length-1-已比较的轮数
第三轮的:[1,2,5,8];
第四轮 不用比了,已经得到三个最大值了,最后一个就是最小的
*/
    <script>
        var ary=[2,1,5,8,5,221,3,2];
        var swap=0;
        // 比较的轮数
        for(var i=0;i<ary.length;i++){
            // 每轮比较的for循环
            for(var j=0;j<ary.length-i;j++){
                // 如果前面比后面的大,就交换位置
                if(ary[j]>ary[j+1]){
                    swap=ary[j];
                    ary[j]=ary[j+1];
                    ary[j+1]=swap;
                }
            }
        }
        alert(ary);
    </script>

2.快速排序?

<script>

    //快速排序

    var ary=[12,15,4,13,16,11];//4,11,12,13,12

    function fast(ary){
        // 做一个条件,如果传入的数组的长度是0或者1,说明已经没有比较的值了,就可以返回这个数组了
        if(ary.length<=1){
            return ary;
        }
        // 中间项的索引
        var centerIndex=Math.floor(ary.length/2);
        // splice的返回值是数组,拿到删除的项得加索引0,这个是获取中间值
        var centerValue= ary.splice(centerIndex,1)[0];

        // 设置左右两个空数组
        var leftArr=[];
        var rightArr=[];
        // for循环,交换位置
        for(var i=0;i<ary.length;i++){
            // 如果遍历的数小于中间数,就把这个数放在左边
            if(centerValue>ary[i]){
                leftArr.push(ary[i]);
            }else{//否则放在右边的数组中
                rightArr.push(ary[i]);
            }
        }
        // 最终获得左右数组和中间值,将三个数组拼接
        //  左右两个数组又能够作为一个无序数组,进行快速排序,所以左数组和右数组仍需要调用函数
        return fast(leftArr).concat(centerValue, fast(rightArr));

    }
    alert(fast(ary));



</script>

14.验证码

1.验证码如何实现?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        button {
            width: 200px;
            height: 50px;
            cursor: pointer;
        }

        #code {
            border: 1px solid #333;
            height: 50px;
            width: 200px;
            margin-top: 100px;
            font-size: 40px;
            line-height: 50px;
            text-align: center;
        }
    </style>
</head>

<body>


    <button id="btn">获取验证码</button>
    <div id="code"></div>


    <script>
        // 字母和数字的范围
        let codeText = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        
        var obtn=document.getElementById("btn");
        var ocode=document.getElementById("code");
        function getCode(num,begin,end) {
            // 先判断这三个数是否为未定义
            if(num==undefined){ num=4;}
            if(begin==undefined) {begin=0;}
            if(end==undefined) {end=codeText.length-1;}
            // 获取一个在0-61的随机索引
            var newCode = "";
            var indexArr=[];
            while(newCode.length<num){
                 // 获取0-61,包括61之间的一个随机数
                 var index =Math.round(Math.random() * (end-begin)+begin) ;
                // 如果已经出现了这个index,则重新选择,实现不出现重复的数字
                if(!indexArr.includes(index)){
                    indexArr.push(index);
                // 将随机数的索引对应数据项放到新字符串中
                newCode += codeText.charAt(index);
                    
                }                
            }
            // for (let i = 0; i < num; i++) {
            //     // 获取0-61,包括61之间的一个随机数
            //     var index =Math.round(Math.random() * (end-begin)+begin) ;
            //     // 如果已经出现了这个index,则重新选择,实现不出现重复的数字
            //     if(indexArr.includes(index)){
            //         i--;
            //         continue;
            //     }
            //     indexArr.push(index);
            //     // 将随机数的索引对应数据项放到新字符串中
            //     newCode += codeText.charAt(index);
            // }
            return newCode;
        }
        ocode.innerText=getCode();

        // 设计按钮的点击事件
        obtn.onclick=function(){
            ocode.innerText=getCode();
        
        }
    </script>

</body>

</html>

15.时间格式转换

1.如何将"2019-8-18 12:32:18"转换为"2019年8月18日 12时32分18秒"?

    <script>
        var str="2019-8-18 12:32:18";
        var timeArr=str.split(" ");
        // 将年月日与时分秒分割开
        var year=timeArr[0];
        var time=timeArr[1];
        //将每一个数分开
        var newyear=year.split("-");
        var newtime=time.split(":");
        // 各拼接两部分
        var nyear=newyear[0]+"年"+newyear[1]+"月"+newyear[2]+"日";
        var ntime=newtime[0]+"时"+newtime[1]+"分"+newtime[2]+"秒";

        // 拼接两部分,用空格隔开
        var ne=nyear.concat(" ",ntime);
        console.log(ne);
    </script>

16.网址参数转对象属性

1.将网址中的问号后面的参数截取为对象中的属性?

  <script>
        var str = "http://www.mi.com/?id=100&price=180";

        function toObj(str) {
            // 首先获取?出现的位置
            var qusindex = str.indexOf("?");
            console.log(qusindex);
            // 截取?后面的字符串
            var parm = str.slice(qusindex + 1);
            // 将字符串根据&分割
            var parmArr = parm.split("&");
            // 向新对象中添加
            var obj = {};
            for (var i = 0; i < parmArr.length; i++) {
               var item = parmArr[i].split("=");
                obj[item[0]] = item[1];
            }
            console.log(obj);

            return obj;
        }

        var ob=toObj(str);
    </script>

17.函数上下文

1.求下面函数的执行结果?

    
    <script>
        function fun(){
            return this.a+this.b;

        }

        var a=1;
        var b=2;
        var obj={
            a:3,
            b: fun(),//3,执行到这一步时,会执行fun()函数,符合函数名()的规则,所以this指代的是window对象
            fun:fun
        }
        var res=obj.fun();//6这里符合对象名.方法()的调用形式,所以this指代的是obj对象
        console.log(res);
    </script>

2.求函数的执行结果?

//注意点:考虑到this.b和this.b()的区别
    //	this.b表示获取b后面的函数体
	//	this.b(),表示调用b后面的函数,函数会被执行
	//return 函数体时,函数体会被执行
<script>
        var c=1;
        var obj={
            a:function(){
                var c=3;
                return this.b;//转为obj.b,调用b后面的匿名函数,this指代window对象,
            },
            b:function(){
                var c=4;
                document.write(this.c)//window.c,所以结果为1
            },
            c:2
        };
        var obj1=obj.a();//符合规则一对象名.函数名()调用,this指代obj
        obj1()
    </script>

3.上下文规则四题目?

   <script>
        var a=1;
        var obj={
            a=2,
            //因为函数是立即执行函数,所以在预编译时期,就会执行这个函数,所以fun的值是return的那个函数
            fun=(function(){
                var a=this.a;//立即执行函数的this表示window对象,所以找window对象中的全局变量a
                //返回这个函数,用于上面执行了立即执行函数,形成了闭包,记住了a的值等于1
                return function(){
                    console.log(a+this.a);//
                }
            } )()
        }

        obj.fun();//3,a是闭包中的a,this.a:由于是对象名.方法名()方式调用的,所以this代指的是obj
    </script>

4.上下文规则五题目?

<script>

        setInterval(obj.fun,2000)//调用fun的是定时器,所以fun函数中的this代指window对象
        setInterval(function(){obj.fun(),2000})//调用fun的是obj,所以fun函数中的this代指obj对象
    </script>

18.鼠标移动生成小球

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            background-color: black;
        }
        .ball{
            border-radius: 50%;
            position: absolute;
        }
    </style>
</head>
<body>
    
    <script>
        // 小球类
        function Ball(x,y){
            // 传入小球的圆心距离浏览器左上角的坐标值
            this.x=x;
            this.y=y;
            //给定小球的初始半径
            this.r=10;
            //小球的背景颜色
            this.color=colorArr[parseInt(Math.random()*5)];
            //调用初始化方法生成小球元素
            this.init();
            //把自己推入数组,这里的this不是类本身,而是new出来的实例对象
            arr.push(this);
            // 添加随机的x和y的增量,实现小球随机方向的移动,放在构造函数中,是因为在创建实例之前就应该给定一个确定的方向让小球移动
            do{
                this.xadd=parseInt(Math.random()*10-5);
            this.yadd=parseInt(Math.random()*10-5);
            }while(this.xadd==0&&this.add==0);
            //透明度属性
            this.opacity=1;

        }
        //初始化方法
        Ball.prototype.init=function(){
            //创建自己的dom元素
            this.dom=document.createElement('div');
            this.dom.className="ball";
            this.dom.style.width=this.r*2+"px";
            this.dom.style.height=this.r*2+"px";
            this.dom.style.left=this.x-this.r+"px";
            this.dom.style.top=this.y-this.r+"px";
            this.dom.style.backgroundColor=this.color;
            // 将该元素上树到body元素中
            document.body.appendChild(this.dom); 
        }

        // 小球状态更新方法
        Ball.prototype.update=function(){
            // 位置改变
            this.x+=this.xadd;
            this.y+=this.yadd;
            //使小球的透明度减小
            this.opacity-=0.05;
            //半径改变
            this.r+=0.02;
            this.dom.style.width=this.r*2+"px";
            this.dom.style.height=this.r*2+"px";
            this.dom.style.left=this.x-this.r+"px";
            this.dom.style.top=this.y-this.r+"px";
            this.dom.style.backgroundColor=this.color;
            this.dom.style.opacity=this.opacity;
            //如果小球的opacity为0,则删除小球,释放内存
            if(this.opacity<0){
                // 删除数组中的小球
                for(var i=0;i<arr.length;i++){
                    if(arr[i]==this){
                        arr.splice(i,1);
                    }
                }
                //删除dom元素中的小球
                document.body.removeChild(this.dom);
            }

        }
        // 把所有的小球实例都放在同一个数组中
        var arr=[];
        //创建一个颜色数组
        var colorArr=["#666fff","#aaabbb","#ccff66","#ff99cc","#ff6666"];

        //设置定时器,更新所有小球的实例
        setInterval(function(){
            //遍历数组,调用小球的undate方法
            for(var i=0;i<arr.length;i++){
                arr[i].update();
            }
        },50)
        // 鼠标指针的事件监听
        document.onmousemove=function(e){
            var x=e.clientX;
            var y=e.clientY;
            // 只要鼠标移动就会产生一个新的小球随机移动
            new Ball(x,y);
        }


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

19.Date实现倒计时

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <h1 id="tag">2021年高考倒计时</h1>
    <h2 id="tag2">2021年高考倒计时</h2>
    <script>
        // 获取2022年6月7号时间对象
        var gt = new Date("2022-06-21");
        // 设置定时器,每秒更新一次
        setInterval(function () {
            // 获取当前时间
            var nt = new Date();

            // 让后面的时间减前面的时间,获取的是时间戳
            var sy = gt - nt;//得到的是剩余时间戳,毫秒数
            // 获取剩余天数
            syDay = parseInt(sy / (1000 * 60 * 60 * 24));
            //获取减去天数后剩余的小时数
            syHours = parseInt(sy % (1000 * 60 * 60 * 24) / (1000 * 60 * 60));
            //获取减去上面剩余的分钟数
            syMinutes = parseInt(sy % (1000 * 60 * 60) / (1000 * 60));
            // 获取减去上面剩余的秒数
            sySeconds = parseInt(sy % (1000 * 60) / (1000));

            // 获取显示倒计时的dom元素
            var tags = document.getElementById("tag2");
            tags.innerText = "倒计时" + syDay + "天" + syHours + "小时" + syMinutes + "分" + sySeconds + "秒";

        },1000)

    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值