成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript基礎(chǔ)總結(jié)(一)——綜合

remcarpediem / 1032人閱讀

摘要:中的多態(tài)不存在重載,方法名一樣,后面的會(huì)把前面的覆蓋掉,最后只保留一個(gè)方法。

1、查找作用域

當(dāng)前函數(shù)在哪個(gè)作用域下定義的,那么他的上級(jí)作用域就是誰(shuí) ?, 和函數(shù)在哪執(zhí)行沒(méi)有任何關(guān)系

//作用域?qū)嵗?var num = 12;
function fn(){
    var num = 120;
    return function(){
        console.log(num);
    }
}
var f = fn();
f();//->120

(function(){
    var num = 1200;
    f();//->120
}())
2、++i 和 i++的區(qū)別
//實(shí)例說(shuō)明
var i = 5;
5 + i++ //->10

//i++ 是先運(yùn)算i本身再加1

//========
var j = 5;
5 + (++j) //->11

//++j 是本身先加1再運(yùn)算

//面試題
var n = 2;
var num =  5 + (++n) + (n++) + (n++) + (++n); //  - > 21
3、預(yù)解釋

在js執(zhí)行之前,瀏覽器首頁(yè)會(huì)把帶var和function的關(guān)鍵字進(jìn)行提前申明或定義;var(只是提前申明) function(提前申明+定義)

注:如果在全局作用域下定義一個(gè) num = 10(沒(méi)有var)和帶var 是有區(qū)別的
//實(shí)例說(shuō)明

console.log(num);//->undefined
console.log(num1);//->num1 is not defined

var num = 10;//->先預(yù)解釋->window.num = 10
num1 =  10;//->window.num1 = 10

//不帶var的num1沒(méi)有提前申明所以報(bào)is not definend
預(yù)解釋面試題
//實(shí)例1
function a(b){
 
    alert(b);
 
    function b(){
        alert(b);
    }
    b();
}
a(1);  //1->alert(b函數(shù)),2->alert(函數(shù))

//實(shí)例2

alert(a);    //undefined
var a = 0;
alert(a);    //0
function fn(){
    alert(a);    //0;因?yàn)闆](méi)var, 所以這里的a會(huì)被看作是全局的,往上查找,找到a=0,所以是0,如果全局也沒(méi)有就會(huì)報(bào)錯(cuò)
    a = 2;
    alert(a);    //2
}
fn()
alert(a); //2,fn把這全局的a修改了

//實(shí)例3


4、區(qū)分this

函數(shù)執(zhí)行,首先看函數(shù)名是否有".",有的話,"."前面是誰(shuí)this就是誰(shuí);沒(méi)有的話this就是window

自執(zhí)行函數(shù)的this永遠(yuǎn)是window

給元素的某一個(gè)事件綁定方法,當(dāng)事件觸發(fā)的時(shí)候,執(zhí)行對(duì)應(yīng)的方法,方法中的this是當(dāng)前的元素

構(gòu)造函數(shù)中的this是這個(gè)類的實(shí)例

this還可以通過(guò)call、apply、bind來(lái)改變

function fn(){
    console.log(this);
}
var obj = {
    name:"李四",
    writeJs:fn
}
obj.writeJs();//this->obj

var fn = obj.writeJs;
fn();//this->window

function sum() {
    fn();//this->window
}
sum();

