重学js基础笔记

image

1.为什么需要内存条

image

2.什么是js(javascript)

image

image

image

image

image
更多参看MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/JavaScript_technologies_overview

dom

image
DOM、BOM api接口后面会有。

image

image

image

image

2. JavaScript注释

  • JS中的注释主要有两种,分别是单行注释和多行注释。
  • 单行注释的注释方式如下:
  • // 我是一行文字,不想被 JS引擎 执行,所以 注释起来
  • // 用来注释单行文字( 快捷键 ctrl + / )
  • 多行注释的注释方式如下:
    /*
    获取用户年龄和姓名
    并通过提示框显示出来
    / / */ 用来注释多行文字( 默认快捷键 alt + shift + a )
    快捷键修改为: ctrl + shift + /
    vscode  首选项按钮  键盘快捷方式  查找 原来的快捷键  修改为新的快捷键  回车确认
    image

3、变量

image

image

image

image

image
image

image

image

image

image

image

image

image

image

image

image

image

image

image

image
image
image
image

  • 其中\b 空格 ,b 是 blank 的意思,结果打印出来是
  var strMsg = "\"我爱北\b\b京天安门~\"";
        console.log(strMsg);
//"我爱北京天安门~"

image

image

其中

<script>
        console.log(1 + 1);//打印台2
    </script>

image

console.log(""+age+"")
 console.log("笨蛋" + age + "傻瓜");

image

image

  • 感觉null的值就为0,所以相加的时候以0来处理,不对,他为空,加空当然等于它本身。
    image

image

image

image
image

console.log(parseInt('78')); //78
        console.log(parseFloat('78.31')); //78.31
        console.log(Number('12')); //12
        console.log('12' - 0); //转换为数值型结果为12,自动自己计算

image

console.log(Boolean('')); //false
        console.log(Boolean(0)); //false
        console.log(Boolean(NaN)); //false
        console.log(Boolean(null)); //false
        console.log(Boolean(undefined)); //false
        console.log(Boolean('小白')); //true
        console.log(Boolean(12)); //true

js编程语言通过翻译器(编译/解释)机器语言(二进制)
image
image

1. 标识符
标识(zhi)符:就是指开发人员为变量、属性、函数、参数取的名字。
标识符不能是关键字或保留字。
2. 关键字
关键字:是指 JS本身已经使用了的字,不能再用它们充当变量名、方法名。
包括:break、case、catch、continue、default、delete、do、else、finally、for、function、if、in、
instanceof、new、return、switch、this、throw、try、typeof、var、void、while、with 等。

3. 保留字
保留字:实际上就是预留的“关键字”,意思是现在虽然还不是关键字,但是未来可能会成为关键字,同样不能
使用它们当变量名或方法名。
包括:boolean、byte、char、class、const、debugger、double、enum、export、extends、
fimal、float、goto、implements、import、int、interface、long、mative、package、
private、protected、public、short、static、super、synchronized、throws、transient、
volatile 等。
注意:如果将保留字用作变量名或函数名,那么除非将来的浏览器实现了该保留字,否则很可能收不到任何错
误消息。当浏览器将其实现后,该单词将被看做关键字,如此将出现关键字错误。

2.2 浮点数的精度问题
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。
var result = 0.1 + 0.2; // 结果不是 0.3,而是:0.30000000000000004
console.log(0.07 * 100); // 结果不是 7, 而是:7.000000000000001
所以:不要直接判断两个浮点数是否相等 !


3.1 递增和递减运算符概述
如果需要反复给数字变量添加或减去1,可以使用递增(++)和递减( -- )运算符来完成。 在 JavaScript 中,递增(++)和递减( -- )既可以放在变量前面,也可以放在变量后面。放在变量前面时,
我们可以称为前置递增(递减)运算符,放在变量后面时,我们可以称为后置递增(递减)运算符。
注意:递增和递减运算符必须和变量配合使用。

3.2 递增运算符
1. 前置递增运算符
++num 前置递增,就是自加1,类似于 num = num + 1,但是 ++num 写起来更简单。
使用口诀:先自加,后返回值
var num = 10;
alert(++num + 10); // 21


3.2 递增运算符
2. 后置递增运算符
num++ 后置递增,就是自加1,类似于 num = num + 1 ,但是 num++ 写起来更简单。
使用口诀:先返回原值,后自加
var num = 10;
alert(10 + num++); // 20

后置:先原值运算,后自加(先人后己) 
前置:先自加,后运算(先已后人)

image

image

console.log('12' - 11); //隐式转换,js自带的,表达式中会把字符串和数字,它自动计算为数值结果。
        console.log(18 == '18'); //true 相等,隐式转换,把'18'自动计算为18 ==18 
        console.log(18 === '18'); //false

