日期时间对象
1.js内置对象Date用来管理日期和时间的2.它提供了很多方法 用来获取和计算时间3.首先要创建时间对象,Date构造函数,可以有参数4.如果不传参数,则表示系统当前时间对象
var d = Date();
console.log(d);
console.log(d.toString());
console.log(d.toLocaleString());
// 以上都是打印一个系统本地时间
// 指定时间
var d = new Date(2021,5,17,20,20,20);
console.log(d);
// 分别查看某个一部分的值,年份,月份,日期,星期,时,分,秒
console.log(d.getFullYear()); // 输出年份
console.log(d.getMonth()); // 输出月份,自定义当前月份的时候需要减一
console.log(d.getDate()); // 输出日期(几号)
console.log(d.getDay()); // 输出星期几 四 (定义星期的时候星期天为0)
console.log(d.getHours()) // 输出小时
console.log(d.getMinutes()); // 输出分钟
console.log(d.getSeconds()); // 输出秒
时间戳
```
var d = new Date();
console.log(d.getTime());//返回一个时间戳(unix)16239048...返回的是毫秒
```
案例计算时间差:计算北京奥运会距离现在过去了多少天 // 2008-8-8至2021-6-17
var a1 = new Date(2008,7,8),
a2 = new Date();//没有参数表示返回当前系统的时间
var unix1 = a1.getTime(),
unix2 = a2.getTime();
var days = (unix2 - unix1) / 1000 / 60 / 60 /24;
console.log(Math.ceil(days)); //输出最后的结果 Math.ceil表示向上取整
还有一些取整值的方法
Math.ceil(num) 向上取整,取最近较大的值 3.14 取 4
Math.floor(num) 向下取整,直接舍弃掉小数部分 3.14 取 3
Math.round(num) 四舍五入取值 3.5 取 4
Math.max(数组)、Math.min(数组) 表示取一组数中最大值和最小值,这里是挨个传参,在实际使用中,往往是求数组中的最大值和最小值,借用展开语法,使用...
Math.max(...arr) 这里的arr表示是一个变量名,并不是挨个出传入一组数组,所以需要借用展开语法...
Math.random() 取随机数或者随机字符串,随机生成一个0-1之间的数字
Math.floor(Math.random()*10)+1 也可以随机生成1-10之间的随机数 Math。floor表示向下取整,后面+1表示包括了10
Math.ceil(Math.random()*10) 也是随机生成1-10之间的随机数,而Math.ceil表示向上取整,不用+1,10也能取到随机数里面
随机生成一个数组
```
var arr = ['a','b','c','d'];
var i = Math.floor(Math.random()*arr.length);
console.log(arr[i]);
可以将字符串替换成名字,生成一个随机的点名功能
拓展:定时器 seInterval("代码","时间间隔");括号里面有两个值,一个是要执行这个定时器的代码,一个是时间间隔的毫秒
```
随机点名
setInterval(function () {
// 随机点名
var names = ['忘了屏', '五集采', '武汉', '路演', '可似景', '徐冰'];
var i = Math.floor(Math.random() * names.length); // 0, arr.length - 1
// console.log(names[i]);
cont.innerHTML = names[i];
}, 1000);
引用类型
js中的数据类型:
number,boolean,string 属于单一类型,基本类型
object(对象,数组,null) 属于复合类型,引用类型
不同类型的数据,在操作时,(赋值,比较,传参)有不同的行为;
赋值操作:
基本类型数据都是单一值,在内存中所占的空间比较小,因此,赋值时会单独的创建副本,也就是两个值,相互不影响
引用类型是复合数据,往往比较大,会占用一定的内存空间,因此 赋值时,它只是复制地址,相同的地址对应同一个内存中的值(就是同一个,没有发生复制创建副本),接下来,无论谁修改内存中的值,都会影响另一个对象
//基本类型数据的赋值操作
```
var a = 1;
var b = a; //把a的值拷贝一份 赋值给b,内存中有2个值,互不影响的
a = 2;
console.log(b); //打印结果为1
```
//引用类型的赋值操作
```
var lucy = {
name:"lucy",
sex:"female",
age:18
}
//通过赋值创建一个相同的对象
var lily = lucy;//拷贝了lucy对象的地址,也叫引用地址,始终是对应的是同一个对象
//修改lily的名字
lily.name = "lily";
console.log(lily);
console.log(lucy);//两个输出的name都是lily
```
//比较运算:==
引用类型检测是否相等,一个简单和粗暴的标准是否是同一个(相互引用)
基本类型数据,只要值相同"=="就为true
引用类型数据,内存中的两个对象,永远不相等,通过赋值来引用同一个对象,才能相等,因为是引用的同一个对象
//传参操作:
基本类型数据,如何传参和赋值是一样的,将实参的值(全局变量)拷贝一份给形参(局部变量),它两不是同一个,局部 = 全局 因为是全局参数赋值给局部参数,作为基本类型的数据,相互不影响
引用类型的传参:
只要函数体内修改对象,就会影响外部全局的对象
数组的排序
将数组中的元素,按照升序或者降序排列
1.冒泡排序:始终将最大的值冒泡排序到最后面
```
var arr = [8,7,6,5,4,3,2,1];
//先找到最大的数,放到最后,进行两两比较,最大的数永远在最后面,利用两个for循环,外层的for用于循环多次判断数组的两两大小,里面的for循环用于判断前后两个数,也就是两两对比,大的值就对调位置,再用if用于判断,里面申明一个新的变量接收对调的值的临时存放,最终完成对调
for(var j = 0; j < arr.length -1; j++){
for(var i = 0; i < arr.length - 1 - j; i++){
if(arr[i] > arr[i+1]){
var tmp;
tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
}
}
}
console.log(arr);
```
2.选择排序:将最小的数永远排序放在最后
```
var arr = [8,7,6,5,4,3,2,1];
// 要比较的数
for (var i = 0; i < arr.length - 1; i++) {
// i = 8 依次和后面的 7,6,5,4,3,2,1比较
for (var j = i + 1; j < arr.length; j++) {
// 如果这一轮中的某个值 比当前要比较的值小 则交换位置
if (arr[j] < arr[i]) {
var tmp;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
console.log(arr);
```
关于引用类型,以及基本类型总结:
// 数据类型 根据他们在操作时的不同行为 可以划分成:
// 1、基本类型的数据,也叫基本数据类型 单一值的数据类型 boolean string number
// 2、引用类型的数据,也叫复合类型数据 不但有值还有结构 object(Object,Array,null)
// 执行赋值(=)、比较(==)和传参时 表现不同的行为
// 基本类型的数据 内容都比较固定 例如 一个数值 最多只需要8个字节就足够存储 因此他们在赋值时会复制"值"的副本
// 而引用类型 例如对象 不仅有值还有方法 内容可能较大 如果赋值时再单独创建值的副本 就会显著占用内存,因此它赋值的是对象的地址
// 意味着 这两个变量引用了同一段地址对应的对象
// 区别是
// 基本类型赋值时 内存中 有2个值 互不影响
//引用类型赋值时 内存中 只有1个值 谁修改都会影响另一个