(function() {
    fn();//this->window
)()

document.getElementById("div").onclick = fn;//this->#div

document.getElementById("div").onclick = function() {
    //this->#div
    fn();//this->window
}

this綜合實(shí)例(360面試題)
var num = 20;
var obj = {
    num: 30,
    fn: (function (num) {
        this.num *= 3;
        num += 15;
        var num = 45;
        return function () {
            this.num *= 4;
            num += 20;
            console.log(num);
        }
    }) (num)
}

var fn = obj.fn;
fn();//65
obj.fn();//85

5、單例模式

描述同一個(gè)事物(同一個(gè)對(duì)象)的屬性和方法放在一個(gè)內(nèi)存空間下,起到分組的作用,這樣不同事物之間的屬性名相同,相互也不會(huì)發(fā)生沖突,我們把這種分組編寫代碼的模式叫做“單例模式”;

var obj = {
    name: "張三",
    age: "18",
    writeJs: function(){
        console.log("my is "+this.name+" can write js");
    }
    
}

obj.writeJs();
注:obj又叫做“命名空間”,單例模式項(xiàng)目開發(fā)經(jīng)常使用,我們可以使用單例模式進(jìn)行模塊化開發(fā);
6、工廠模式

單例模式雖然能解決分組作用,但是不能實(shí)現(xiàn)批量生產(chǎn),屬于手工作業(yè)模式;

工廠模式->“函數(shù)的封裝”,“低耦合高內(nèi)聚”:減少頁(yè)面中的冗余代碼,提高代碼的重復(fù)利用

function createJs(name,age){
    var obj = {};
    obj.name = name;
    obj.age = age;
    obj.writeJs = function(){
        console.log("my is "+ this.name +" can write js");    
    }
    return obj;
}

var zhangsan = createJs("張三","18");

zhangsan.writeJs();

所有的編程語(yǔ)言都是面向?qū)ο箝_發(fā)的。就有類的繼承、封裝、多態(tài)

繼承:子類繼承父類的屬性和方法

封裝:函授的封裝

多態(tài):當(dāng)前方法的多種形態(tài)

后臺(tái)語(yǔ)言中的多態(tài)包含重載和重寫。js中的多態(tài)不存在重載,方法名一樣,后面的會(huì)把前面的覆蓋掉,最后只保留一個(gè)方法。(js中有一個(gè)類似重載但不是重載:可以根據(jù)傳遞的參數(shù)不一樣,實(shí)現(xiàn)不同的功能)重寫:子類重寫父類的方法

7、構(gòu)造函數(shù)模式

構(gòu)造函數(shù)是通過(guò)new關(guān)鍵詞創(chuàng)建一個(gè)實(shí)例;
var ex = new CreateJs();其中ex就是CreateJs的實(shí)例,生成CreateJs這個(gè)類;

Js中所有的類都是函數(shù)數(shù)據(jù)類型,它通過(guò)new執(zhí)行變成一個(gè)類,但是他本身也是個(gè)普通的函數(shù)

Js中所有的實(shí)例都是對(duì)象數(shù)據(jù)類型

在構(gòu)造函數(shù)模式中,類中出現(xiàn)的this.xxx=xxx中this是當(dāng)前類的一個(gè)實(shí)例

不同實(shí)例之間方法不一樣(下例)

在構(gòu)造函數(shù)模式中,瀏覽器會(huì)默認(rèn)把我們的實(shí)例返回(返回對(duì)象數(shù)據(jù)類型的值);如果我們手動(dòng)寫return返回;

如果ruturn是一個(gè)基本數(shù)據(jù)類型的值,當(dāng)前實(shí)例不變,例如:return 10;

如果return是一個(gè)引用數(shù)據(jù)類型的值,當(dāng)前實(shí)例會(huì)被自己返回的值替換,例如:ruturn {name:"張三"}

檢測(cè)某個(gè)實(shí)例是否屬于這個(gè)類 instanceof;

zhangsan instancaof CreateJs->true

in:檢測(cè)某一個(gè)屬性是否屬于這個(gè)對(duì)象 attr in object,不管是私有屬性還是共有屬性,只要存在,用in檢測(cè)都是true

hasOwnProperty:用來(lái)檢測(cè)某一個(gè)屬性是否為這個(gè)對(duì)象的私有屬性,這個(gè)方法只能檢測(cè)私有屬性 obj.hasOwnProperty(attr);

function CreateJs(name,age) {
    this.name = name;
    this.age = age;
    this.writeJs = function() {
        console.log("my is "+ this.name +" can write js");  
    }
    
}

var zhangsan = new CreateJs("張三","18");
zhangsan.writeJs();
var lisi = new CreateJs("李四","20");
lisi.writeJs();
zhangsan.writeJs === lisi.writeJs//false
8、原型鏈模式

