JavaScript(四):内置对象--Math对象、日期对象、数组对象、字符串对象

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']
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值