Math
Math对象是JS内置对象,提供了一些静态的数学属性和数学方法,使用时不用实例化。
- 属性:
Math.E
Math.LN2
Math.LN10
Math.LOG2E
Math.LOG10E
Math.PI
Math.SQRT1_2
Math.SQRT2 - 方法:
- 四舍五入 round
Math.round(0.1); //0
Math.round(0.5); //1
对于 负值的运算结果不同,体现在对于.5的处理
Math.round(-1.1);//-1
Math.round(-1.5); //-1
- 绝对值abs,最大参数max,最小参数min
abs方法返回参数值的绝对值
Math.abs(1)//1
Math.abs(-1) //1
max方法返回最大的参数,min方法返回最小的参数
Math.max(1,2,3); //3
Math.min(1,2,3); //1
- floor,ceil
分别返回小于或者大于参数值的最大(小)整数
Math.floor(3.999); //3
Math.floor(-3.999); //-4
Math.ceil(3.999); //4
Math.ceil(-3.999); //-3
- pow,sqrt
pow返回一个参数为底数,第二个参数为幂的指数值
sqrt方法返回参数的平方根,如果参数为负值,返回NaN
Math.pow(2,2); // 4
Math.pow(2,3); // 8
Math.sqrt(4); //2
Math.sqrt(-4); //NaN
- random
random方法返回0-1之间的一个伪随机数,可能等于0,但是一定小于1
通过组合使用random方法和floor或者ceil方法可以得到指定范围内的随机整数,示例:
// 返回一个大于等于a,小于b之间的随机整数
function random(a,b) {
return a + Math.floor(Math.random() * (b-a));
}
利用定义得到的random()函数,可以实现输出一些指定格式的结果:
// 返回一个大于等于a,小于b之间的随机整数
function random(a,b) {
return a + Math.floor(Math.random() * (b-a));
}
// 得到一个随机的字符串
function randomStr(len) { //len为随机字符串的长度
var dict = '0123456789abcdefgihijklmnopqrstuvwxyz'; // 创建一个字符串,所有可能的字符取值
var str = ''; // 要输出的随机字符串
for (var i = 0; i < len; i ++) {
str += dict[random(0,dict.length)];
// 利用上面定义的random函数,生成0到dict字符串的长度的随机整数,作为下标,对应的字符即为输出的字符,赋给str
}
return str;
}
var str = randomStr(8);//指定8位的字符串
console.log(str);
//得到一个随机的IP地址 0.0.0.0 ~ 255.255.255.255
function randomIP () {
//同样要利用定义好的random()
var arr = [];
for (var i = 0; i < 4; i ++) { //IP 4位,循环4次
arr.push(random(0,256)); // 写成255就不包括255了
}
return arr.join('.'); //返回.隔开的字符串
}
var IP = randomIP();
console.log(IP);
数组
- 数组的创建的多种方式
var arr = new Array();
使用构造函数创建空数组,一般不使用,而是用字面量创建数组:
var arr = [];
在使用字面量创建数组的时候:
无论传入几个参数,都会把参数当做初始化内容而不是长度,例如var arr = [5];
即创建的新数组只有1项,为5。
var arr = [5];
console.log(arr.length); //1
var arr2 = [5,6];
console.log(arr2.length) //2
但是需要注意的是,进行数组创建的时候,不要带多余的“,” 因为不同的浏览器解析结果不一致。例如:
var arr = [1,2,3,]; //有多余的,
console.log(arr.length); // 现代浏览器上结果为3,但是在低版本的IE上是长度为4的数组,最后一项为undefined
- 数组的索引
数组的值可以通过下标来进行访问,下标可以是自然数也可以是变量或者表达式,例如:
var arr =[1,2,3,4];
console.log(arr[0]); //1
var i =1;
console.log(arr[i]);//2
console.log(arr[++i]);//3
数组也是对象,是一个特殊的对象,key为数值的对象。
- 数组的基本操作
var a = [1,2,3];
a[3] = 4; // 增加新元素
console.log(a); //[1,2,3,4]
//使用delete删除数组元素
delete a[2];
console.log(a[2]); //undefined 跟给a[2]赋值undefined相似,数组长度不会改变,也不会影响其他数据。
console.log(a.length); //4 数组长度不会改变
- 栈方法pop()和push()
var arr = [3,4,5];
arr.push(100); //push里面传参
console.log(arr); //3,4,5,100
arr.pop(); //pop不需要传参
console.log(arr); //3,4,5
- 队列方法 shift()和unshift()
var arr =[1,2,3];
arr.unshift(4);
console.log(arr); //[4,1,2,3]
arr.shift();
console.log(arr);//[1,2,3]
- 终极神器splice()
splice方法可以一次性解决数组添加,删除。传入三个参数
第一个参数为开始的位置, 第二个参数为想要删除的长度,第三个参数为想要添加的项目,也可以写多个:
var arr = [3,5,8,10];
arr.splice(2,1); // 删除第2个元素
console.log(arr); //[3,5,10]
var arr1 = [3,5,8,10];
arr1.splice(1,1,7,8,9); //在第2位开始,删除1项,然后增加7,8,9三项
console.log(arr1);//[3, 7, 8, 9, 8, 10]
var arr2 = [3,5,8,10];
arr2.splice(3,0,9); // 在第3项位置删除0项,即不删除,然后插入9的一项
console.log(arr2);//[3, 5, 8, 9, 10]
- join方法
将数组连接成字符串,可以选择使用什么字符隔开每一项
var arr = [1,2,3,4,5,6];
//转化为字符串
var str1 = arr.join('|');
console.log(str1); //1|2|3|4|5|6
var str2 = arr.join('');
console.log(str2); // 123456
数组跟字符串使用join("")和split("")可以互相转换,使用对方的方法
- concat() 连接数组,会生成一个新数组,不会影响原数组
var a = [1,2,3];
var b = [4,5];
console.log(a.concat(b)); //[1, 2, 3, 4, 5]
console.log(a); // [1, 2, 3] 原数组不受影响
console.log(b); //[4, 5]
- reverse()方法用于将数组逆序,会修改原数组
var arr = [1,2,3,4,5];
arr.reverse();
console.log(arr); // [5, 4, 3, 2, 1] 会修改原数组
- sort()
sort方法在没有参数的时候,会按照字母表升序排序,有undefined放到最后,对于对象调用toString方法。
一般需要自定义一个排序方式,传入一个比较函数作为sort方法的参数,sort也会改变原数组。
// 采用默认排序法时出现的问题
var arr = [7,8,9,10,11];
arr.sort();
console.log(arr); //[10, 11, 7, 8, 9] 并没有按照意料中的方式排序
// 所以需要定义一个自定义的函数,作为sort方法的参数进行排序
var arr2 = [-4,1,18,22,3,9];
function compare (a,b) {
return a - b; //根据a-b的正负来排序
}
arr2.sort(compare);
console.log(arr2);//[-4, 1, 3, 9, 18, 22] 写成b-a会降序
//针对对象的属性的数值进行排序
var student = [
{
name: 'a',
age: 10
},
{
name: 'c',
age: 30
},
{
name: 'b',
age: 20
},
];
student.sort(function(stu1,stu2) {
return stu1.age - stu2.age;
})
console.log(student); //{name: "a", age: 10} {name: "b", age: 20} {name: "c", age: 30} 按照对象的age属性排序
ES5 数组扩展了一些功能
- Array.isArray(obj)
Array对象的一个静态函数,判断一个对象是不是数组
var a = [123];
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false
- .indexOf(element)/.lastIndexOf(element)
用于查找数组内指定的元素的位置,没找到返回-1,找到返回下标 -
.forEach(element,index,array)
遍历一个数组,参数为一个回调函数,回调函数有三个参数
1,当前元素 2,当前元素索引值 3,整个数组
var arr = [1,2,3,4,5,6];
arr.forEach(function (e,i,array) {
array[i] = e + 1; //每项都加1
});
console.log(arr);//[2, 3, 4, 5, 6, 7]
//forEach代替了通常用for循环遍历数组
- every(function (element,index,array))/some(function (element,index,array))
every和some类似于一种逻辑判定,回调函数返回一个布尔值
every是所有函数的每个回调函数都返回true的时候才返回true,有false的时候就终止执行,返回false
some是存在着有一个回调函数返回true时就终止执行返回true,否则返回false
对于空数组,every返回true,some返回false
var arr = [1,2,3,-2,3];
// 判断数组中每一项是否都为正值
var resultEvery = arr.every(function (value) { // 只判断是不是整数,所以参数只用到value,写一个value就好
return value > 0;
});
console.log(resultEvery); //false
// 判断数组中每一项是否存在正值
var resultSome = arr.some(function (value){
return value > 0;
});
console.log(resultSome); //true
-
map(function(element))
和forEach类似,遍历数组,回调函数返回值组成一个新数组返回,新数组索引和原数组一致,原数组不变。
var arr = [1,2,3,4,5];
var arr2 = arr.map(function (element) { //遍历数组,返回一个新数组,每项是原数组的平方
return Math.pow(element,2);
})
console.log(arr); //[1, 2, 3, 4, 5] 原数组不发生改变
console.log(arr2); //[1, 4, 9, 16, 25]
//上述需求也可以利用forEach实现 为:
var arr3 = [];
arr.forEach(function (e,i,array) {
arr3.push(Math.pow(e,2)); // 利用forEach来达到同样的效果,要提前创建一个新数组,将得到的平方值依次push进去
})
console.log(arr3); // [1, 4, 9, 16, 25]
console.log(arr); //[1, 2, 3, 4, 5]
-
filter(function(element)) 过滤
返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加到返回数组中,false则不加
新数组只包含返回true的值,索引缺失的不包括,原数组保持不变
var arr = [1,2,3,4,5];
console.log(arr.filter(function (e) {
return e % 2 == 0; //返回偶数
})); //[2, 4]
console.log(arr); // [1, 2, 3, 4, 5] 原数组不变
//针对对象进行过滤
var student = [
{
username: 'aa',
age: 20,
},
{
username: 'bb',
age: 30,
},
{
username: 'ac',
age: 25,
},
];
//要过滤出student中username包含a字符的项
var result = student.filter(function (e) {
return e.username.indexOf('a') > -1; //使用indexOf可以判断是否包含a字符
});
console.log(result);// {username: "aa", age: 20} {username: "ac", age: 25}
- reduce(function(v1,v2),value)/.reduceRight(function(v1,v2),value)
遍历数组,调用回调函数,将数组元素组合成一个值,reduce从索引最小值开始,reduceRight反向,方法有2个参数, 1,回调函数,把两个值合为一个,返回结果 2,value,一个初始值,可选
var arr = [1,2,3,4,5];
var arr1 = arr.reduce(function(v1,v2) {
console.log('本次v1为:'+v1 ,'本次v2为:' + v2);
return v1 + v2;
});
console.log(arr1); //15
Date
Date对象是JS提供的日期和时间的操作接口
Date对象有几个静态方法
- Date.now()
now方法返回当前距离 1970年1月1日00:00:00的毫秒数
Date.now();//1502771978564
- Date.parse()
解析字符串,返回距离 1970年1月1日00:00:00的毫秒数,解析失败返回NaN
console.log(Date.parse('2017-1-1')); //1483200000000
- Date.UTC()
默认返回当前时区的时间,接收年月日等变量作为参数,返回距离 1970年1月1日00:00:00的毫秒数
Date.UTC(2015,0,1,2,3,4,567);//1420077784567
- Date()
Date函数可以直接调用,返回当前时间 - get
var d = new Date();
console.log(d.getTime()); //返回距离1970年1月1日00:00:00的毫秒数
console.log(d.getDate());//返回实例对象对应每个月的几号(从1开始)
console.log(d.getDay());//周几,周日为0,周一为1
console.log(d.getFullYear());//返回四位数的年份
console.log(d.getMonth());//月份,0为1月
console.log(d.getHours());//小时 0-23
console.log(d.getMilliseconds());//毫秒 0-999
console.log(d.getMinutes());//分钟 0-59
console.log(d.getSeconds());//秒 0-59
console.log(d.getTimezoneOffset());//时区差异
另外get还有对应的set方法
- Date对象的应用距离
// 写一个函数getChIntv, 获取从当前时间到指定日期的间隔时间
function getChIntv(dateStr) {
var targetDate = new Date(dateStr);// 传入目标参数,创建目标时间的date对象
var currentDate = new Date();//表示现在时间
var interval = targetDate - currentDate; // 可以直接相减,默认调用valueOf函数生成毫秒数
if (interval > 0) {
//生成的interval为毫秒数,我们转换为秒数并且取整
var totalSeconds = Math.floor(interval/1000); //换算成秒数并且取整的值
var seconds = totalSeconds%60; //得到余下来的秒数,为我们最终显示的秒数,前面的可以整除的换算为分钟小时和天
var totalMinutes = Math.floor(totalSeconds/60); //为总共的分钟数 这里用Math.floor取整
var minutes = (totalMinutes%60); //同样,可以整除的去换算为小时和天数,余下来的分钟用于最终显示,
var totalHours = Math.floor(totalMinutes/60); //总共的小时数 这里用Math.floor取整
var hours = (totalHours%24); //余下来的小时数作为最终显示,可以整除的去换算成天数
var totalDays = Math.floor(totalHours/24); //总共的天数,不用换算成年了,所以直接换算成天数就好
console.log('距离目标日期还有:'+ totalDays + '天' + hours + '小时' + minutes + '分钟' + seconds + '秒');
}
else {
console.log('目标日期已经过了');
}
}
getChIntv('2017-1-1');