每一個(gè)函數(shù)數(shù)據(jù)類型(普通函數(shù)、類)都有一個(gè)天生自帶的屬性:prototype(原型),并且這個(gè)屬性是一個(gè)對(duì)象數(shù)據(jù)類型的值;

prototype上瀏覽器天生給它加了個(gè)屬性constructor(構(gòu)造函數(shù)),屬性值是當(dāng)前函數(shù)(類)本身;

每一對(duì)象數(shù)據(jù)類型(普通對(duì)象、實(shí)例、prototype..)天生自帶一個(gè)屬性__proto__,屬性值是當(dāng)前實(shí)例所屬類的prototype(原型)

Object是Js中所有對(duì)象的基類,Object.prototype上沒(méi)有__proto__這個(gè)屬性

function CreateJs(name,age) {
    this.name = name;
    this.age = age;
}

CreateJs.prototype.writeJs = function() {
    console.log("my is "+ this.name +" can write js");  
}

var zhangsan = new CreateJs("張三","18");
zhangsan.writeJs();
var lisi = new CreateJs("李四","20");
lisi.writeJs();
zhangsan.writeJs === lisi.writeJs//true

通過(guò)對(duì)象名.屬性名獲取屬性值的時(shí)候,首先在對(duì)象的私有屬性找,如果私有屬性存在,則獲取的是私有屬性值;

如果私有沒(méi)有,則通過(guò)__proto__找到所屬類的原型,原型上存在的話獲取的是公有的屬性值;

如果原型上也沒(méi)有,則繼續(xù)通過(guò)原型上的__proto__繼續(xù)向上查找,一直找到Object.protoype為止

9、call、apply、bind使用
call、apply的區(qū)別

對(duì)于 apply、call 二者而言,作用完全一樣,只是接受參數(shù)的方式不太一樣。

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])

實(shí)例:

//1、數(shù)組之間追加
var array1 = [12 , "foo" , {name "Joe"} , -2458]; 
var array2 = ["Doe" , 555 , 100]; 
Array.prototype.push.apply(array1, array2); 
/* array1 值為  [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */

//2、獲取數(shù)組中的最大值最小值(數(shù)組中本身沒(méi)有max方法)
var  numbers = [5, 458 , 120 , -215 ]; 
var maxInNumbers = Math.max.apply(Math, numbers),   //458
    maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458

//3、檢驗(yàn)數(shù)據(jù)類型
Object.prototype.toString.call(obj) === "[object Array]" ;

//4、類數(shù)組轉(zhuǎn)數(shù)組
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

bind

bind()方法會(huì)創(chuàng)建一個(gè)新函數(shù),稱為綁定函數(shù),當(dāng)調(diào)用這個(gè)綁定函數(shù)時(shí),綁定函數(shù)會(huì)以創(chuàng)建它時(shí)傳入 bind()方法的第一個(gè)參數(shù)作為 this,傳入 bind() 方法的第二個(gè)以及以后的參數(shù)加上綁定函數(shù)運(yùn)行時(shí)本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來(lái)調(diào)用原函數(shù)

var bar = function(){
    console.log(this.x);
}
var foo = {
    x:3
}

bar(); // undefined
//bind是先綁定this和參數(shù),不執(zhí)行本身函數(shù)
//call和apply是綁定this和參數(shù)后立即執(zhí)行本身函數(shù)
var func = bar.bind(foo);
func(); // 3
10、計(jì)算數(shù)組中最大值

var arr = [12,43,2323,455,23,5];
arr.sort(function(x,y) {
    return x-y;
})
var max = arr[arr.length-1];


var arr1 = [123,34,54,23,56,1];
var max = arr1[0];
for(var i = 0;i < arr1.length;i++ ) {
    var cur = arr1[i];
    if(cur>max) {
        max = cur[i];
    }
}


var arr2 = [23,43,123,341,3233];
var max = Math.max.apply(null,arr2);


var arr3 = [567,23,42,45,1,98];
var max = eval("Math.max("+arrr.toString()+")");
11、數(shù)組求平均數(shù)

