JavaScript學習補充(三)-標準對象

Date日期和時間
var now=new Date();
now;//此時此刻的日期加時間
now.getFullYear();//獲取年份
now.getMonth();//月份,範圍0~11,5表示六月
now.getDate();//獲取號
now.getDay();//獲取星期幾
now.getHours();//獲取小時 24小時制
now.getMinutes();//獲取分鐘
now.getSeconds();//獲取秒
now.geyMillseconds();//獲取毫秒數
now.getTime();//獲取以number形式表示的時間戳
//創建一個指定日期和時間的Date對象
var d=new Date(2020,3,8,21,39,18,123);//2020年4月8日21:39:18 GMT+0800(CST)

JavaScript的Date對象的月份值從0開始,0是1月

//第二種
var d=new Date('2020-04-04T21:43:22.875+08:00');
d;//時間戳

使用Date.parse()時傳入的字符串使用實際月份0112,轉換爲Date對象後getMonth()獲取的月份值爲011
時區

Date對象表示的時間zoo那個是按瀏覽器所在時區顯示的,不過我們可以顯示本地時間,也可以顯示調整後的UTC時間
d.toLocaleString();//顯示本地時間(北京時區+8:00),顯示的字符串與操作系統設定的格式有關
d.toUTCString();//顯示UTC時間
只要我們傳遞的是一個number類型的時間戳,就不用關心時區的轉換,任何瀏覽器都會把時間戳轉換成正確的本地時間
時間戳:自增的整數,從1970年1月1日零時整的GTM時區開始那一刻到現在的毫秒數
//獲取時間戳
var d=new Date();
d.getTime();
RegExp
正則表達式是一種用來匹配字符串的,設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串我們就認爲合法(正則表達式也是用字符串表示的)
\d可以匹配一個數字,\w可以匹配一個字母或數字,點可以匹配任意字符,*可以表示任意個字符(包括0個),+表示至少一個字符,?表示0個或1個字符,{n}表示n個字符,{n,m}表示n-m個字符,\s可以匹配一個空格(也包括Tab等空白符)

進階
可以用[]表示範圍

[a-zA-Z\_\$][0-9A-Za-z\_\$]* 可以匹配由字母或下劃線、$開頭,後接任意個由數字、字母或者下劃線美元符號組成的字符串
A|B可以匹配A或B
^表示行的開頭, ^ \d表示必須以數字開頭
$表示行的結束, \d $表示必須以數字結束

JavaScript創建正則表達式:

方式一 :/正則表達式/直接寫出來
方式二:new RegExp('正則表達式')創建一個RegExp對象
方式二中因爲字符串的轉義問題,字符串的兩個\\實際上是一個\

切分字符串

'a b  c'.split(' ');//['a','b',' ',' ','c']無法識別連續空格
'a b  c'.split(/\s+/);//['a','b','c']
'a,b,c  d'.split(/[\s\,]+/);//['a','b','c','d']
'a,b;;c  d'.split(/[\s\,\;]+/);//['a','b','c','d']

分組

除簡單匹配之外,正則表達式還要提取子串的功能
用()表示的就是要提取的分組
var re=/^(\d{3})-(\d{3,8})$/;
re.exec('010-12345');//['010-12345','010','12345']
re.exec('010 12345');//null
exec()方法提取子串,匹配成功後返回一個數組,第一個元素是正則表達式匹配到的整個字符串,後面的字符串表示匹配成功的子串
匹配失敗返回null

貪婪匹配

正則匹配默認是貪婪匹配,也就是匹配儘可能多的字符
var a=/^(\d+)(0*)$/;
a.exec("102400");//['102400','102400','']
//\d+採用貪婪算法,直接把後邊的0全部匹配,0*只能匹配空字符串
var b=/^(\d+?)(0*)$/;
b.exec('102400');//['102400','1024','00']

加個?就可以採用非貪婪匹配
全局搜索

g表示全局匹配,i表示忽略大小寫,m表示執行多行匹配
全局匹配可以多次執行exec()方法來搜索一個匹配的字符串。指定g後每次運行exec(),正則表達式每次會更新lastIndex屬性,表示上次匹配到的最後索引
var r=/test/g;
//等價於
var r=new RegExp('test','g');

var s='javaScript,vbScript,JScript and EcmaSript';
var re=/[a-zA-Z]+Script/g;
//全局匹配
re.exec(s);//['javaScript']
re.lastIndex;//10

re.exec(s);//['vbScript']
re.lastIndex;//20

re.exec(s);//['JScript']
re.lastIndex;//29

re.exec(s);//['EcmaScript']
re.lastIndex;//44

re.exec(s);//null,直到結束仍沒有匹配到

不能使用/^……$/,那樣最多匹配一次

JSON
json是JavaScript的一個子集
數據類型:
number 、boolean、string、null、array、object也就是JavaScript的{...}表示方式
以及數據類型的任意組合
字符集必須是UTF-8,字符串必須用雙引號" ",object的鍵也必須用雙引號
在JavaScript中可以直接使用JSON,因爲JavaScript中內置了JSON的解析
把任何JavaScript對象變成JSON,就是把這個對象序列化一個JSON格式的字符串,這樣才能通過網絡傳遞給其他計算機
如果收到一個JSON格式的字符串,只需要把他反序列化爲JavaScript對象,就可以在JavaScript中直接使用這個對象了
//序列化
'use strict'
var person={
	name:'bob',
	age:10,
	
}
var s=JSON.stringify(person);
console.log(s);
//按縮進輸出
JSON.stringify(person,null,' ');
//第二個參數用於控制如何篩選對象的鍵值,如果想輸出指定屬性,可以傳入Array
JSON.stringify(person,['name'],' ');
//還可以傳入函數,這樣對象每個鍵值對都會被函數先處理
function conver(key,value){//把所有屬性值變爲大寫
	if(typeof value==='string'){
		return value.toUpperCase();
	}
	return value;
}
JSON.stringify(person,conver,' ');

//精確控制序列化person
var person={
	name:'bob',
	age:10,
	gender:true,
	skill:[javascript,java,python],
	toJSON:function(){//直接返回JSON應該序列化的數據
		return{//只輸出name和age,並改變key
			'Name':this.name,
			'Age':this.age
		};
	}
};
JSON.stringify(person);//'{"Name":"bob","Age":"10"}'

反序列化

用JSON.parse()把它變成JavaScript對象,JSON.parse()還可以接收一個函數,用來轉換解析出的屬性
JSON.parse('[1,2,3,true]');//[1,2,3,true]
JSON.parse('{"name":"bob","age":10}');//Object{name:bob,age:10}
JSON.parse('true');//true
JSON.parse('123.45');//123.45

'use strict'
var obj=JSON.parse('{"name":"bob","age":10}',function(key,value){
	if(ley==='name'){return value+'同學';}
	return value;
});
console.log(JSON.stringify(obj));//{name:'bob同學',age:10}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章