image

image

5.3 逻辑非 !
逻辑非(!)也叫作取反符,用来取一个布尔值相反的值,如 true 的相反值是 false
var isOk = !true;
console.log(isOk); // false

5.4 短路运算(逻辑中断)
短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值;

1. 逻辑与  语法: 表达式1 && 表达式2  如果第一个表达式的值为真,则返回表达式2  如果第一个表达式的值为假,则返回表达式1
console.log( 123 && 456 ); // 456
console.log( 0 && 456 ); // 0
console.log( 123 && 456&& 789 ); // 789

5.4 逻辑中断(短路操作)
2. 逻辑或
语法: 表达式1 || 表达式2  如果第一个表达式的值为真,则返回表达式1  如果第一个表达式的值为假,则返回表达式2

语法: 表达式1 || 表达式2  如果第一个表达式的值为真,则返回表达式1  如果第一个表达式的值为假,则返回表达式2
console.log( 123 || 456 ); // 123
console.log( 0 || 456 ); // 456
console.log( 123 || 456 || 789 ); // 123

 var num = 0;
        console.log(123 || num++); //123
        console.log(num); //0 ,因为123|| 返回就不运行 num++了

image

一元运算符里面的逻辑非(!)优先级很高
 逻辑与比逻辑或优先级高(&& > ||)

    /* 左边为真 && 返回表达式2   
        左边为假返回,返回表达式1
        为真,肯定要看右边所以返回右边的,


        左边为真,返回表达式1||
        左边为假返回表达式2
        这是或,所以左边为真返回的就是表达式1
        左边为假,了就要看右边了,返回表达式2,
        总体感觉,要看哪边才能判断才能确定值,就返回哪边。
               */
        console.log(4 >= 6 || '人' != '阿凡达' && !(12 * 2 == 144) && true); //true//因为第一个false||返回它的右边,为
        var num = 10;
        console.log(5 == num / 2 && (2 + 2 * num).toString() === '22'); //true

  var a = 3 > 5 && 2 < 7 && 3 == 4;
        console.log(a); //false

        var b = 3 <= 4 || 3 > 1 || 3 != 2;
        console.log(b); //true

        var c = 2 === "2";
        console.log(c); //false

        var d = !c || b && a;
        console.log(d); //true

image

JS 语言提供了两种分支结构语句
 if 语句
 switch 语句
案例:
接收用户输入的年份,如果是闰年就弹出闰年,否则弹出是平年
① 算法:能被4整除且不能整除100的为闰年(如2004年就是闰年,1901年不是闰年)或者能够被
400 整除的就是闰年
② 弹出prompt 输入框,让用户输入年份,把这个值取过来保存到变量中
③ 使用 if 语句来判断是否是闰年,如果是闰年,就执行 if 大括号里面的输出语句,否则就执行 else
里面的输出语句
④ 一定要注意里面的且 && 还有或者 || 的写法,同时注意判断整除的方法是取余为 0


var year = prompt("请输入今年是多少年");
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            alert('这是闰年')
        } else {
            alert('这是平年')
        }

image
image

 var score = prompt("请输入多少分");
        if (score >= 90) {
            alert('A')
        } else if (80 <= score && score < 90) {
            alert('B')
        } else if (score >= 70 && score < 80) {
            alert('c')
        } else if (score >= 60 && score < 70) {
            alert('D')
        } else {
            alert('E')
        }

image

三元表达式
表达式1 ? 表达式2 : 表达式3;
如果表达式1为 true ,则返回表达式2的值,如果表达式1为 false,则返回表达式3的值

用户输入数字,如果数字小于10,则在前面补 0 ,比如01,09 ,如果数字大于10,则不需要补,比如 20。

 var time = prompt('请输入0·59之间的一个数字');

        // 三元表达式: 表达式1? 表达式2: 表达式3(如果表达式1为true,则返回表达式2, 如果表达式1为false则返回表达式3)
        var result = time < 10 ? '0' + time : time; // 把返回值赋值给一个变量
        alert(result);

image

案例:用户在弹出框里面输入一个水果,如果有就弹出该水果的价格, 如果没有该水果就弹出“没有此水果”。
 var fruit = prompt('请输入你想要查询的水果');

        switch (fruit) {
            case '苹果':
                alert('苹果不好吃,3.5元/斤');
                break;
                //注意: 执行case 里面的语句时,如果没有break,则继续执行下一个case里面的语句.
                //假如我苹果这里没有break,我就会弹出苹果不好吃之后又弹出香蕉,我会遇到更好的人
            case '香蕉':
                alert('香蕉,我会遇到更好的人,4块钱/斤');
                break;
            case '荔枝':
                alert('为什么我会特别想一个,比之前其他还想,荔枝不值钱');
                break;
            case '梨汁':
                alert('为什么我会想一个,因为我现在过的不心,过得有,才会想,因为曾经给过我温暖。嘿嘿再见梨汁。')
                break;
            default:
                alert('你输入有误');
        }

