Math
Math對象是JS內(nèi)置對象脸候,提供了一些靜態(tài)的數(shù)學屬性和數(shù)學方法,使用時不用實例化讯屈。
- 屬性:
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
對于 負值的運算結(jié)果不同蛋哭,體現(xiàn)在對于.5的處理
Math.round(-1.1);//-1
Math.round(-1.5); //-1
- 絕對值abs,最大參數(shù)max涮母,最小參數(shù)min
abs方法返回參數(shù)值的絕對值
Math.abs(1)//1
Math.abs(-1) //1
max方法返回最大的參數(shù)谆趾,min方法返回最小的參數(shù)
Math.max(1,2,3); //3
Math.min(1,2,3); //1
- floor,ceil
分別返回小于或者大于參數(shù)值的最大(小)整數(shù)
Math.floor(3.999); //3
Math.floor(-3.999); //-4
Math.ceil(3.999); //4
Math.ceil(-3.999); //-3
- pow,sqrt
pow返回一個參數(shù)為底數(shù)叛本,第二個參數(shù)為冪的指數(shù)值
sqrt方法返回參數(shù)的平方根沪蓬,如果參數(shù)為負值,返回NaN
Math.pow(2,2); // 4
Math.pow(2,3); // 8
Math.sqrt(4); //2
Math.sqrt(-4); //NaN
- random
random方法返回0-1之間的一個偽隨機數(shù)来候,可能等于0跷叉,但是一定小于1
通過組合使用random方法和floor或者ceil方法可以得到指定范圍內(nèi)的隨機整數(shù),示例:
// 返回一個大于等于a,小于b之間的隨機整數(shù)
function random(a,b) {
return a + Math.floor(Math.random() * (b-a));
}
利用定義得到的random()函數(shù)云挟,可以實現(xiàn)輸出一些指定格式的結(jié)果:
// 返回一個大于等于a峡眶,小于b之間的隨機整數(shù)
function random(a,b) {
return a + Math.floor(Math.random() * (b-a));
}
// 得到一個隨機的字符串
function randomStr(len) { //len為隨機字符串的長度
var dict = '0123456789abcdefgihijklmnopqrstuvwxyz'; // 創(chuàng)建一個字符串,所有可能的字符取值
var str = ''; // 要輸出的隨機字符串
for (var i = 0; i < len; i ++) {
str += dict[random(0,dict.length)];
// 利用上面定義的random函數(shù)植锉,生成0到dict字符串的長度的隨機整數(shù)辫樱,作為下標,對應的字符即為輸出的字符俊庇,賦給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位狮暑,循環(huán)4次
arr.push(random(0,256)); // 寫成255就不包括255了
}
return arr.join('.'); //返回.隔開的字符串
}
var IP = randomIP();
console.log(IP);
數(shù)組
- 數(shù)組的創(chuàng)建的多種方式
var arr = new Array();
使用構(gòu)造函數(shù)創(chuàng)建空數(shù)組,一般不使用辉饱,而是用字面量創(chuàng)建數(shù)組:
var arr = [];
在使用字面量創(chuàng)建數(shù)組的時候:
無論傳入幾個參數(shù)搬男,都會把參數(shù)當做初始化內(nèi)容而不是長度,例如var arr = [5];
即創(chuàng)建的新數(shù)組只有1項彭沼,為5缔逛。
var arr = [5];
console.log(arr.length); //1
var arr2 = [5,6];
console.log(arr2.length) //2
但是需要注意的是,進行數(shù)組創(chuàng)建的時候姓惑,不要帶多余的“褐奴,” 因為不同的瀏覽器解析結(jié)果不一致。例如:
var arr = [1,2,3,]; //有多余的,
console.log(arr.length); // 現(xiàn)代瀏覽器上結(jié)果為3于毙,但是在低版本的IE上是長度為4的數(shù)組敦冬,最后一項為undefined
- 數(shù)組的索引
數(shù)組的值可以通過下標來進行訪問,下標可以是自然數(shù)也可以是變量或者表達式唯沮,例如:
var arr =[1,2,3,4];
console.log(arr[0]); //1
var i =1;
console.log(arr[i]);//2
console.log(arr[++i]);//3
數(shù)組也是對象脖旱,是一個特殊的對象,key為數(shù)值的對象介蛉。
- 數(shù)組的基本操作
var a = [1,2,3];
a[3] = 4; // 增加新元素
console.log(a); //[1,2,3,4]
//使用delete刪除數(shù)組元素
delete a[2];
console.log(a[2]); //undefined 跟給a[2]賦值undefined相似萌庆,數(shù)組長度不會改變,也不會影響其他數(shù)據(jù)币旧。
console.log(a.length); //4 數(shù)組長度不會改變
- 棧方法pop()和push()
var arr = [3,4,5];
arr.push(100); //push里面?zhèn)鲄? 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方法可以一次性解決數(shù)組添加践险,刪除。傳入三個參數(shù)
第一個參數(shù)為開始的位置佳恬, 第二個參數(shù)為想要刪除的長度捏境,第三個參數(shù)為想要添加的項目,也可以寫多個:
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方法
將數(shù)組連接成字符串,可以選擇使用什么字符隔開每一項
var arr = [1,2,3,4,5,6];
//轉(zhuǎn)化為字符串
var str1 = arr.join('|');
console.log(str1); //1|2|3|4|5|6
var str2 = arr.join('');
console.log(str2); // 123456
數(shù)組跟字符串使用join("")和split("")可以互相轉(zhuǎn)換倾剿,使用對方的方法
- concat() 連接數(shù)組筷频,會生成一個新數(shù)組蚌成,不會影響原數(shù)組
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] 原數(shù)組不受影響
console.log(b); //[4, 5]
- reverse()方法用于將數(shù)組逆序,會修改原數(shù)組
var arr = [1,2,3,4,5];
arr.reverse();
console.log(arr); // [5, 4, 3, 2, 1] 會修改原數(shù)組
- sort()
sort方法在沒有參數(shù)的時候凛捏,會按照字母表升序排序担忧,有undefined放到最后,對于對象調(diào)用toString方法坯癣。
一般需要自定義一個排序方式瓶盛,傳入一個比較函數(shù)作為sort方法的參數(shù),sort也會改變原數(shù)組示罗。
// 采用默認排序法時出現(xiàn)的問題
var arr = [7,8,9,10,11];
arr.sort();
console.log(arr); //[10, 11, 7, 8, 9] 并沒有按照意料中的方式排序
// 所以需要定義一個自定義的函數(shù)惩猫,作為sort方法的參數(shù)進行排序
var arr2 = [-4,1,18,22,3,9];
function compare (a,b) {
return a - b; //根據(jù)a-b的正負來排序
}
arr2.sort(compare);
console.log(arr2);//[-4, 1, 3, 9, 18, 22] 寫成b-a會降序
//針對對象的屬性的數(shù)值進行排序
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 數(shù)組擴展了一些功能
- Array.isArray(obj)
Array對象的一個靜態(tài)函數(shù),判斷一個對象是不是數(shù)組
var a = [123];
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false
- .indexOf(element)/.lastIndexOf(element)
用于查找數(shù)組內(nèi)指定的元素的位置蚜点,沒找到返回-1轧房,找到返回下標 -
.forEach(element,index,array)
遍歷一個數(shù)組,參數(shù)為一個回調(diào)函數(shù)绍绘,回調(diào)函數(shù)有三個參數(shù)
1,當前元素 2奶镶,當前元素索引值 3,整個數(shù)組
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循環(huán)遍歷數(shù)組
- every(function (element,index,array))/some(function (element,index,array))
every和some類似于一種邏輯判定陪拘,回調(diào)函數(shù)返回一個布爾值
every是所有函數(shù)的每個回調(diào)函數(shù)都返回true的時候才返回true厂镇,有false的時候就終止執(zhí)行,返回false
some是存在著有一個回調(diào)函數(shù)返回true時就終止執(zhí)行返回true藻丢,否則返回false
對于空數(shù)組剪撬,every返回true摄乒,some返回false
var arr = [1,2,3,-2,3];
// 判斷數(shù)組中每一項是否都為正值
var resultEvery = arr.every(function (value) { // 只判斷是不是整數(shù)悠反,所以參數(shù)只用到value,寫一個value就好
return value > 0;
});
console.log(resultEvery); //false
// 判斷數(shù)組中每一項是否存在正值
var resultSome = arr.some(function (value){
return value > 0;
});
console.log(resultSome); //true
-
map(function(element))
和forEach類似馍佑,遍歷數(shù)組斋否,回調(diào)函數(shù)返回值組成一個新數(shù)組返回,新數(shù)組索引和原數(shù)組一致拭荤,原數(shù)組不變茵臭。
var arr = [1,2,3,4,5];
var arr2 = arr.map(function (element) { //遍歷數(shù)組,返回一個新數(shù)組舅世,每項是原數(shù)組的平方
return Math.pow(element,2);
})
console.log(arr); //[1, 2, 3, 4, 5] 原數(shù)組不發(fā)生改變
console.log(arr2); //[1, 4, 9, 16, 25]
//上述需求也可以利用forEach實現(xiàn) 為:
var arr3 = [];
arr.forEach(function (e,i,array) {
arr3.push(Math.pow(e,2)); // 利用forEach來達到同樣的效果旦委,要提前創(chuàng)建一個新數(shù)組,將得到的平方值依次push進去
})
console.log(arr3); // [1, 4, 9, 16, 25]
console.log(arr); //[1, 2, 3, 4, 5]
-
filter(function(element)) 過濾
返回數(shù)組的一個子集雏亚,回調(diào)函數(shù)用于邏輯判斷是否返回缨硝,返回true則把當前元素加到返回數(shù)組中,false則不加
新數(shù)組只包含返回true的值罢低,索引缺失的不包括查辩,原數(shù)組保持不變
var arr = [1,2,3,4,5];
console.log(arr.filter(function (e) {
return e % 2 == 0; //返回偶數(shù)
})); //[2, 4]
console.log(arr); // [1, 2, 3, 4, 5] 原數(shù)組不變
//針對對象進行過濾
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)
遍歷數(shù)組胖笛,調(diào)用回調(diào)函數(shù),將數(shù)組元素組合成一個值宜岛,reduce從索引最小值開始长踊,reduceRight反向,方法有2個參數(shù)萍倡, 1身弊,回調(diào)函數(shù),把兩個值合為一個列敲,返回結(jié)果 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對象有幾個靜態(tài)方法
- Date.now()
now方法返回當前距離 1970年1月1日00:00:00的毫秒數(shù)
Date.now();//1502771978564
- Date.parse()
解析字符串瘫絮,返回距離 1970年1月1日00:00:00的毫秒數(shù),解析失敗返回NaN
console.log(Date.parse('2017-1-1')); //1483200000000
- Date.UTC()
默認返回當前時區(qū)的時間填硕,接收年月日等變量作為參數(shù)麦萤,返回距離 1970年1月1日00:00:00的毫秒數(shù)
Date.UTC(2015,0,1,2,3,4,567);//1420077784567
- Date()
Date函數(shù)可以直接調(diào)用,返回當前時間 - get
var d = new Date();
console.log(d.getTime()); //返回距離1970年1月1日00:00:00的毫秒數(shù)
console.log(d.getDate());//返回實例對象對應每個月的幾號(從1開始)
console.log(d.getDay());//周幾扁眯,周日為0壮莹,周一為1
console.log(d.getFullYear());//返回四位數(shù)的年份
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());//時區(qū)差異
另外get還有對應的set方法
- Date對象的應用距離
// 寫一個函數(shù)getChIntv, 獲取從當前時間到指定日期的間隔時間
function getChIntv(dateStr) {
var targetDate = new Date(dateStr);// 傳入目標參數(shù)姻檀,創(chuàng)建目標時間的date對象
var currentDate = new Date();//表示現(xiàn)在時間
var interval = targetDate - currentDate; // 可以直接相減命满,默認調(diào)用valueOf函數(shù)生成毫秒數(shù)
if (interval > 0) {
//生成的interval為毫秒數(shù),我們轉(zhuǎn)換為秒數(shù)并且取整
var totalSeconds = Math.floor(interval/1000); //換算成秒數(shù)并且取整的值
var seconds = totalSeconds%60; //得到余下來的秒數(shù)绣版,為我們最終顯示的秒數(shù)胶台,前面的可以整除的換算為分鐘小時和天
var totalMinutes = Math.floor(totalSeconds/60); //為總共的分鐘數(shù) 這里用Math.floor取整
var minutes = (totalMinutes%60); //同樣,可以整除的去換算為小時和天數(shù)杂抽,余下來的分鐘用于最終顯示,
var totalHours = Math.floor(totalMinutes/60); //總共的小時數(shù) 這里用Math.floor取整
var hours = (totalHours%24); //余下來的小時數(shù)作為最終顯示诈唬,可以整除的去換算成天數(shù)
var totalDays = Math.floor(totalHours/24); //總共的天數(shù),不用換算成年了缩麸,所以直接換算成天數(shù)就好
console.log('距離目標日期還有:'+ totalDays + '天' + hours + '小時' + minutes + '分鐘' + seconds + '秒');
}
else {
console.log('目標日期已經(jīng)過了');
}
}
getChIntv('2017-1-1');