function avgFn() {
    var arr = Array.prototype.slice.apply(arguments);
    arr.sort(function(x,y) {
        return x - y;
    })
    arr.shift()
    arr.pop();
    var arg =(eval(arr.join("+"))/arr.length).toFixed(2)  
    return arg;
    
}
avgFn(68,97,97,91,99.1,89.5,98.23)


function avgFn() {
    var arr = [].sort.call(arguments,function(x,y) {
        return x-y;
    });
    [].shift.call(arguments);
    [].pop.call(arguments);
    return (eval([].join.call(arguments,"+"))/arguments.length).toFixed(2);
}

avgFn(68,97,97,91,99.1,89.5,98.23)
12、sort的深入
arr.sort();只能默認(rèn)排序10以內(nèi)的數(shù)字和26字母排序
var arr = [1,3,4,65,23,32,43,567];
arr.sort();//log->[1, 23, 3, 32, 4, 43, 567, 65]

var arr1 = [2,5,6,4,9,1.2,0.9];
arr1.sort();//log->[0.9, 1.2, 2, 4, 5, 6, 9]

var arr2 = ["a","y","b","t","p","c"];
arr2.sort();//log->["a", "b", "c", "p", "t", "y"]
arr.sort(function(){})傳遞參數(shù)

var arr = [1,3,4,65,23,32,43,567];
arr.sort();
/**
*執(zhí)行中a和b的值
*a  b
*1  3
*3  4
*4  65
*65 23
*4  23
*65 32
*23 32
*65 43
*32 43
*65 567
*a - b > 0 a和b調(diào)換位置
*a - b <= 0 位置不變
*/

arr.sort(function(a,b){
    return a - b; 
})


arr.sort(function(a,b){
    return b - a;
})
利用localeCompare字母排序

localeCompare第一個(gè)字符串字母按照26個(gè)字母順序排序,如果第一個(gè)字母相同會(huì)按照第二個(gè)字母排序以此類推,漢字會(huì)先轉(zhuǎn)換成拼音再排序,如果漢字同音會(huì)按照漢字unicode順序排

"a".localeCompare("b")
//-1
"c".localeCompare("b")
//1

var arr = [{name:"wangwu",age:17},{name:"lisi",age:17},{name:"dahuang",age:21}];

arr.sort(function(a,b){
    return a.name.localeCompare(b.name);
})

//[{name:"dahuang",age:21},{name:"lisi",age:17},{name:"wangwu",age:17}]

var arr = [{name:"小呂",age:17},{name:"老王",age:17},{name:"大黃",age:21}];

arr.sort(function(a,b){
    return a.name.localeCompare(b.name);
})

//[{name:"大黃",age:21},{name:"老王",age:17},{name:"小呂",age:17}]
13、DOM回流(重排 reflow)、DOM重繪、DOM映射

DOM回流:DOM樹渲染完畢以后,只要頁(yè)面中的HTML結(jié)構(gòu)發(fā)生變化(增加刪除元素、位置發(fā)生變化),瀏覽器都要重新計(jì)算一遍最新的DOM結(jié)構(gòu),重新對(duì)當(dāng)前頁(yè)面進(jìn)行渲染;

DOM重繪:DOM樹位置不發(fā)生變化,如元素的顏色背景發(fā)生變化,會(huì)只針對(duì)這個(gè)元素渲染,不渲染整個(gè)頁(yè)面

DOM映射:頁(yè)面中的標(biāo)簽和Js中獲取到的元素對(duì)象(元素集合)是緊緊綁定在一起的,頁(yè)面中HTML結(jié)構(gòu)改變了,Js不需要重新獲取,集合里面的內(nèi)容也會(huì)跟著自動(dòng)改變

14、js中數(shù)據(jù)綁定的方法
1、動(dòng)態(tài)創(chuàng)建節(jié)點(diǎn)方式
var oUl = document.getElementById("ul");
var oLi = document.createElement("li");
oLi.innerHTML = "hello world";
oUl.appendChild(oLi);
2、字符串拼接的方式
var oUl = document.getElementById("ul");