image

3. JS 中的循环
在Js 中,主要有三种类型的循环语句:
 for 循环
 while 循环
 do...while 循环

image

image

for (var i = 0; i < 3; i++) {
            console.log('你是笨蛋');
            console.log(i);
        }
        console.log(i); //三次笨蛋,结果为3,因为当我运行为2的时候满足,i++返回值,为3,判断不成立,
        //就直接退出循环
        var a = 1;
        console.log(a++); //1先返回1的值,然后再出来以后其实a的值已经变为2了
        console.log(a); //2
        var b = 1;
        console.log(--b); //0,先-1,在打印出来就是0了
        for (var j = 0; j < 3; ++j) {
            console.log('你是傻瓜吗?');
            console.log(j);
        }
        console.log(j); //三次傻瓜,结果为3,同理,此时的也是一样虽然先++,再返回返回值当然还是加一了喽。
        //总结: 当他判断是不成立的时候,就直接退出整个循环体了,包括怎么个for循环了,还有i++,
        //只要它跳到判断条件那里跳出来,它其实都已经加了,但是当它还在右边括号的时候就是没有加。
        // --j它直接就是先减了,再返回值了。

结果图
image

image

不懂啊这个调试

  for (var i = 1; i <= 100; i++) {
            if (i == 1) {
                console.log('这孩子今年刚出生');
            } else if (i == 100)
                console.log('这孩子马上死了');
            else {
                console.log('这孩子今年' + i + '岁');
            }
        }

image

3.2 双重 for 循环语法
for (外循环的初始; 外循环的条件; 外循环的操作表达式) {
 for (内循环的初始; 内循环的条件; 内循环的操作表达式) { 
 需执行的代码;
 }
 
}

 内层循环可以看做外层循环的语句
 内层循环执行的顺序也要遵循 for 循环的执行顺序 
 外层循环执行一次,内层循环要执行全部次数


3.4 打印五行五列星星
var star = '';
        for (var i = 0; i <= 4; i++) {
            for (var j = 0; j <= 4; j++) {
                star += '*';
            }
            //每次满5个星星 就 加一次换行
            star += '\n';
        }
        console.log(star);

image

image

while 语句可以在条件表达式为真的前提下,循环执行指定的一段代码,直到表达式不为真时结束循环。 while语句的语法结构如下:
while (条件表达式) {
 // 循环体代码
}
注意:
① 使用 while 循环时一定要注意,它必须要有退出条件,否则会成为死循环
② while 循环和 for 循环的不同之处在于 while 循环可以做较为复杂的条件判断,比如判断用户名和密码

image

var result = prompt('请输入我爱你');
        while (result !== '我爱你') {
            prompt('请输入我爱你')
        }

image


  do {
            var result = prompt('你爱我吗');
        } while (result !== '我爱你')
			
			do {
 var love = prompt('你爱我吗?');
} while (love != '我爱你')
alert('登录成功');

image

1.正式js

函数的概念
在 JS 里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。
虽然 for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用 JS 中的函数。
函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。

image
image

image

image
image
image
image

 function sum(num1, num2) {
            console.log(num1 + num2);
        }
        sum(100, 200); //  300 个数相等输出对应值,形参不用声明,直接传值,
        //形参默认值是undefined,当传入值的时候就知道是什么类型了
        sum(100, 400, 500, 600);//500
        sum(200)//NaN

image

 function sum() {

            console.log('傻逼');
        }
        sum(1);//结果傻逼

image

image

 function sum() {
            console.log('666');
            return 666;
        }
        sum();//666
        console.log(sum());//666 666

//利用函数求任意两个数的最大值
        function getMax(num1, num2) {
            return num1 > num2 ? num1 : num2;
        }
        console.log(getMax(1, 2));//2
        console.log(getMax(22, 1));//22

 //案例 2:利用函数求任意一个数组中的最大值
        function getMaxFromArr(numArray) {
            var maxNum = 0;
            for (var i = 0; i < numArray.length; i++) {
                if (numArray[i] >= maxNum) {
                    maxNum = numArray[i]
                }
            }
            return maxNum;
        }
        var numArr = [1, 2, 3, 4, 5, 6]
        var result = getMaxFromArr(numArr) //这个实参是个数组
        alert('这个数组的最大值为' + result)


image

 function add(num1, num2) {
            return num1 + num2;
            alert('我在return之后,不会被执行')
        }
        var result = add(10, 20)
        console.log(result);

image

 function add(num1, num2) {
            return num1, num2;
        }
        var result = add(1, 2)
        console.log(result); //2

 // 案例:创建一个函数,实现两个数之间的加减乘除运算,并将结果返回
        var a = parseFloat(prompt('请输入一个数'));
        var b = parseFloat(prompt('请输入另外一个数'));

        function count() {
            var arr = [a + b, a - b, a * b, a / b];
            return arr;
        }
        var result = count(a, b); //  结果:[3, -1, 2, 0.5] 当我传入实参时,形参那没有,但是还是传入了,还是可以计算,因为里面有内置对象arguments,伪数组。往下看。
        //估计是因为我的a,b,在外面定义了。所以传入的时候,直接可以传入到函数里面。
        console.log(result);

4. 函数的返回值
 4.4 函数没有 return 返回 undefined
函数都是有返回值的
1. 如果有return 则返回 return 后面的值
2. 如果没有return 则返回 undefined

4. 函数的返回值
 4.5 break ,continue ,return 的区别
 break :结束当前的循环体(如 for、while)  continue :跳出本次循环,继续执行下次循环(如 for、while)  return :不仅可以退出循环,还能够返回 return 语句中的值,同时还可以结束当前的函数体内的代码

image

重点 arguments-参数

image

function arg() {
            return arguments;
        }
        // 案例:利用函数求任意个数的最大值
        var arr = [1, 2, 3]
        var result = arg(arr)
        console.log(result);

结果图

image

 // 案例:利用函数求任意个数的最大值
        function maxValue() {
            var max = arguments[0];
            for (var i = 0; i < arguments.length; i++) {
                if (max < arguments[i]) {
                    max = arguments[i]
                }
            }
            return max
        }
        var a = [1, 2, 3, 4]
        var b = [3, 2, 1, 6, 9]
        var resultA = maxValue(a);
        var resultB = maxValue(b);
        console.log(resultA); //因为传入的是数组,它进去之后保存的估计是,[[a,b]]返回出来,当然还是原来的数组
        console.log(resultB);
        console.log(maxValue(2, 3, 4, 5)); //传入的会保存为 伪数组[2,3,4,5]所以返回的就是5

//案例 1: 利用函数封装方式,翻转任意一个数组
 function reverse(arr) {
            var newArr = [];
            for (var i = arr.length - 1; i >= 0; i--) {
                newArr[newArr.length] = arr[i]
            }
            return newArr
        }
        var result = reverse([1, 2, 3, 4, 5])
        console.log(result);

//案例 2: 利用函数封装方式,对数组排序 -- 冒泡排序
        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 tem = arr[j]

                        arr[j] = arr[j + 1];
                        arr[j + 1] = tem
                    }
                }
            return arr
        }

        console.log(sort([5, 2, 9, 1, 4])); //[1, 2, 4, 5, 9]


       // 要求:输入一个年份,判断是否是闰年(闰年:能被4整除并且不能被100整数,或者能被400整除)
        function isRun(year) {
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag
        }
        console.log(isRun(2010));
        console.log(isRun(2004));

        /*
一、区别: != 会转换成相同类型 进行比较,!== 除了比对值还比对类型。

二、各自的解释

1、!= 在表达式两边的数据类型不一致时,会隐式转换为相同数据类型,然后对值进行比较;

2、!== 不会进行类型转换,在比较时除了对值进行比较以外,还比较两边的数据类型, 它是恒等运算符===的非形式。
-----------------------------------------------------------------------
1、用法

都是用来比较值的。

2、比较过程

!= 比较时,若类型不同,会偿试转换类型;

!== 只有相同类型才会比较。

3、比较结果

!=返回同类型值比较结果 ;

!== 不同类型不比较,且无结果,同类型才比较;
///////////

== 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 。

而=== 和 !== 只有在相同类型下,才会比较其值。

== equality 等同,=== identity 恒等。

==, 两边值类型不同的时候,要先进行类型转换,再比较。

===,不做类型转换,类型不同的一定不等。

“=”:这个表示赋值,不是表示运算符

“==”:表示等于(值)

“===”:表示全等于(类型和值)
        */

image

image
image
image

image

image

然后那些什么变量啊,数组对象啊,它就是存这些数据的一种方式而已啊,
比如说这个变量,它就是个普通的盒子,
数组啊,它是一个大盒子,它可以装好多,
那对象呢,对象是一个怪异的盒子,啥都啥啥都能装。


2. 创建对象的三种方式
在 JavaScript 中,现阶段我们可以采用三种方式创建对象(object):
 利用字面量创建对象
 利用 new Object 创建对象
 利用构造函数创建对象

2.1 利用字面量创建对象

对象字面量:就是花括号 { } 里面包含了表达这个具体事物(对象)的属性和方法。
{ } 里面采取键值对的形式表示
 键:相当于属性名
 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)

var star = {
 name : 'pink',
 age : 18,
 sex : '男',
 sayHi : function(){
 alert('大家好啊~');
 }
};

image

 /*
                                对象什么都能装大盒子,还可以装一个方法,
                                name
                        键:值
                        键:相当于属性名
                        值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等
                        记得用逗号隔开。
                        调用的时候是star.name//结果是pink
                        方法是调用:star.sayHi()必须加括号
方法:对象里面的函数称为方法,方法不需要声明,
使用“对象.方法名()”的方式就可以调用,方法用来描述该对象的行为和功能。

                                */
//利用字面量创建对象
        var star = {
            name: 'pink',
            age: 18,
            sex: '男',
            sayHi: function() {
                alert('大家好呀~')
            }
        }
        console.log(star.name);//调用名字属性
        console.log(star['name']);// 调用明泽属性
        star.sayHi();//调用 syaHi方法,注意,一定不要忘记带后面的括号。

image
image

// 利用new Object创建对象
        // var andy = new Object()
        //感觉它们都是js分装的一个方法,一个是数组方法里面有push,top,等,一个是对象方法

        console.log(Object);
        console.log(Object());
        console.log(Array);
        console.log(Array());

image

// 利用new Object创建对象
        var andy = new Object();
        andy.name = '笨蛋';
        andy.age = 1000;
        andy.hight = '1米5';
        andy.sayHi = function() {
            console.log('你好呀~大聪明!!');
        }
/*
2.2 利用new Object创建对象
Object() :第一个字母大写 
 new Object() :需要 new 关键字
 使用的格式:对象.属性 = 值;
*/

image

//2.3 利用构造函数创建对象
 function Person(name, age, sex) {
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.sayHi = function() {
                console.log('我的名字叫:' + this.name + ',我的性别是:' + this.sex + ',我的年龄是:' + this.age);
            }
        }
        var baiDu = new Person('傻逼', 20, '男');
        var xiaoHong = new Person('小红', 30, '女');
        console.log(baiDu.sayHi());
        console.log(xiaoHong.sayHi());
/*
注意
1. 构造函数约定首字母大写。 2. 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
3. 构造函数中不需要 return 返回结果。
4. 当我们创建对象的时候,必须用 new 来调用构造函数。
*/
 function Person(name, age, sex) {
            console.log(this); //构造函数里面的this指的是当前Person的全部属性还有方法
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.sayHi = function() {
                console.log('我的名字叫:' + this.name + ',我的性别是:' + this.sex + ',我的年龄是:' + this.age);
                console.log(this); //构造函数里面的this指的是当前Person的全部属性还有方法
            }
        }
        var baiDu = new Person('傻逼', 20, '男');
        var xiaoHong = new Person('小红', 30, '女');
        console.log(baiDu.sayHi());
        console.log(xiaoHong.sayHi());

        function person(a, b, c) {
            console.log(this); //指全局变量
        }
        person()

结果截图好好体会
image

image

image

image

image


小结
1. 对象可以让代码结构更清晰
2. 对象复杂数据类型object。
3. 本质:对象就是一组无序的相关属性和方法的集合。
4. 构造函数泛指某一大类,比如苹果,不管是红色苹果还是绿色苹果,都统称为苹果。
5. 对象实例特指一个事物,比如这个苹果、正在给你们讲课的pink老师等。
6. for...in 语句用于对对象的属性进行循环操作。

image

var object = {
            name: '小小红',
            age: '30',
            sex: '女',
            sayHi: function() {
                alert('你是鬼~')
            }
        }

        for (var k in object) {
            console.log(k); //这里的 k 是属性名,全部打印出来。按照先打属性名,下面就打属性值,
            console.log(object[k]); //这里的 obj[k] 是属性值,打印出全部属性值。
            /*
这里先打印name,然后打印出它的值
            */
        }

image

  var object = {
            name: '小小红',
            age: '30',
            sex: '女',
            sayHi: function() {
                alert('你是鬼~')
            }
        }
//不可以写成 k=2啊这些,它还是默认从头到尾全部遍历,
  //也不能直接写object[2]结果是undefined
        for (var k in object) {
            //console.log(k); //这里的 k 是属性名,全部打印出来。按照先打属性名,下面就打属性值,
            console.log(object[k]); //这里的 obj[k] 是属性值,打印出全部属性值。
            /*
这里先打印name,然后打印出它的值
            */
        }

image

image

image

文档:[MDN: https://developer.mozilla.org/zh-CN/](MDN: https://developer.mozilla.org/zh-CN/)
(文档可以查询HTML、CSS 和万维网及
HTML5 应用的 API)

image

// 案例:封装自己的数学对象
// 利用对象封装自己的数学对象 里面有 PI 最大值和最小值
 var maxPiMeth = {
            maxPi: Math.PI,
            minpi: 3.14
        }
        console.log(maxPiMeth.maxPi);
        console.log(maxPiMeth.minpi);

image

 var min = parseFloat(prompt('请一个最小值'));

        var max = parseFloat(prompt('请输入一个最大值'));

        alert('随机数为:' + getRandom(min, max));

        // 得到一个两数之间的随机整数,包括两个数在内
        function getRandom(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
4. 日期对象
4.1 Date 概述
 Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用
 Date 实例用来处理日期和时间

image

image

//输出当前日期
// 请写出这个格式的日期:2019年8月8日 星期四
   // 请写出这个格式的日期:2019年8月8日 星期四
        var now = new Date()
        console.log(now.getFullYear() + '年' + now.getMonth() + '月' + now.getDate() + '日 ' + '星期' + now.getDay());

image

 var now = new Date();
        console.log(now.valueOf()); // valueOf()返回于1970年1月1日(世界标准时间)起的毫秒数
        console.log(now.getTime()); //getTime()这个也是得到毫秒数
        var now = +new Date();
        console.log(now); // +new Date()是时间戳,反正相当于valueOf()

        var now = Date.now();
        console.log(now); // Date.now()=valueOf()

        var now = Date.now()
        console.log(typeof(Date)); //function 一个函数   Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用

        var myDate = new Date();

        var a = myDate.toLocaleDateString(); //转换为当地时间用字符串表示
        console.log(typeof(a)); //string

        var boo = new Boolean(false); //给Boolean原始值赋值为false
        document.write(boo.valueOf()) //在 document写出了它的值 为false,
            //valueOf() 方法可返回 Boolean 对象的原始值。
        console.log(document); //document是window对象下面的子对象,
        //他指的是页面中工具栏以下的空白区域的位置
        /*
document
理解为整个HTML文档就好了。
在JS里,通过这个来对整个HTML文档内容进行操作。大概就是这么回事了。
        */
        console.log(typeof(document)); //对象 object
        console.log(typeof(document.write)) //是个函数,应该是封装的

        /*
时间戳(timestamp),
一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,
通常是一个字符序列,唯一地标识某一刻的时间。也就是某一段时间---1970年1月1日到今天现在的这一段时间。
       总结:
var date = new Date('2014-04-23 18:55:49:123');
// 有三种方式获取
// 精确到毫秒
var time1 = date.getTime();
console.log(time1);//1398250549123
// 精确到毫秒
var time2 = date.valueOf();
console.log(time2);//1398250549123
// 只能精确到秒,毫秒用000替代
var time3 = Date.parse(date);
console.log(time3);//1398250549000
*/
        var time3 = Date.parse(Date()) //parse:从语法上分析。
        console.log(typeof(Date.parse)); // function, Date.parse()得到的是number
        /*是个函数,从语法上解析,比如是将字符串数字转换为浮点数
parseFloat("123.456") //返回number对象
*/
        console.log(time3);
        // 扩展
        // 时间戳转换成日期。 记住获取当月时间是(0-11) getDay()获取星期几(周日0到周六6)以后正常算可以 +1

        var date = new Date();

        function formatDate(date) {
            var y = date.getFullYear();
            var m = date.getMonth() + 1;
            m = m < 10 ? '0' + m : m
            var d = date.getDate();
            d = d < 10 ? '0' + d : d;
            return y + '年-' + m + '月-' + d + '日';
        }
        console.log(formatDate(date)); // 结果:2021年-11月-23日
        console.log(typeof(date)); //对象, Date对象是个构造函数,必须实例化来使用。实例化就是new一下。

结果截图
image

时间戳的其他使用请看参考链接:

https://blog.csdn.net/weixin_33711647/article/details/88069850

image

//es6语法
 console.log("hello" + 123 + "world !");//hello123world !
        console.log(`hello ${123} world !`);// hello 123 world !
        /* `和'的区别 */

image

//倒计时
<body onload="countTime()">
    <div>
        <span id="_d">00</span>
        <span id="_h">00</span>
        <span id="_m">00</span>
        <span id="_s">00</span>
    </div>
    <script>
        // 想要实现动态显示,输入50秒,然后从现在开始倒计时。
        var result1 = parseFloat(prompt('请输入倒计时秒数:')) * 1000;

        var date = new Date()
        var result2 = date.valueOf();
        var result3 = result2 + result1 //现在的时间加上输入的想要倒计时的秒数。
            // 第一次实现 只调用一次。result3应该不变。实现到输出result1的时候,result3是固定的
        function countTime() {
            // 从调用开始,result4应该一直在改变
            var date = new Date() //外面实例化的到里面也必须实例化
            var result4;
            result4 = date.valueOf()
            var sum = result3 - result4; // 可以直接写为 Date.now()
            console.log(Date.now());
            var d, h, m, s;
            if (sum >= 0) {
                d = parseInt(sum / 1000 / 60 / 60 / 24); // 1000毫秒= 1s, 60s=1min/   总秒数 /60变成分钟/60 变成h/24 变成天
                h = parseInt(sum / 1000 / 60 / 60 % 24); //总秒数 /60变成分钟/60 变成h%24 取的是多出来的变成小时的那部分,比如
                // %60是对60取余  获得60秒以内的秒数;比如80秒  该显示1:20  80%60==20;取后面的20秒
                m = parseInt(sum / 1000 / 60 % 60); //变成 分钟,再对分钟取余,得到的就是多出来的min
                s = parseInt(sum / 1000 % 60); //多出的就是 s,parseInt取整数= 可以写为向下取整Math.floor。
                setTimeout(countTime, 1000); //每1秒调用一下countTime函数
            } else {
                alert('倒计时结束')
            }
            //将倒计时赋值到div中
            document.getElementById('_d').innerHTML = d + '天';
            document.getElementById('_h').innerHTML = h + '时';
            document.getElementById('_m').innerHTML = m + '分';
            document.getElementById('_s').innerHTML = s + '秒';
            // 递归每秒调用 countTime方法,显示动态时间效果
			//自举,师傅说,为什么我觉得不是递归呢,因为在setTimeout之前,
			//原来的函数就已经return 了,递归一般是原函数不return 然后调用
			//内存上 递归是会形成一个调用栈的

        }
    </script>

结果截图
image

setInterval 用法

参考链接:
https://www.cnblogs.com/sunhaoyu/p/8780909.html

  <!-- <p>点击按钮,等待3秒会弹出 "hellow"。</p>
    <p>在弹出的对话框中点击 "确定", 3秒后会继续弹出。如此循环下去</p>
    <button onclick="myFunction()">点我</button> -->

    <script>
        //01,每三秒(3000 毫秒)弹出 "Hello" : 
        /*
         function myFunction() {
             setInterval(function() {
                 alert('Hello');
             }, 3000)
         } */

// 可以通过调用一个已命名的函数,每三秒(3000 毫秒)弹出 "Hello":
       /* function myFunction() {
            var myVar = setInterval(alertFunc, 3000);
        }

        function alertFunc() {
            alert('hello!');
        }*/

        // 03,显示当前时间( setInterval() 方法会每秒执行一次函数,类似手表功能):

    </script>
 // 03,显示当前时间( setInterval() 方法会每秒执行一次函数,类似手表功能):
        var myVar = setInterval(function() {
            myTimer()
        }, 1000);

        function myTimer() {
            var d = new Date();
            var t = d.toLocaleDateString();
            document.getElementById('demo').innerHTML = t;
            console.log('慢慢来总会变好的。');
        }

//04,使用 clearInterval() 来停止 setInterval 的执行:
        var myVar = setInterval(function() {
            myTimer()
        }, 1000);

        function myTimer() {
            var d = new Date();
            var t = d.toLocaleDateString();
            document.getElementById("demo").innerHTML = t;
        }

        function myStopFunction() {
            clearInterval(myVar);
        }



//05,使用 setInterval() 和 clearInterval()来创建动态进度条:
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
</head>
<style>
    #myProgress {
        width: 100%;
        height: 30px;
        position: relative;
        background-color: #ddd;
    }
    
    #myBar {
        background-color: #4CAF50;
        width: 10px;
        height: 30px;
        position: absolute;
    }
</style>

<body>

    <h1>JavaScript 进度条</h1>

    <div id="myProgress">
        <div id="myBar"></div>
    </div>

    <br>
    <button onclick="move()">点我</button>

    <script>
        function move() {
            var elem = document.getElementById("myBar");
            var width = 0;
            var id = setInterval(frame, 10);

            function frame() {
                if (width == 100) {
                    clearInterval(id);
                } else {
                    width++;
                    elem.style.width = width + '%';//为什么要加百分号
                }
            }
        }
    </script>

</body>

</html>

image

image

 var arr = [1, 23];
        var obj = {};
        console.log(arr instanceof Array);//true
        console.log(obj instanceof Array);//false
        console.log(Array.isArray(arr));//true
        console.log(Array.isArray(obj));//false

image
案例

 // 有一个包含工资的数组[1500, 1200, 2000, 2100, 1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面
        var arr = [1500, 1200, 2000, 2100, 1800];
        var newArr = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] < 2000) {
                newArr.push(arr[i])
            }
        }
        console.log(newArr);

image

var arr = [1, 64, 9, 6];
        arr.sort(function(a, b) {
            return a - b; //a-b<0   => 升序  小于0降序
            // return b-a; //b-a > 0,=> 降序  大于0升序
        })
        console.log(arr); // [1, 6, 9, 64]
        //倒置
        arr.reverse();
        console.log(arr); //  [1, 6, 9, 64]

