字串
字串就是零個或多個排在一起的字元,放在單引號或雙引號之中。
`abc`
"abc"
單引號字串的內部,可以使用雙引號。雙引號字串的內部,可以使用單引號。
`key="value"`
"It`s a long str"
多行與轉義
如果要在單引號字串的內部,使用單引號(或者在雙引號字串的內部,使用雙引號),就必須在內部的單引號(或者雙引號)前面加上反斜槓,用來轉義。
`Did she say `Hello`?`
// "Did she say `Hello`?"
"Did she say "Hello"?"
// "Did she say "Hello"?"
字串預設只能寫在一行內,分成多行將會報錯。
`a
b
c`
// SyntaxError: Unexpected token ILLEGAL
上面程式碼將一個字串分成三行,JavaScript就會報錯。
如果長字串必須分成多行,可以在每一行的尾部使用反斜槓。
var longString = "Long
long
long
string";
longString
// "Long long long string"
上面程式碼表示,加了反斜槓以後,原來寫在一行的字串,可以分成多行,效果與寫在同一行完全一樣。注意,反斜槓的後面必須是換行符,而不能有其他字元(比如空格),否則會報錯。
連線運算子(+)可以連線多個單行字串,用來模擬多行字串。
var longString = `Long `
+ `long `
+ `long `
+ `string`;
反斜槓在字串內有特殊含義,用來表示一些特殊字元,所以又稱為轉義符。
如果字串的正常內容之中,需要包含反斜槓,則反斜槓前需要再加一個反斜槓,用來對自身轉義。
var path = "C:\games\war3\"
ES6擴充套件
多行字串
var str = `
你好
我是evenyao
`
字串模板
var name = `evenyao`
var website = `github.com/evenyao`
var str = `你好, 我是${name},${website}`
//"你好, 我是evenyao,github.com/evenyao"
常見的字串方法
- 長度計算,連線
var str = "hello";
console.log( str.length );
console.log( str[0] );
console.log( str[str.length - 1] );
console.log( str.charAt(0) );
console.log( str.charCodeAt(0) );
var str2 = " world";
var str3 = str1 + str2;
cosnole.log( str3 );
- 字串擷取
var str = "hello world";
var sub1 = str.substr(1, 3); // 第一個是開始位置, 第二個是長度 ell
var sub2 = str.substring(1, 3); // 第一個是開始位置,第二個是結束位置,長度為第二個-第一個 el
var sub3 = str.slice(1, 3); // 同上 允許負參
字串操作不會修改原來的字串
- 查詢
var str = "hello my world";
var s1 = str.search(`my`); //6 找不到為-1
var s2 = str.replace(`my`, `your`); //
var s3 = str.match(`my`); //返回匹配的陣列
- 大小寫
var str = "Hello";
str.toUpperCase();
str.toLowerCase();
字串操作不會修改原來的字串
Math
Math物件是JavaScript的內建物件,提供一系列數學常數和數學方法。Math物件只提供了靜態的屬性和方法,所以使用時不用例項化
屬性
Math物件提供以下一些只讀的數學常數。
Math.E // 2.718281828459045
Math.LN2 // 0.6931471805599453
Math.LN10 // 2.302585092994046
Math.LOG2E // 1.4426950408889634
Math.LOG10E // 0.4342944819032518
Math.PI // 3.141592653589793
Math.SQRT1_2 // 0.7071067811865476
Math.SQRT2 // 1.4142135623730951
方法
round
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(2, -1, 5) // 5
Math.min(2, -1, 5) // -1
floor,ceil
floor方法返回小於引數值的最大整數
Math.floor(3.2) // 3
Math.floor(-3.2) // -4
ceil方法返回大於引數值的最小整數
Math.ceil(3.2) // 4
Math.ceil(-3.2) // -3
pow,sqrt
pow方法返回以第一個引數為底數、第二個引數為冪的指數值
Math.pow(2, 2) // 4
Math.pow(2, 3) // 8
sqrt方法返回引數值的平方根。如果引數是一個負值,則返回NaN
Math.sqrt(4) // 2
Math.sqrt(-4) // NaN
log,exp
log方法返回以e為底的自然對數值
Math.log(Math.E) // 1
Math.log(10) // 2.302585092994046
求以10為底的對數,可以除以Math.LN10;求以2為底的對數,可以除以Math.LN2。
Math.log(100)/Math.LN10 // 2
Math.log(8)/Math.LN2 // 3
exp方法返回常數e的引數次方
Math.exp(1) // 2.718281828459045
Math.exp(3) // 20.085536923187668
random
參考:關於 Math.random 的一些函式
該方法返回0到1之間的一個偽隨機數,可能等於0,但是一定小於1
Math.random() // 0.7151307314634323
// 返回給定範圍內的隨機數
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
// 返回給定範圍內的隨機整數
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
三角函式
sin方法返回引數的正弦,cos方法返回引數的餘弦,tan方法返回引數的正切。
Math.sin(0) // 0
Math.cos(0) // 1
Math.tan(0) // 0
asin方法返回引數的反正弦,acos方法返回引數的反餘弦,atan方法返回引數的反正切。這三個方法的返回值都是弧度值。
Math.asin(1) // 1.5707963267948966
Math.acos(1) // 0
Math.atan(1) // 0.7853981633974483
Date
時間的表示方式
GMT
是指位於英國倫敦郊區的皇家格林尼治天文臺當地的標準時間,因為本初子午線被定義為通過那裡的經線。
自1924年2月5日開始,格林尼治天文臺負責每隔一小時向全世界發放調時資訊。
理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。但由於地球在它的橢圓軌道里的運動速度不均勻,這個時刻可能與實際的太陽時有誤差,最大誤差達16分鐘。原因在於地球每天的自轉是有些不規則的,而且正在緩慢減速,因此格林尼治時間基於天文觀測本身的缺陷,已經被原子鐘報時的協調世界時(UTC)所取代。
UTC
協調世界時(英語:Coordinated Universal Time,法語:Temps Universel Coordonné,簡稱UTC)是最主要的世界時間標準,其以原子時秒長為基礎,在時刻上儘量接近於格林尼治標準時間。中華民國採用CNS 7648的《資料元及交換格式–資訊交換–日期及時間的表示法》(與ISO 8601類似)稱之為世界協調時間。中華人民共和國採用ISO 8601:2000的國家標準GB/T 7408-2005《資料元和交換格式 資訊交換 日期和時間表示法》中亦稱之為協調世界時
CST
北京時間,又名中國標準時間,是中國大陸的標準時間,比世界協調時快八小時(即UTC+8),與香港、澳門、臺北、吉隆坡、新加坡等地的標準時間相同。
Javascript 中的 Date
var d = new Date()
console.log(d.toString()) //"Wed Feb 28 2018 17:18:26 GMT+0800 (CST)"
console.log(d.toGMTString()) //"Wed, 28 Feb 2018 09:18:26 GMT"
console.log(d.toUTCString()) //"Wed, 28 Feb 2018 09:18:26 GMT"
console.log(d.toISOString()) //"2018-02-28T09:18:26.967Z"
new Date()
使用Date建構函式建立一個Date的例項
var d = new Date()
d.getTime() //返回例項物件距離1970年1月1日00:00:00對應的毫秒數
d.getDate() //返回例項物件對應每個月的幾號(從1開始)
d.getDay() //返回星期,星期日為0,星期一為1,以此類推
d.getFullYear() //返回四位的年份
d.getMonth() //返回月份(0表示1月,11表示12月)
d.getHours() //返回小時(0~23)
d.getMilliseconds() //返回毫秒(0-999)
d.getMinutes() //返回分鐘(0-59)
d.getSeconds() //返回秒(0-59)
var d2 = new Date()
d2.setDate()
set
-
Date.prototype.setDate(date):設定例項物件對應的每個月的幾號(1-31),返回改變後毫秒時間戳
-
Date.prototype.setFullYear(year [, month, date]):設定四位年份
-
Date.prototype.setHours(hour [, min, sec, ms]):設定小時(0-23)
-
Date.prototype.setMilliseconds():設定毫秒(0-999)
-
Date.prototype.setMinutes(min [, sec, ms]):設定分鐘(0-59)
-
Date.prototype.setMonth(month [, date]):設定月份(0-11)
-
Date.prototype.setSeconds(sec [, ms]):設定秒(0-59)
-
Date.prototype.setTime(milliseconds):設定毫秒時間戳
Date.prototype.toString()
toString方法返回一個完整的時間字串
var today = new Date();
today.toString(); // "Fri Apr 03 2015 11:17:29 GMT+0800 (CST)"
Date.prototype.toUTCString(),Date.prototype.toISOString()
toUTCString方法返回對應的UTC時間,也就是比北京時間晚8個小時。toISOString方法返回對應時間的ISO8601寫法。
var today = new Date(1362790014000);
today.toUTCString(); //
today.toISOString(); //
Date.prototype.toDateString(),Date.prototype.toTimeString()
toDateString方法返回日期的字串形式,toTimeString方法返回時間的字串形式。
var today = new Date(1362790014000);
today.toDateString(); // "Fri Apr 03 2015"
today.toTimeString(); // "11:17:29 GMT+0800 (CST)"
toLocalDateString, toLocalTimeString
toLocalDateString方法返回一個字串,代表日期的當地寫法
toLocalTimeString方法返回一個字串,代表時間的當地寫法
var today = new Date(1362790014000);
today.toLocaleDateString(); // "2015/4/3"
today.toLocaleTimeString(); // "上午11:17:29"
new Date(milliseconds)
Date物件接受從1970年1月1日00:00:00 UTC開始計算的毫秒數作為引數。這意味著如果將Unix時間戳作為引數,必須將Unix時間戳乘以1000。
new Date(1378218728000); // Tue Sep 03 2013 22:32:08 GMT+0800 (CST)
// 1970年1月2日的零時
var Jan02_1970 = new Date(3600*24*1000); // Fri Jan 02 1970 08:00:00 GMT+0800 (CST)
new Date(datestring)
Date物件還接受一個日期字串作為引數,返回所對應的時間。所有可以被Date.parse()方法解析的日期字串,都可以當作Date物件的引數
new Date("2013-02-15")
new Date("2013-FEB-15")
new Date("FEB, 15, 2013")
new Date("FEB 15, 2013")
new Date("Feberuary, 15, 2013")
new Date("Feberuary 15, 2013")
new Date("15, Feberuary, 2013")
new Date(year, month [, day, hours, minutes, seconds, ms])
在多個引數的情況下,Date物件將其分別視作對應的年、月、日、小時、分鐘、秒和毫秒。如果採用這種用法,最少需要指定兩個引數(年和月),其他引數都是可選的,預設等於0。如果只使用年一個引數,Date物件會將其解釋為毫秒數。
new Date(2013) // Thu Jan 01 1970 08:00:02 GMT+0800 (CST)
new Date(2013,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1,0,0,0,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
上面程式碼(除了第一行)返回的是2013年1月1日零點的時間,可以看到月份從0開始計算,因此1月是0,12月是11。但是,月份裡面的天數從1開始計算。
靜態方法
Date.now()
now方法返回當前距離1970年1月1日00:00:00
的毫秒數
Date.now(); // 1427974222853
Date.parse()
parse方法用來解析日期字串,返回距離1970年1月1日 00:00:00
的毫秒數
日期字串的格式應該完全或者部分符合YYYY-MM-DDTHH:mm:ss.sssZ
格式,Z表示時區,是可選的
如果解析失敗,返回NaN
Date.parse("January 26, 2011 13:51:50")
Date.parse("Mon, 25 Dec 1995 13:30:00 GMT")
Date.parse("Mon, 25 Dec 1995 13:30:00 +0430")
Date.parse("2011-10-10")
Date.parse("2011-10-10 20:00:00")
Date.parse("2011-10-10T14:48:00")
注意事項
在新建日期物件時,如果不設定時間,則認為建立的是 utc 的0點,也就是北京時間8點。 如果設定時間,則是北京時間當前時間。
new Date(`2018-01-01`) // Mon Jan 01 2018 08:00:00 GMT+0800 (CST)
new Date(`2018-01-01 00:00:00`) //Mon Jan 01 2018 00:00:00 GMT+0800 (CST)
關於Date的應用函式
引數為時間物件毫秒數的字串格式,返回值為字串。假設引數為時間物件毫秒數t,根據t的時間分別返回如下字串:
- 剛剛( t 距當前時間不到1分鐘時間間隔)
- 3分鐘前 (t距當前時間大於等於1分鐘,小於1小時)
- 8小時前 (t 距離當前時間大於等於1小時,小於24小時)
- 3天前 (t 距離當前時間大於等於24小時,小於30天)
- 2個月前 (t 距離當前時間大於等於30天小於12個月)
- 8年前 (t 距離當前時間大於等於12個月)
function friendlyDate(time){
var interval = Date.now() - time;
switch(true){
case interval<0:
console.log(`在未來`);
break;
case interval>=0&&interval<(60*1000): // 距當前時間不到1分鐘時間間隔
console.log(`剛剛`);
break;
case interval>=(60*1000)&&interval<(60*60*1000): // 距當前時間大於等於1分鐘,小於1小時
console.log(`3分鐘前`);
break;
case interval>=(60*60*1000)&&interval<(24*60*60*1000): // 距離當前時間大於等於1小時,小於24小時
console.log(`8小時前`);
break;
case interval>=(24*60*60*1000)&&interval<(30*24*60*60*1000): // 距離當前時間大於等於24小時,小於30天
console.log(`3天前`);
break;
case interval>=(30*24*60*60*1000)&&interval<(12*30*24*60*60*1000): // 距離當前時間大於等於30天小於12個月
console.log(`2個月前`);
break;
case interval>=(12*30*24*60*60*1000): // 距離當前時間大於等於12個月
console.log(`8年前`);
break;
}
}
friendlyDate(`1504513587883`); //輸出:"剛剛"
console.log(Date.now()) //輸出:1504513614540