var str = "";
for(var i = 0;i < arr.length; i++) {
    str += "
  • "; str += "hello" + arr[i]; str += "
  • " } oUl.innerHTML += str;
    3、文檔碎片方式
    var oUl = document.getElementById("ul");
    var frg = document.createDocumentFragment();//創(chuàng)建一個(gè)文檔碎片
    var oLi = document.createElement("li");
    oLi.innerHTML = "hello world";
    frg.appendChild(oLi);
    
    oUl.appendChild(frg);
    
    frg = null;//手動(dòng)清空碎片
    
    
    15、正則 什么是正則
    它是一個(gè)規(guī)則,用來(lái)處理字符串的規(guī)則。
    正則的創(chuàng)建
    1. 字面量創(chuàng)建
    var reg = /d/;
    2. 實(shí)例創(chuàng)建
    var reg = new RegExp("d");
    元字符
    每一個(gè)正則表達(dá)式都是由元字符和     修飾符組成

    具有特殊意義的元字符

    :轉(zhuǎn)義后面字符所代表的含義

    ^ :以某一個(gè)元字符開始

    $ :以某一個(gè)元字符結(jié)束

    n :匹配一個(gè)換行符

    . :除了n以外的任意字符

    () :分組

    x|y :x或y中的一個(gè)

    [xyz] :x或者y或者z中的任何一個(gè)字符

    [a-z] :a-z之間的任意字符

    [^a-z]:除了a-z之間的任何字符
    
    d :一個(gè)0-9之間的任何數(shù)字
    
     :匹配一個(gè)邊界符
    
    w :數(shù)字字母下劃線中的任意一個(gè)字符
    
    s:匹配一個(gè)空白字符 空格、制表符、換頁(yè)符...
    
    

    代表出現(xiàn)次數(shù)的量詞元字符

    * :出現(xiàn)0到多次

    + :出現(xiàn)1到多次

    ? :出現(xiàn)0到1次

    {n} :出現(xiàn)n次

    {n,} :出現(xiàn)n到多次

    {n,m} :出現(xiàn)n到m次

    ()分組的作用

    改變x|y的優(yōu)先級(jí)

    var reg = /^18|19$/;
    //18、19、181、189、119、819、1819....true
    var reg = /^(18|19)$/;
    //18、19true

    分組引用

    var reg = /^(w)1(w)2$/;
    reg.test("aabb")//true
    reg.test("abcd")//false
    //1代表和第一個(gè)分組出現(xiàn)一模一樣的內(nèi)容
    //2代表和第二個(gè)分組出現(xiàn)一模一樣的內(nèi)容
    
    //去除重復(fù)的字符
    var str = "aaaabbbbccccffffdffffdssss440000008888";
    str.replace(/(w)1+/g,"$1");
    //"abcds408"
    

    分組捕獲

    正則在捕獲的時(shí)候,不僅僅把大正則匹配到,而且還可以把小分組的內(nèi)容捕獲到

    var reg = /^(d{2})(d{4})(d{4})(d{4})d{2}(d{1})[d|X]$/
    var arr = reg.exec("100604198805112411");
    //["100604198805112411", "10", "0604", "1988", "0511", "1"]
    //100604198805112411大正則匹配的內(nèi)容
    //"10", "0604", "1988", "0511", "1"小分組匹配

    [](1)、在中括號(hào)中出現(xiàn)的所有的字符都是代表本身意義的字符(沒(méi)有特殊的含義)(2)、中括號(hào)不識(shí)別兩位數(shù)

    var reg = /^[.]$/;
    reg.test("1");//false
    reg.test(".");//true
    
    var reg = /[12]/;
    //1||2 不是12
    
    var reg = /^[21-57]$/;
    //2||1-5||7中的任意一個(gè)
    
    //年齡介于[16-58]
    var reg = /^(1[6-9]|[2-4]d|5[0-8])$/;
    //簡(jiǎn)單的驗(yàn)證郵箱
    var reg = /^[w.-]+@[da-zA-Z]+(.[a-zA-Z]{2,4}){1,2}$/;
    //中國(guó)標(biāo)準(zhǔn)真實(shí)姓名2-4位漢字
    var reg = /^[u4e00-u9fa5]{2,4}$/;
    //身份證號(hào)碼
    //100604198805112411
    //10(省)0604(市區(qū)縣)19880511(出身年月)24(沒(méi)用)1(奇數(shù)男、偶數(shù)女)1(0-9||X)
    var reg = /^(d{2})(d{4})(d{4})(d{4})d{2}(d{1})[d|X]$/;
    
    正則的捕獲exec

    捕獲的內(nèi)容是個(gè)數(shù)組

    var reg = /d+/;
    reg.exec("ducen23niubi21");
    //0:"23",index:5,input:"ducen23niubi"

    正則捕獲的特點(diǎn)

    懶惰型:每一次執(zhí)行exec只捕獲第一個(gè)匹配的內(nèi)容,在不進(jìn)行任何處理的情況下,在執(zhí)行多次捕獲,捕獲的還是第一個(gè)匹配的值
    var reg = /d+/
    reg.lastIndex//0
    res = reg.exec("ducen23niubi12")//["23"]
    reg.lastIndex//0
    res = reg.exec("ducen23niubi12")//["23"]
    
    //解決懶惰性,在正則后加修飾符g
    var reg = /d+/g
    reg.lastIndex//0
    res = reg.exec("ducen23niubi12")//["23"]
    reg.lastIndex//7
    res = reg.exec("ducen23niubi12")//["12"]
    reg.lastIndex//14
    res = reg.exec("ducen23niubi12")//null

    貪婪性:正則每一次捕獲都是按照匹配最長(zhǎng)的結(jié)果

    var reg = /d+/;
    res = reg.exec("ducen2017niubi12");
    //捕獲到的是["2017"]而不是2
    
    
    //解決正則的貪婪性(在量詞元字符后面添加一個(gè)?)
    var reg = /d+?/;
    res = reg.exec("ducen2017niubi12");
    //捕獲的是["2"];

    ++?在正則中有很多作用,放在一個(gè)不同的元字符后面代表出現(xiàn)0-1次 /d?/(數(shù)字出現(xiàn)一次或不出現(xiàn));放在一個(gè)量詞的元字符后面是取消捕獲的貪婪性++

    正則的修飾符(g、i、m)
    var reg = /d/gim
    //g:全局匹配
    //i:忽略大小寫匹配
    //m:多行匹配
    var reg = /d+/g
    var arr = []
    res = reg.exec("ducen23niubi12");
    while(res) {
        arr.push(res[0]);
        res = reg.exec("ducen23niubi12")
    }
    arr//["23", "12"]
    字符串中的match方法
    把所有和正則匹配的字符都獲取到
    var reg = /d+/g
    var arr = "ducen23niubi12".match(reg);
    arr//["23", "12"]

    雖然在當(dāng)前的情況下match比我們的exec更加簡(jiǎn)便一些,但是match中存在一些自己處理不了的問(wèn)題:在分組捕獲的情況下,match只能捕獲大正則匹配的內(nèi)容,而對(duì)小正則捕獲的內(nèi)容無(wú)法獲取

    字符串中的replace方法
    var str = "ducen2015ducen2016";
    str.replace("ducen","huming");
    //"huming2015ducen2016"
    
    str.replace(/ducen/g,function(arg){
        console.log(arguments);
        
        return "huming";
    })
    //"huming2015huming2016"
    
    str.replace(/ducen(d+)/g,function(arg){
        console.log(arguments)
        console.log(arguments[1])//2015 2016 獲取小正則
    })
    
    
    

    replace中的匿名函數(shù)執(zhí)行次數(shù),取決于正則捕獲的次數(shù)

    每一次執(zhí)行匿名函數(shù)里面?zhèn)鬟f的參數(shù)值arguments和我們自己通過(guò)exec捕獲到的結(jié)果是非常類似的(即使正則有分組,我們也可以通過(guò)arguments獲?。?/strong>

    return:你返回的結(jié)果是啥,就相當(dāng)于把當(dāng)前大正則捕獲的內(nèi)容替換成返回的內(nèi)容

    var arr = ["零","壹","貳","叄","肆","伍","陸","柒","捌","玖"]
    var  s  = "20170401";
    s.replace(/d/g,function(){
        return arr[arguments[0]]
    })
    
    
    //1
    "2343289".replace(/^(d{1,3})((?:d{3})+)$/,function(){
        return arguments[1]+"," + arguments[2].replace(/(d){3}(?!$)/g,function(){
        
            return arguments[0]+ ","
        })
    })
    
    //2
    var str = "2343289";
    str.replace(/(d)(?!$)/g,function(res,i){
        if((str.length-i-1)%3==0) {
            return res+ ","    
        }else{
            return res;
        }
    })
    
    //3
    var str = "2343289";
    str = str.split("").reverse().join("");
    str = str.replace(/(d{3})/g,"$1,");
    str.split("").reverse().join("");
    
    
    
    
    正則中?的用法

    在量詞后面代表0到1次(?)

    var reg = /^(+|-)?d+(.d+)?$/;

    匹配不捕獲(?:)

    var reg = /^(?:+|-)?d+(.d+)?$/

    取消正則貪婪捕獲,把?放在量字后面(?)

    var reg = /d+/;
    res = reg.exec("ducen2017niubi12");
    //捕獲到的是["2017"]而不是2
    
    //解決正則的貪婪性(在量詞元字符后面添加一個(gè)?)
    var reg = /d+?/;
    res = reg.exec("ducen2017niubi12");
    //捕獲的是["2"];

    正向預(yù)查、負(fù)向預(yù)查(條件)

    (?!n)->匹配任何其后緊接指定字符串 n 的字符串。
    (?=n)->匹配任何其后沒(méi)有緊接指定字符串 n 的字符串。

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82391.html

    相關(guān)文章

    • 前端綜合性文檔和教程總結(jié)(持續(xù)更新)

      摘要:小弟在前端摸爬滾打一段時(shí)間,發(fā)現(xiàn)前端的比較好的文檔比較分散,特別是中文的,我平時(shí)都是收藏在瀏覽器里,以后有好的教程和綜合性的文檔我會(huì)更新到這里。小組中文文檔,很全。 小弟在前端摸爬滾打一段時(shí)間,發(fā)現(xiàn)前端的比較好的文檔比較分散,特別是中文的,我平時(shí)都是ctrl+D收藏在瀏覽器里,以后有好的教程和綜合性的文檔我會(huì)更新到這里。一則可以做個(gè)記錄,防止丟失。二則有需要的朋友可以來(lái)我這里找一找。 ...

      piglei 評(píng)論0 收藏0
    • 初學(xué)者學(xué)習(xí)JAVASCRIPT很吃力怎么辦?到底該如何學(xué)習(xí)JS?

      摘要:給初學(xué)者的印象總是那么的雜而亂,相信很多初學(xué)者都在找輕松學(xué)習(xí)的途徑。通常學(xué)了很久的基礎(chǔ)之后,變量函數(shù)對(duì)象你也都略知一二,但一到公司開發(fā)項(xiàng)目的時(shí)候,卻又難以下手。 Js給初學(xué)者的印象總是那么的雜而亂,相信很多初學(xué)者都在找輕松學(xué)習(xí)Js的途徑。在這里給大家總結(jié)一些學(xué)習(xí)Js的經(jīng)驗(yàn),希望能給后來(lái)的學(xué)習(xí)者探索出一條輕松學(xué)習(xí)Js之路。Js給人那種感覺(jué)的原因多半是因?yàn)樗缦碌奶攸c(diǎn):A:本身知識(shí)很抽象、...

      WrBug 評(píng)論0 收藏0
    • 【連載】前端個(gè)人文章整理-從基礎(chǔ)到入門

      摘要:個(gè)人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會(huì)繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開始萌生寫文章的想法,到著手...

      madthumb 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <