1.typeof
操作符總是返回一個字符串:
typeof 123; // 'number' typeof NaN; // 'number' typeof 'str'; // 'string' typeof true; // 'boolean' typeof undefined; // 'undefined' typeof Math.abs; // 'function' typeof null; // 'object' typeof []; // 'object' typeof {}; // 'object' 用typeof
無法區分出null
、Array
和通常意義上的object——{}
2.包裝對象:
var n = new Number(123); // 123,生成了新的包裝類型 var b = new Boolean(true); // true,生成了新的包裝類型 var s = new String('str'); // 'str',生成了新的包裝類型 typeof new Number(123); // 'object' new Number(123) === 123; // false typeof new Boolean(true); // 'object' new Boolean(true) === true; // false typeof new String('str'); // 'object' 包裝使他們的類型變成了object new String('str') === 'str'; // false 所以對于string
類型,最好不要包裝對象。
正確的轉換法是不用new
var n = Number('123'); // 123,相當于parseInt()或parseFloat() typeof n; // 'number'var b = Boolean('true'); // true typeof b; // 'boolean'var b2 = Boolean('false'); // true! 'false'字符串轉換結果為true!因為它是非空字符串! var b3 = Boolean(''); // falsevar s = String(123.45); // '123.45' typeof s; // 'string'
總結一下,有這么幾條規則需要遵守:
-
不要使用
new Number()
、new Boolean()
、new String()
創建包裝對象; -
用
parseInt()
或parseFloat()
來轉換任意類型到number
; -
用
String()
來轉換任意類型到string
,或者直接調用某個對象的toString()
方法; -
null
和undefined
沒有toString()
方法。數字對象的toString()
方法要這樣寫:123.toString(); // SyntaxError 123..toString(); // '123', 注意是兩個點! (123).toString(); // '123'3.14.toString(); // '3.14' 3.14..toString(); // SyntaxError (3.14).toString(); //'3.14' // 第一個點是指小數點,第二個點才是調用toString()方法,所以3.14不需要用兩個點調用toString()方法
-
通常不必把任意類型轉換為
boolean
再判斷,因為可以直接寫if (myVar) {...}
; -
typeof
操作符可以判斷出number
、boolean
、string
、function
和undefined
; -
判斷
Array
要使用Array.isArray(arr)
; -
判斷
null
請使用myVar === null
; -
判斷某個全局變量是否存在,用
typeof window.myVar === 'undefined'
; -
函數內部判斷某個變量是否存在,用
typeof myVar === 'undefined'
。
3.Date對象,獲取本機系統當前時間:
var now = new Date(); now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) now.getFullYear(); // 2015, 年份 now.getMonth(); // 5, 月份,注意月份范圍是0~11,5表示六月 now.getDate(); // 24, 表示24號 now.getDay(); // 3, 表示星期三 now.getHours(); // 19, 24小時制 now.getMinutes(); // 49, 分鐘 now.getSeconds(); // 22, 秒 now.getMilliseconds(); // 875, 毫秒數 now.getTime(); // 1435146562875, 以number形式表示的時間戳
創建一個指定日期和時間的Date
對象:
var d = new Date(2015, 5, 19, 20, 15, 30, 123); d; // Fri Jun 19 2015 20:15:30 GMT+0800 (CST) //注意JavaScript的月份范圍用整數表示是0~11,0表示一月,1表示二月……//或者這樣也能創建: var a = Date.parse('2015-06-24T19:49:22.875+08:00'); a; // 1435146562875 返回一個時間戳//可以再如下轉換: var c = new Date(1435146562875); c; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) c.toLocaleString(); // '2015/6/24 下午7:49:22',本地時間(北京時區+8:00),顯示的字符串與操作系統設定的格式有關 c.toUTCString(); // 'Wed, 24 Jun 2015 11:49:22 GMT',UTC時間(世界標準時間),與本地時間相差8小時 科普:格林威治標準時間GMT
4.正則表達式,如果直接給出字符,就是精確匹配。用\d
可以匹配一個數字,\w
可以匹配一個字母或數字,用.
可以匹配任意字符
?? *
表示任意個字符(包括0個),用+
表示至少一個字符,用?
表示0個或1個字符,用{n}
表示n個字符,用{n,m}
表示n-m個字符
?\s
可以匹配一個空格(也包括Tab(/t)等空白符)
?? 例如:要匹配'010-12345'
這樣的號碼,由于'-'
是特殊字符,在正則表達式中,要用'\'
轉義,所以正則是\d{3}\-\d{3,8}
?? 還能可以用[]
表示范圍 :[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
可以匹配由字母或下劃線、$開頭,后接任意個由一個數字、字母或者下劃線、$組成的字符串,也就是JavaScript允許的變量名;
??? A|B
可以匹配A或B,所以(J|j)ava(S|s)cript
可以匹配'JavaScript'
、'Javascript'
、'javaScript'
或者'javascript'
。
? ^
表示行的開頭,^\d
表示必須以數字開頭。
? $
表示行的結束,\d$
表示必須以數字結束。
5.RegExp。正則表達式。
寫正則表達式的兩種方法:
var re1 = /ABC\-001/; var re2 = new RegExp('ABC\\-001'); //注意是兩\\,轉義 re1; // /ABC\-001/ re2; // /ABC\-001/
RegExp對象的test()
方法用于測試給定的字符串是否符合條件:
var re = /^\d{3}\-\d{3,8}$/; re.test('010-12345'); // true re.test('010-1234x'); // false re.test('010 12345'); // false
正則表達式切分字符串十分好用:
'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'] 把空格和,和;都忽略掉
用()
表示要提取的分組,再用exec()
方法提取出子串:
var re = /^(\d{3})-(\d{3,8})$/; // 這里不再需要\-
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null 匹配失敗返回null
貪婪匹配,匹配盡可能多的字符:
var re = /^(\d+)(0*)$/; re.exec('102300'); // ['102300', '102300', ''] \d+把數字全部匹配了,所以0*無法匹配到0
非貪婪匹配,也就是盡可能少匹配:
var re = /^(\d+?)(0*)$/; // 想要的非貪婪項后面加?號 re.exec('102300'); // ['102300', '1023', '00']
特殊的標志:g標志
,表示全局匹配。全局匹配類似搜索,因此不能使用/^...$/
,那樣只會最多匹配一次。
??????????????? i
標志,表示忽略大小寫。m
標志,表示執行多行匹配。
var r1 = /test/g; // 等價于: var r2 = new RegExp('test', 'g');
var s = 'JavaScript,VBScript,JScript and ECMAScript'; var re=/[a-zA-Z]+Script/g;// 使用全局匹配: re.exec(s); // ['JavaScript'] 每次返回一個元素,與直接用exec,全部值一起返回不同。 re.lastIndex; // 10 最后所在的位置 re.exec(s); // ['VBScript'] re.lastIndex; // 19 re.exec(s); // ['JScript'] re.lastIndex; // 27 re.exec(s); // ['ECMAScript'] re.lastIndex; // 42 re.exec(s); // null,表示匹配結束了,全部符合條件的都已經找出來了,再調用就從第一個開始循環。
6.在JSON中,一共就這么幾種數據類型:
- number:和JavaScript的
number
完全一致; - boolean:就是JavaScript的
true
或false
; - string:就是JavaScript的
string
; - null:就是JavaScript的
null
; - array:就是JavaScript的
Array
表示方式——[]
; - object:就是JavaScript的
{ ... }
表示方式。
JSON的字符串規定必須用雙引號""
,Object的鍵也必須用雙引號""
把對象序列化成JSON格式的字符串:
var xiaoming = {name: '小明',age: 14,gender: true,height: 1.65,grade: null,'middle-school': '\"W3C\" Middle School',skills: ['JavaScript', 'Java', 'Python', 'Lisp'] };JSON.stringify(xiaoming); // '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}'
按縮進輸出:
JSON.stringify(xiaoming, null, ' '); /*結果如下
{"name": "小明","age": 14,"gender": true,"height": 1.65,"grade": null,"middle-school": "\"W3C\" Middle School","skills": ["JavaScript","Java","Python","Lisp"] }
*/
指定屬性輸出:
JSON.stringify(xiaoming, ['name', 'skills'], ' '); /*結果如下 {"name": "小明","skills": ["JavaScript","Java","Python","Lisp"] } */
或者用toJSON()
的方法指定屬性序列化輸出:
var xiaoming = {name: '小明',age: 14,gender: true,height: 1.65,grade: null,'middle-school': '\"W3C\" Middle School',skills: ['JavaScript', 'Java', 'Python', 'Lisp'],toJSON: function () {return { // 只輸出name和age,并且改變了key:'Name': this.name,'Age': this.age};} };JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'
還可以傳入一個函數作為參數:
function convert(key, value) {if (typeof value === 'string') {return value.toUpperCase();}return value; }JSON.stringify(xiaoming, convert, ' '); /*結果如下,全部字符串變大寫 {"name": "小明","age": 14,"gender": true,"height": 1.65,"grade": null,"middle-school": "\"W3C\" MIDDLE SCHOOL","skills": ["JAVASCRIPT","JAVA","PYTHON","LISP"] } */
7.反序列化,把JSON格式的字符串還原成JavaScript對象:
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true] JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14} JSON.parse('true'); // true JSON.parse('123.45'); // 123.45
JSON.parse()
還可以接收一個函數,用來轉換解析出的屬性
JSON.parse('{"name":"小明","age":14}', function (key, value) {// 把number * 2:if (key === 'name') {return value + '同學';}return value; }); // Object {name: '小明同學', age: 14}
?