javascript的樂趣——0220

來源:互聯網
上載者:User

標籤:asc   style   坑爹   Regex   date   執行   index   window   方法   

1、對於generator函數,還不是很理解,之後再續

2、javascript的樂趣_不要問為什麼

  • 不要使用new Number()new Boolean()new String()建立封裝對象;

  • parseInt()parseFloat()來轉換任意類型到number

  • String()來轉換任意類型到string,或者直接調用某個對象的toString()方法;

  • 通常不必把任意類型轉換為boolean再判斷,因為可以直接寫if (myVar) {...}

  • typeof操作符可以判斷出numberbooleanstringfunctionundefined

  • 判斷Array要使用Array.isArray(arr)

  • 判斷null請使用myVar === null

  • 判斷某個全域變數是否存在用typeof window.myVar === ‘undefined‘

  • 函數內部判斷某個變數是否存在用typeof myVar === ‘undefined‘

1 123.toString(); // SyntaxError
123..toString(); // ‘123‘, 注意是兩個點!(123).toString(); // ‘123‘

2、對於date對象,一個坑爹的地方是JavaScript的月份範圍用整數表示是0~11,0表示一月,1表示二月……,所以要表示6月,我們傳入的是5

1 var today = new Date();2 if (today.getMonth() === 2 && today.getDate() === 14) {3     alert(‘親愛的,我預定了晚餐,晚上6點在餐廳見!‘);4 }

以上代碼,真是注孤生的節奏啊......因為這匹配的是3月14號(坑無處不在)。

3、RegExp(Regex)

  • ‘00\d‘可以匹配‘007‘,但無法匹配‘00A‘

  • ‘\d\d\d‘可以匹配‘010‘

  • ‘\w\w‘可以匹配‘js‘

.可以匹配任一字元,所以:

  • ‘js.‘可以匹配‘jsp‘‘jss‘‘js!‘

要匹配變長的字元,在Regex中,用*表示任意個字元(包括0個),用+表示至少一個字元,用?表示0個或1個字元,用{n}表示n個字元,用{n,m}表示n-m個字元:

進階:

  • [0-9a-zA-Z\_]可以匹配一個數字、字母或者底線;

  • [0-9a-zA-Z\_]+可以匹配至少由一個數字、字母或者底線組成的字串,比如‘a100‘‘0_Z‘‘js2015‘等等;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或底線、$開頭,後接任意個由一個數字、字母或者底線、$組成的字串,也就是JavaScript允許的變數名;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元)。

A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配‘JavaScript‘‘Javascript‘‘javaScript‘或者‘javascript‘

^表示行的開頭,^\d表示必須以數字開頭。

$表示行的結束,\d$表示必須以數字結束。

你可能注意到了,js也可以匹配‘jsp‘,但是加上^js$就變成了整行匹配,就只能匹配‘js‘了。

1 var re1 = /ABC\-001/;2 var re2 = new RegExp(‘ABC\\-001‘);3 4 re1; // /ABC\-001/5 re2; // /ABC\-001/

RegExp對象的test()方法用於測試給定的字串是否符合條件

1 var re = /^\d{3}\-\d{3,8}$/;2 re.test(‘010-12345‘); // true3 re.test(‘010-1234x‘); // false4 re.test(‘010 12345‘); // false

切分字串:

1 ‘a,b;; c  d‘.split(/[\s\,\;]+/); // [‘a‘, ‘b‘, ‘c‘, ‘d‘]

分組、貪婪匹配、全域匹配與搜尋

a.^(\d{3})-(\d{3,8})$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼

  exec()方法在匹配成功後,會返回一個Array,第一個元素是Regex匹配到的整個字串,後面的字串表示匹配成功的子串。

  exec()方法在匹配失敗時返回null

1 var re = /^(\d{3})-(\d{3,8})$/;2 re.exec(‘010-12345‘); // [‘010-12345‘, ‘010‘, ‘12345‘]3 re.exec(‘010 12345‘); // null

b.正則匹配預設是貪婪匹配,也就是匹配儘可能多的字元

1 var re = /^(\d+)(0*)$/;2 re.exec(‘102300‘); // [‘102300‘, ‘102300‘, ‘‘]

\d+採用非貪婪匹配(也就是儘可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配

1 var re = /^(\d+?)(0*)$/;2 re.exec(‘102300‘); // [‘102300‘, ‘1023‘, ‘00‘]

c.JavaScript的Regex還有幾個特殊的標誌,最常用的是g,表示全域匹配,全域匹配可以多次執行exec()方法來搜尋一個匹配的字串。當我們指定g標誌後,每次運行exec(),Regex本身會更新lastIndex屬性,表示上次匹配到的最後索引

 1 var s = ‘JavaScript, VBScript, JScript and ECMAScript‘; 2 var re=/[a-zA-Z]+Script/g; 3  4 // 使用全域匹配: 5 re.exec(s); // [‘JavaScript‘] 6 re.lastIndex; // 10 7  8 re.exec(s); // [‘VBScript‘] 9 re.lastIndex; // 2010 11 re.exec(s); // [‘JScript‘]12 re.lastIndex; // 2913 14 re.exec(s); // [‘ECMAScript‘]15 re.lastIndex; // 4416 17 re.exec(s); // null,直到結束仍沒有匹配到

Regex還可以指定i標誌,表示忽略大小寫,m標誌,表示執行多行匹配

例:匹配email地址:

 1 var re = /^[\da-zA-Z]+([._-]\w+)*@([\da-zA-Z]+\.)+[a-zA-Z]{2,6}$/; 2  3 var re = /^<(.+?)>\s*([\da-zA-Z]+[._-]?\[email protected][\da-zA-Z]+\.[a-zA-Z]{2,6})$/; //分組得到email地址的部分內容 4  5 //測試部分: 6 // 測試: 7 var r = re.exec(‘<Tom Paris> [email protected]‘); 8 if (r === null || r.toString() !== [‘<Tom Paris> [email protected]‘, ‘Tom Paris‘, ‘[email protected]‘].toString()) { 9     alert(‘測試失敗!‘);10 }11 else {12     alert(‘測試成功!‘);13 }

 

javascript的樂趣——0220

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.