JavaScript(四)
JavaScript内置对象
可以使用MDN文档来查询JS的一些内置对象,网址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects
内置对象实际上就是一些已经设定好的方法什么的,我们可以直接拿过来用
一、Math对象
Math对象不是一个构造函数,所以我们不需要new来调用,直接使用里面的属性和方法即可。
1. max最大值和min最小值方法
console.log(Math.PI); //3.141592653589793
console.log(Math.max(1, 5, 567, 57)); //567
console.log(Math.max(23, 45, 56, 'zzy')); //如果有数字之外的就是NaN
console.log(Math.max()); //如果没有参数,那么返回-Infinity
console.log(Math.min(1, 5, 567, 57)); //1
2. 取绝对值abs
//绝对值
console.log(Math.abs(1)); //1
console.log(Math.abs(-1)); //1
console.log(Math.abs('-1')); //1 这里面有一个隐式转换,会把字符串1转换为数字1
console.log(Math.abs('zzy')); //NaN
3. 向下取整floor
//向下取整floor(地板)
console.log(Math.floor(1.1)); //1
console.log(Math.floor(1.9)); //1
4. 向上取整ceil
//向上取整ceil(天花板)
console.log(Math.ceil(1.1)); //2
console.log(Math.ceil(1.9)); //2
5. 四舍五入round
这里有一个需要注意的地方,如果遇到.5,默认应该是向数轴右侧进1,所以-1.5四舍五入应该是-1
console.log(Math.round(1.1)); //1
console.log(Math.round(1.9)); //2
console.log(Math.round(-1.1)); //-1
console.log(Math.round(-1.9)); //-2
console.log(Math.round(-1.5)); //-1 这个地方比较特殊,遇到.5都应该向数轴右侧进1
6. 随机数方法random()
如果没有其他操作,默认就是随机取一个[0,1)之间的浮点型小数
console.log(Math.random()); //随机取一个[0,1)之间的浮点型小数
随机取一个[min,max)之间的整数
这个数学公式不用纠结,会cv就行了
// 随机取一个[min,max)之间的整数
function getRandom1(min, max) {
// 随机取一个[min,max)之间的整数
return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
}
console.log(getRandom1(1, 10));
随机取一个[min,max]之间的整数
// 随机取一个[min,max]之间的整数
function getRandom2(min, max) {
// 随机取一个[min,max]之间的整数
return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
}
console.log(getRandom2(1, 10));
7. 猜数字游戏
function getNum(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var x = getNum(1, 10);
while (true) { //true就可以实现无限循环
var y = parseFloat(prompt('请输入一个1~10之间的整数:'));
if (y < 1 || y > 10) {
alert('输入有误!');
// continue; 其实这里不用写continue
}
else if (y < x) {
alert('猜小了!');
// continue;
}
else if (y > x) {
alert('猜大了!');
// continue;
}
else if (y == x) {
alert('恭喜你猜对了!');
break;
}
}
8. 猜数字游戏,猜十次猜不到就滚蛋
//猜数字,猜十次猜不到就滚蛋
function getNum(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var x = getNum(1, 10);
for (var i = 1; i <= 10; i++) {
var y = parseFloat(prompt('请输入一个1~10之间的整数:'));
if (y < 1 || y > 10) {
alert('输入有误!');
// continue; 其实这里不用写continue
}
else if (i == 10 && y != x) {
alert('次数用完!');
break;
}
else if (y < x) {
alert('猜小了!');
// continue;
}
else if (y > x) {
alert('猜大了!');
// continue;
}
else if (y == x) {
alert('恭喜你猜对了!');
break;
}
}
二、日期对象Date
和Math对象不同的是,Date对象是一个构造函数,要通过new来调用创建日期对象(必须要实例化)
如果没有参数,那么就返回系统的当前时间
var now = new Date();
console.log(now);
参数可以写字符型,也可以写字符串型
参数如果写字符型,会有一些小小的问题,输入6月返回的却是7月
var date1 = new Date(2022, 6, 27);
console.log(date1); //返回的是2022年7月27
但是如果写字符串型,就没有问题
var date2 = new Date('2022-6-27 10:59:59');
console.log(date2); //返回的是2022年6月27
1. 日期格式化
console.log(date2.getFullYear()); //返回的是日期的年
console.log(date2.getMonth() + 1); //返回的是日期的月,但是月份会小1月,要加1才行
console.log(date2.getDate()); //返回的是天
console.log(date2.getDay()); //0-6,周一返回1,周六返回6,但是周日返回0
console.log(date2.getHours());
console.log(date2.getMinutes());
console.log(date2.getSeconds());
那么我们来写一个2022年6月27日星期三:
这里如果星期几要搞成大写,可以建立一个数组,正好周日到周六也是0~6
//那么我们来写一个2022年6月27日星期三
var year = date2.getFullYear();
var month = date2.getMonth() + 1;
var date = date2.getDate();
var day = date2.getDay();
var days = ['日', '一', '二', '三', '四', '五', '六'];
console.log(year + '年' + month + '月' + date + '日' + '星期' + days[day]);
封装一个函数,返回当前的时分秒:
//封装一个函数,返回当前的时分秒
function getTime() {
var now = new Date();
var hour = now.getHours();
var minutes = now.getMinutes();
var seconds = now.getSeconds();
// 为了更好的视觉效果,如果小于10应该补0
if (hour < 10) {
hour = '0' + hour;
}
else if (minutes < 10) {
minutes = '0' + minutes;
}
else if (seconds < 10) {
seconds = '0' + seconds;
}
return hour + ':' + minutes + ':' + seconds;
}
console.log(getTime());
当然,上面这个案例用三元运算符更好一些:
//封装一个函数,返回当前的时分秒
function getTime() {
var now = new Date();
var hour = now.getHours();
var minutes = now.getMinutes();
var seconds = now.getSeconds();
// 为了更好的视觉效果,如果小于10应该补0
hour = hour < 10 ? '0' + hour : hour;
minutes = minutes < 10 ? '0' + minutes : minutes;
seconds = seconds < 10 ? '0' + seconds : seconds;
return hour + ':' + minutes + ':' + seconds;
}
console.log(getTime());
2. 时间戳,获取当前距离1970年1月1日的总毫秒数
通过valueOf或者getTime来获取
var date = new Date();
console.log(date.valueOf());
console.log(date.getTime());
时间过去了,就再也不会回来!
更简单更常用的一种写法:
var date1 = +new Date('2022-6-29 4:10:10');
console.log(date1);
当然,还有H5新增的获取总毫秒数的写法:
console.log(Date.now());
3. 倒计时案例(重要)
1.输入未来活动开始时间减去现在的时间就是剩余时间,即倒计时,但是不能拿时分秒相减,比如05分减25分,结果是负的
2.用时间戳来做,用户输入时间的总毫秒数减去当前时间的总毫秒数,得到的就是倒计时的时间毫秒数
3.把倒计时的毫秒数转换为天时分秒,也就是把时间戳转换为时分秒。
4.如果不理解的话,仔细看我的注释
//倒计时案例
function countDown(time) {
var now = +new Date();
var future = +new Date(time);
var left = future - now;
var seconds = parseInt(left / 1000 % 60); //看看有多少个60s,剩下的不够60的才是应该显示的秒数
var minutes = parseInt(left / 1000 / 60 % 60); //看看有多少个60分钟,这里取整所以多余的秒扔掉,
// 剩下的不够60的是应该显示的分钟数,比如3661s是61分钟01秒,取整应该是61分钟,那么这里就显示1分钟
var hours = parseInt(left / 1000 / 60 / 60 % 24); //看看有多少个24小时,剩下不够24的是应该显示的小时数
var days = parseInt(left / 1000 / 60 / 60 / 24);
//自动补0
days = days < 10 ? '0' + days : days;
hours = hours < 10 ? '0' + hours : hours;
minutes = minutes < 10 ? '0' + minutes : minutes;
seconds = seconds < 10 ? '0' + seconds : seconds;
return days + '天' + hours + '小时' + minutes + '分' + seconds + '秒';
}
var result = countDown('2022-6-29 4:10:10');
console.log(result);
三、数组对象
还记得创建数组的第二种方式吗?
var arr = new Array();
实际上,这就是使用构造函数创建对象,Array是一个构造函数的名字,所以创建数组对象要new
1. 判断是否为数组
(1)instanceof运算符
//1. instanceof 运算符可以检测是否为数组
var arr = [];
console.log(arr instanceof Array); //true
var obj = {};
console.log(obj instanceof Array); //false
(2)Array.isArray(参数);
H5新增的语法, IE9以上版本支持
//2. Array.isArray(参数); H5新增的语法, IE9以上版本支持
console.log(Array.isArray(arr)); //true
console.log(Array.isArray(obj)); //false
2. 添加删除数组元素(重要)
(1)在数组后面添加元素:push
这里需要注意:
1.push可以在数组后面追加新的元素
2.push(参数);参数直接写要添加的数组元素就可以
3.push结束后,返回的是新数组的长度
4.原数组会发生相应的变化
var arr = [4, 5, 6];
arr.push('zzy', 8);
// console.log(arr.push('zzy', 8)); //返回的是数组长度5
console.log(arr); //[4,5,6,'zzy', 8]
(2)在数组前面添加元素:unshift
这里需要注意:
1.unshift可以在数组后面追加新的元素
2.unshift(参数);参数直接写要添加的数组元素就可以
3.unshift结束后,返回的是新数组的长度
4.原数组会发生相应的变化
var arr = [4, 5, 6];
arr.unshift('zzy', 8);
// console.log(arr.push('zzy', 8)); //返回的是数组长度5
console.log(arr); //['zzy', 8,4,5,6,]
(3)删除数组最后一个元素:pop
1.pop是删除数组的最后一个元素,一次只能删除一个元素
2.pop(),没有参数,直接写就欧了
3.pop完之后返回的结果是删除后的那个元素
4.原数组也会发生变化
var arr = [3, 4, 5, 'zzy'];
console.log(arr.pop()); //zzy
console.log(arr); //[3,4,5]
(4)删除数组第一个元素:shift
1.shift是删除数组的最后一个元素,一次只能删除一个元素
2.shift(),没有参数,直接写就欧了
3.shift完之后返回的结果是删除后的那个元素
4.原数组也会发生变化
var arr = [3, 4, 5, 'zzy'];
console.log(arr.shift()); //3
console.log(arr); //[4, 5, 'zzy']
(5)筛选数组案例
相对之前写的那个来说,这个更直接
var arr = [300, 1500, 1800, 2100, 2300];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < 2000) {
newArr.push(arr[i]);
}
}
console.log(newArr); //[300,1500,1800]
3. 翻转数组和数组排序
(1)翻转数组:reverse
var arr = [2, 4, 5, 6, 7];
arr.reverse();
console.log(arr); //[7,6,5,4,2]
(2)数组排序(冒泡排序)
var arr = [3, 56, 8, 23, 13, 1];
arr.sort();
console.log(arr); // [1, 13, 23, 3, 56, 8]
这个sort方法排序多少有点小小的瑕疵,因为它是按照第一个数字排的,所以我们可以在sort里加点料
加个函数,返回值如果是a-b,那么就是升序,返回值是b-a就是降序,这个先记住
var arr = [3, 56, 8, 23, 13, 1];
arr.sort(function (a, b) {
// return a - b; //升序
return b - a; //降序
});
console.log(arr); // [1, 13, 23, 3, 56, 8]
4. 数组索引
如果数组里有重复的元素,那么indexOf返回的是从正面数,laseIndexOf返回的是从后面往前数
如果不存在,两个都是返回-1。其实这个indexOf也可以应用在字符串上,如果比如字符串’abc’,indexOf(‘x’)返回-1,indexOf(‘a’)就返回a的位置0,这里要注意每个字符串都会包含空字符串’',而且索引是0
参数:indexOf(‘要查找的字符’,开始的位置)
var arr = ['zzy', 'ht', 'aj', 'qq', 'aj'];
console.log(arr.indexOf('aj')); //2
console.log(arr.lastIndexOf('aj')); //4
console.log(arr.indexOf('wx')); //-1
console.log(arr.lastIndexOf('wx')); //-1
5. 数组去重(重要)
目标:把旧数组中不重复的元素取出来,重复的只保留一个,放到新数组中
思路:
1.核心算法:遍历旧数组中的每一个元素,把它们依次放在新数组中,在放的过程中如果元素在新数组中不存在,就添加,否则不添加。
2.如何判断元素存不存在?使用的新数组.indexOf(数组元素),如果返回的是-1,那么就不存在。
代码实现:
function uniqueArr(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
var result = uniqueArr([1, 2, 4, 5, 4, 5, 7]);
console.log(result);
6. 数组转换为字符串
var arr = [1, 2, 3];
var arr1 = arr.toString();
console.log(arr1); //1,2,3
var arr2 = arr.join('|');
console.log(arr2); //1|2|3
var arr3 = arr.join('&');
console.log(arr3); //1&2&3
四、字符串对象(感觉八股文比较多)
1.基本包装类型
2.字符串的不可变
指的是里面的值不可变,虽然看上去变了,但是实际上是地址变了,内存中新开辟了一个内存空间,然后字符串指向了新的空间。
3.字符串对象里的方法
字符串里的方法都不会改变原来的字符串,你懂的
(1)根据字符返回位置:indexOf(‘要查找的字符’,开始的位置)
和数组的indexOf类似的
var str = '百川东到海,海纳百川';
console.log(str.indexOf('东')); //2 如果有重复的返回第一个
console.log(str.indexOf('川', 6)); //9 6表示从第六个字符开始查找
(2)案例:查找某个字符串中某个字符出现的位置和次数(不太懂,有点难)
查找下面这个字符串中所有o出现的位置和次数
思路:
1.先找第一个出现的位置,这个位置应该作为变量
2.然后从位置开始往后索引,只要不等于-1,就说明后面还存在这个字符,就要继续查找,所以这里要用循环
3.先输出当前位置,然后从下一个位置(i+1)往后查找,查找到的下一个位置(如果有的话)作为新的变量赋给i,如果后面找不到了,那i就会被赋值-1,循环结束。
//查找下面这个字符串中所有o出现的位置和次数
var str = 'docvoqo';
var i = str.indexOf('o'); //1
var count = 0; //设置一个计数器
while (i != -1) {
console.log(i);
count++;
i = str.indexOf('o', i + 1);
}
console.log(count + '次');
数组也一样
var arr = ['yellow', 'red', 'blue', 'pink', 'red', 'hot', 'red'];
var position = arr.indexOf('red');
while (position != -1) {
console.log(position);
position = arr.indexOf('red', position + 1);
}
当然,其实也有不用indexOf的一种更好理解的方法(不过str[index]好像只有H5是适用的):
//其实还有一种方法诶,把字符串当成数组遍历
var str = 'docvoqo';
var arr = [];
for (var i = 0; i < str.length; i++) {
if (str[i] == 'o') {
arr.push(i);
}
}
console.log(arr);
(3)根据位置返回字符(重点)
var str = 'zzy'
console.log(str.charAt(0)); //z
console.log(str.charAt(2)); //y
下面这个是H5新增的,方便的一塌糊涂
console.log(str[0]); //z
console.log(str[2]); //y
charCodeAt可能做游戏用到,就是用来判断用户按下了哪个键,因为每个键都对应一个ASCII码
比如下面这个结果是106,因为z对应的ASCII码是106
var str = 'zzy';
console.log(str.charCodeAt(0)); //z对应的ASCII码是106
(4)统计出现次数最多的字符(有点小小的问题)
思路:
1.遍历这个字符串,使用charAt
2.把字符串里的每个字符都作为一个属性存储给对象,如果对象没有该属性,就赋属性值为1,如果有属性值就加1
3.遍历对象,找出最大值和该字符
判断条件:如果有该对象,那么o[‘属性名’]就会有值,为true,如果没有该对象那么就是undefined,false
我们先来看看下面这个:
var o = {
age: 18
};
if (o['sex']) {
console.log('有');
} else {
console.log('没有');
}
代码实现:
//判断一个字符串中出现次数最多的字符,并统计其次数
var obj = new Object(); //定义一个对象来存储字符串里的每个字符
var str = 'qwqqwqa';
console.log('11111' + obj[str.charAt(0)]);
for (var i = 0; i < str.length; i++) {
//如果该字符作为属性不在对象中,那么属性值就赋为1。存在了就+1
var chars = str.charAt(i)
//这里如果用obj.chars会报错,因为用点的话只有属性值存在的时候才行
// 但是这里chars返回的是一个字符串,那你相当于写的是obj.'q'
// 我们的目的是添加一个属性,obj[chars]才对,相当于obj['q'];
if (obj[chars]) {
obj[chars]++;
} else {
obj[chars] = 1;
}
}
var maxStr = 0;
var times = 0;
for (var k in obj) { //遍历对象,寻找最大属性值
if (obj[k] > times) {
times = obj[k];
maxStr = k;
}
}
console.log(maxStr);
console.log(times);
(5)字符串操作方法(重点)
var str = 'zzy';
console.log(str.concat('love','ht')); //zzyloveht
str.substr(开始的位置, 截取几个字符),第二个参数如果省略,默认取到最后一个
var str = '君不见黄河之水天上来';
console.log(str.substr(3, 2)); //黄河
(6)替换字符串以及转换为数组
replace方法替换字符串
replace(‘被替换的字符’,‘替换为的字符’);
注意,这种替换只能替换第一个,如果后面再出现,就替换不鸟了
var str = 'zzy';
console.log(str.replace('z', 'a')); //azy
当然啊,如果想替换全部,写个循环就欧了
var str = 'asdarsfzdgdsadqa';
while (str.indexOf('a') !== -1) {
str = str.replace('a', '*');
}
console.log(str);
分割字符串split(‘分隔符’),类似前面的数组转字符串join
var str = 'pink&blue&aoao';
console.log(str.split('&')); //['pink', 'blue', 'aoao']
console.log(str.split('e')); //['pink&blu', '&aoao']