JavaScript内置对象
JavaScript中的对象分为3种:目定义对象、内置对象、浏览器对象。前面两种对象是JS基础内容,属于ECMAScript;第三个浏览器对象属于我们JS独有的,我们JS API讲解。
内置对象就是指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)。内置对象最大的优点就是帮助我们快速开发JavaScript提供了多个内置对象:Math、Date、Array、String等。
MDN文档查阅
可以使用MDN文档来查询JS的一些内置对象。
网址:MDN: https://developer.mozilla.org/zh-CN/
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、 利用对象封装自己的数学对象,里面包含PI 最大值 最小值
// 利用对象封装自己的数学对象,里面包含PI 最大值 最小值
var myMath = {
PI : 3.141592653,
max : function() {
var max = arguments[0];
for ( i = 1 ; i < arguments.length ; i ++){
if(arguments[i] > max){
max = arguments[i];
}
}
return max;
},
min: function () {
var min = arguments[0];
for (i = 1; i < arguments.length; i++) {
if (arguments[i] < min) {
min = arguments[i];
}
}
return min;
}
}
console.log(myMath.PI);
console.log(myMath.max(1,3,5,7,9));
console.log(myMath.min(2,4,6,8));
3、 取绝对值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
4、向下取整floor
//向下取整floor(地板)
console.log(Math.floor(1.1)); //1
console.log(Math.floor(1.9)); //1
5、向上取整floor
//向上取整ceil(天花板)
console.log(Math.ceil(1.1)); //2
console.log(Math.ceil(1.9)); //2
6、四舍五入round
需要注意的是:遇到例如-1.5的时候,往大了取,向数轴右侧进行取整
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
7、随机数方法random()
如果没有其他操作,默认就是随机取一个[0,1)之间的浮点型小数。
console.log(Math.random());
随机取两个数之间的一个整数,不含最大值,含最小值 :(公式不需要理解,记住copy就行)
// 随机取一个[min,max)之间的整数
function getRandom1(min, max) {
// 随机取一个[min,max)之间的整数
return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
}
console.log(getRandom1(1, 10));
随机取两个数之间的一个整数,含最大值和最小值 :(公式不需要理解,记住copy就行)
// 随机取一个[min,max]之间的整数
function getRandom2(min, max) {
// 随机取一个[min,max]之间的整数
return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
}
console.log(getRandom2(1, 10));
随机点名:
// 随机取一个[min,max]之间的整数
function getRandom1(min, max) {
return Math.floor(Math.random() * (max - min+1))+min; //含最大值,含最小值
}
console.log(getRandom1(1, 10));
// 随机点名
var arr = ['中国','美国','椰果','应该'];
console.log(arr[getRandom1(0,arr.length-1)]);
8、猜数字游戏
function getRandom(min, max) {
return Math.floor(Math.random()*(max - min + 1)) + min;
}
var random = getRandom(1, 10);
while(true) {//死循环
var num = prompt('你来猜?输入1-10之间的一个数字');
if (num >random){
alert('你猜大了');
} else if (num < random) {
alert('你猜小了');
} else {
alert('你好帅哦,猜对了');
break;//退出整个循环结束程序
}
}
9、 猜数字游戏,猜十次
//猜数字,猜十次猜不到就滚蛋
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来调用创建日期对象(必须要实例化)。
1、如果没有参数,返回当前系统时间
// 没有其他限制,就返回当前系统的时间
var date = new Date();
console.log(date);
2、参数的写法:数字型与字符串型(常用)
数字型:
var date1 = new Date(2023, 11, 8);
console.log(date1); //返回的是2023年12月8
发现月份会多加一个月 。
字符串型:
var date2 = new Date('2023-11-08 18:15:43');
console.log(date2);
用字符串型就是正常的。
3、日期格式化
var date = new Date();
console.log(date.getFullYear()); //返回的是日期的年
console.log(date.getMonth() + 1); //返回的是日期的月,但是月份会小1月,要加1才行
console.log(date.getDate()); //返回的是天
console.log(date.getDay()); //0-6,周一返回1,周六返回6,但是周日返回0
console.log(date.getHours());
console.log(date.getMinutes());
console.log(date.getSeconds());
我们写一个今天是2023年11月8日星期三。
这里如果星期几要搞成大写,可以建立一个数组,正好周日到周六也是0~6。
//格式化日期年月日
var date = new Date();
//我们写一个2023年11月8日星期三
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr=['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
var day = date.getDay();
console.log('今天是:'+year+'年'+month+'月'+dates+'日 '+arr[day]);
封装一个函数,返回当前的时分秒 格式: 18:06:09
用三元运算符:
//要求封装一个函数返回当前的时分秒格式08:08:08
//封装一个函数,返回当前的时分秒
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());
4. 时间戳,获取当前距离1970年1月1日的总毫秒数
(1)通过valueOf getTime
// 1、通过valueOf getTime
var date = new Date();
console.log(date.valueof());//就是我们现在时间距离1970.1.1总的毫秒数
console.log(date.getTime());
(2) 简单的写法(最常用的写法)+new Date()
// 2.简单的写法(最常用的写法)
var date1= +new Date();//+new Date()返回的就是总的毫秒数
console.log(date1);
(3) H5新增的获得总的毫秒数
//3.H5新增的获得总的毫秒数
console.log(Date.now());
5、倒计时案例(重要)
分析:
function countDown(time) {
var nowTime = +new Date();//把系统当前的时间转换为总共多少毫秒
var inputTime = +new Date(time);//返回的是用户输入时间总的毫秒数
var times = (inputTime - nowTime)/1000;//相差时间转换为秒
var d = parseInt(times / 60 / 60 / 24);//天
d=d < 10 ? '0' + d:d;//如果天数小于10 那么前面加个0 否则直接返回d
var h=parseInt(times/60/60%24);//时
h=h < 10 ? '0' + h:h;
var m=parseInt(times /60%60);//分
m=m<10?'0'+ m:m;
var s =parseInt(times%60);//当前的秒
s=s<10?'0'+s:s;
return d+'天'+h+'时'+m+'分'+s+'秒';
}
console.log(countDown('2023-11-9 18:00:00'));
三、数组对象
1、创建数组的两种方式(字面量和new Array())
//创建数组的两种方式
//1.利用数组字面量
var arr = [1, 2, 3];
console.log(arr[0]);
//2.利用new Array()
// var arr1=new Array();//创建了一个空的数组
//var arr1=new Array(2);//这个2表示数组的长度为2里面有2个空的数组元素
var arr1=new Array(2,3);//等价于[2,3]这样写表示里面有2个数组元素是2和3
console.log(arr1);
2、检测是否为数组
(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
3.、添加删除数组元素(重要)
(1)在数组后面添加元素:push
1.push可以在数组后面追加新的元素
2.push(参数);参数直接写要添加的数组元素就可以。
3.push结束后,返回的是新数组的长度。
4.原数组会发生相应的变化
var arr = [1,2,3];
arr.push(4,'pp');
//console.log(arr.push(4, 'pp'));//返回的是新数组的长度5
console.log(arr);
(2)在数组前面添加元素:unshift
1.unshift可以在数组后面追加新的元素
2.unshift(参数);参数直接写要添加的数组元素就可以
3.unshift结束后,返回的是新数组的长度
4.原数组会发生相应的变化
var arr = [4, 5, 6];
arr.unshift('yhg', 8);
// console.log(arr.push('yhg', 8)); //返回的是数组长度5
console.log(arr); //['yhg', 8,4,5,6,]
(3)删除数组最后一个元素:pop
1.pop是删除数组的最后一个元素,一次只能删除一个元素
2.pop(),没有参数,直接写就可以
3.pop完之后返回的结果是删除后的那个元素
4.原数组也会发生变化
var arr = [3, 4, 5, 'yhg'];
console.log(arr.pop()); //yhg
console.log(arr); //[3,4,5]
(4)删除数组第一个元素:shift
1.shift是删除数组的最后一个元素,一次只能删除一个元素
2.shift(),没有参数,直接写就可以
3.shift完之后返回的结果是删除后的那个元素
4.原数组也会发生变化
var arr = [3, 4, 5, 'yhg'];
console.log(arr.shift()); //3
console.log(arr); //[4, 5, 'yhg']
(5)筛选数组案例
有一个包含工资的数组[1500,1200,2000,2100,1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面.
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]);//如果工资小于2000,就添加到新数组里面
}
}
console.log(newArr); //[300,1500,1800]
4.、翻转数组和数组排序
(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]
但是当遇到有十位数的,她先按照第一个数字排序,所以我们可以这样写:(先记住就好)
var arr = [3, 56, 8, 23, 13, 1];
arr.sort(function (a, b) {
// return a - b; //升序
return b - a; //降序
});
console.log(arr);
这是降序。
5、 数组索引
例如:
(1)它只返回第一个满足条件的索引号 作用就是返回该数组元素的索引号,当前所在数组位置第几个
(2)它如果在该数组里面找不到元素,则返回的是-1
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
6、 数组去重(面试重要)
思路:
代码:
function unique(arr) {
var newArr = [];
for(var i = 0 ; i<arr.length ; i ++){
if (newArr.indexOf(arr[i]) === -1) {
newArr.push(arr[i]);//如果新数组newArr里面没有arr[i],就添加上去
}
}
return newArr;
}
var result = unique([1,2,3,4,4,3,2,5]);//把函数的结果返回给result
console.log(result);//输出result
7、数组转换为字符串
toString( )
var arr = [1, 2, 3];
var arr1 = arr.toString();
console.log(arr1); //1,2,3
join('|')
var arr2 = arr.join('|');
console.log(arr2); //1|2|3
var arr3 = arr.join('&');
console.log(arr3); //1&2&3
四、字符串对象
1、基本包装类型
简单数据类型为什么会有length属性呢?
//基本包装类型
var str = 'andy';
console.log(str.length);
//对象才有属性和方法复杂数据类型才有属性和方法
//简单数据类型为什么会有length属性呢?
//基本包装类型::就是把简单数据类型包装成为了复杂数据类型
//(1)把简单数据类型包装为复杂数据类型
var temp = new String('andy');
//(2)把临时变量的值给strstr = temp;
//(3)销毁这个临时变量
temp = null;
总结:
2.字符串的不可变
指的是里面的值不可变,虽然看上去变了,但是实际上是地址变了,内存中新开辟了一个内存空间,然后字符串指向了新的空间。所以不要大量拼接字符串。
3.字符串对象里的方法
(1)根据字符返回位置:indexOf(‘要查找的字符’,开始的位置)
//字符串对象根据字符返回位置 str.indexof('要查找的字符',[起始的位置])
var str='改革春风吹满地,春天来了';
console.log(str.indexof('春'));
console.log(str.indexof('春',3));//8 从索引号是3的位置开始往后查找
(2)求某个字符出现的位置和次数
思路:
var str = "oabcoefoxyozzopp";
var index = str.indexOf('o'); //吧o第一次出现的位置赋值给index
var num = 0;
// console.log(index);
while (index !== -1) {//只要出现的位置不等于-1,就说明后面还有o
console.log(index);//输出第一个o的位置
num++;//没出现一次o 次数就加一
index = str.indexOf('o', index + 1);//继续从index+1的位置往后查找
}
console.log('o出现的次数是:'+num);
结果:
(3)根据位置返回字符(重点)
(a) charAt(index)
var str = 'yhg'
console.log(str.charAt(0)); //y
console.log(str.charAt(2)); //g
(b)charCodeAt(index)
charCodeAt可能做游戏用到,就是用来判断用户按下了哪个键,因为每个键都对应一个ASCII码.
var str = 'z';
console.log(str.charCodeAt(0)); //z对应的ASCII码是106
(c)str[index] h5新增
console.log(str[0]); //y
console.log(str[2]); //g
(4)统计出现次数最多的字符
思路:
①核心算法:利用charAt()遍历这个字符串
②把每个字符都存储给对象,如果对象没有该属性,就为1,如果存在了就+1
③遍历对象,得到最大值和该字符
(看了两遍还是有点懵)
//判断一个字符串中出现次数最多的字符,并统计其次数
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)字符串操作方法(重点)
concat
var str = 'cgp';
console.log(str.concat('love','yhg')); //cgploveyhg
str.substr(开始的位置, 截取几个字符),第二个参数如果省略,默认取到最后一个
var str = '君不见黄河之水天上来';
console.log(str.substr(3, 2)); //黄河
(6)替换字符串以及转换为数组
replace方法替换字符串
replace(‘被替换的字符’,‘替换为的字符’);
注意,这种替换只能替换第一个,如果后面再出现,就替换不了
var str = 'yhg';
console.log(str.replace('y', 'a')); //ahg
如果想替换全部,写个循环就ok
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']
//前面我们学过 join 把数组转换为字符串
//2.字符转换为数组split('分隔符')
var str2 = 'red, pink,blue';
console.log(str2.split(','));
var str3 = 'red&pink&blue';
console.log(str3.split('&'));