image

var arr = [1, 64, 9, 6, 1];
        console.log(arr.indexOf(1)); // 0 不存在返回-1
        console.log(arr.lastIndexOf(1)); // 4 不存在返回-1

// 案例

 // 有一个数组[‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’],要求去除数组中重复的元素。
        var arr = [`c`, `a`, `z`, `a`, `x`, `a`, `x`, `c`, `b`];
        var newArr = [];
        // 为什么我双重循环就不行呢?
        /*for (var i = 0; i < arr.length; i++) {
            for (var j = 0; j <= newArr.length; j++) {
                if (arr[i] !== newArr[j]) {
                    newArr.push(arr[i])
                }
            }
        }
        console.log(newArr);*/

        for (var i = 0; i < arr.length; i++) {
            if (newArr.indexOf(arr[i]) == -1) {
                newArr.push(arr[i])
            }
        }
        console.log(newArr);

 // 有一个数组[‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’],要求去除数组中重复的元素。
        var arr = [`c`, `a`, `z`, `a`, `x`, `a`, `x`, `c`, `b`];
        var newArr = [];

        // let a = new Set();
        // arr.forEach(el => a.add(el));

        for (var i = 0; i < arr.length; i++) {
            if (newArr.indexOf(arr[i]) == -1) {
                newArr.push(arr[i])
            }
        }
        console.log(newArr);


 // 有一个数组[‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’],要求去除数组中重复的元素。
         
        var arr = [`c`, `a`, `z`, `a`, `x`, `a`, `x`, `c`, `b`];
        //第一次遍历数组
        for (var i = 0; i < arr.length; i++) {
            //第二次遍历数组,是第一遍历数组下标的下一个数据
            for (var k = i + 1; k < arr.length; k++) {
                //判断第一层遍历数据和第二层遍历的数据是否相同
                if (arr[i] == arr[k]) {
                    //如果数据相同则通过splice删除一条相同的数据
                    arr.splice(i, 1) //这个你应该懂吧
                        //i是第一层遍历的下标,因为上一步删除了一条数据,所以下标也需要减一,否则实际下标,要比数组中的数据更多
                    i--;
                    //k 也同样需要和i一样减一,保持遍历依旧同步判断
                    k--;
                }
            }
        }
        //去重完成以后,数组数据在控制台输出
        console.log(arr) //记得,是这样打印,字母不要写错了

image
'''
reduce includes 还有那些奇奇怪怪的
'''

image

image

image

 var str = 'andy';
        console.log(str.length); //4,因为js会把他包装,类似下面的。

        //  1. 生成临时变量,把简单类型包装为复杂数据类型
        var tem = new String('andy')
            // 2. 赋值给我们声明的字符变量
        str = tem; //这样str 就有了属性和方法。
        // 3. 销毁临时变量
        tem = null;
字符串的所有方法都不会改变他本身(字符串是不可变的因为他只是开辟了另外的内存,指针发生改变了)操作完成后会返回新的字符串。

image

  // 查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
        var str = 'abcoefoxyozzopp'
        var j = str.indexOf('o', 0)
        while (j !== -1) {
            console.log(j);
            j = str.indexOf('o', j + 1);
        }

image

   // 查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
        var str = 'abcoefoxyozzopp'
        console.log(str.charAt(0)); //a
        console.log(str.charCodeAt(0)); // 97
        console.log(str[0]); // a

image

image

image

posted @ 2021-11-18 13:17  LuDuo  阅读(68)  评论(0编辑  收藏  举报