• js原生小小总结(二)


    Day10

    DOM

    一.设置或访问元素节点中的属性(自定义属性)

    1.获取自定义属性 getAttribute()
    2.设置自定义属性 setAttribute()
    3.删除属性 removeAttribute()

    二.outerHTML/innerHTML/textHTML
    三.childNodes/children

    1.去除空白文本节点

    
        function removeSpace(node){
            var childs = node.childNodes;
            for(var i = 0;i < childs.length;i ++){
                if(childs[i].nodeType === 3 && /^s+$/.test(childs[i].nodeValue)){
                    node.removeChild(childs[i]);
                }
            }
            return node;
        }
    
    四.高级选项

    parentNode : 父节点
    previousSibling : 前一个兄弟节点
    nextSibling : 后一个兄弟节点
    firstChild: 第一个子节点
    lastChild : 最后一个子节点
    parentElementNode
    previousElementSibling
    nextElementSibling
    firstElementChild
    lastElementChild

    五.插入

    insertBefore(新节点,指定的旧节点)

    Day11

    一.什么是事件对象?

    当一个对象触发了所绑定的事件,所发生的一切详细信息都将保存在一个临时的地方,这个地方就叫做事件对象(相当于飞机上的黑匣子)。

    二.如何获取事件对象?
    1.ie : window.event
    2.标准浏览器 : 给事件处理函数传递的第一个参数
    3.兼容: 形参 || window.event
    三.如何获取鼠标的编码值? event.button
    1.标准浏览器 : 0 1 2
    2.IE : 1 4 2

    鼠标按钮兼容:

    
                function getButton(evt){
                    var e = evt || window.event;
                    if(evt){
                        return e.button;
                    }else if(window.event){
                        switch(e.button){
                            case 1 : return 0;
                            case 4 : return 1;
                            case 2 : return 2;
                        }
                    }
                }
    
    四.如何获取鼠标的各种坐标值?
    1.相对坐标值 : event.offsetX/event.offsetY
    2.可视区坐标值: event.clientX/event.clientY
    3.绝对坐标值 : event.pageX/event.pageY
    
    滑动轮高度  scrollTop = document.documentElement.scrollTop || document.body.scrollTop
    
    页面高度 event.pageY = event.clentY + scrollTop
    
    
                document.onscroll = function(evt){
                    var e = evt || window.event;
                    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
                    console.log(scrollTop)
                }
    
    4.屏幕坐标值: event.screenX/event.screenY
    
                var oDiv = document.querySelector('#box');
                oDiv.onclick = function(evt){
                    var e = evt || window.event;
                    console.log("offsetX:" + e.offsetX + '
    offsetY:' + e.offsetY);
                    console.log("clientX:" + e.clientX + '
    clientY:' + e.clientY);
                    console.log("pageX:" + e.pageX + '
    pageY:' + e.pageY);
                    console.log("screenX:" + e.screenX + '
    screenY:' + e.screenY);
                }
    
    
    .clientX/clientY属性介绍
        鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,
    即是以浏览器滑动条此刻的滑动到的位置为参考点,不随滑动条移动 而变化.
    二.offsetX/offsetY属性介绍
        鼠标点击位置相对于点击(鼠标所在对象区域)的坐标位置
    三.pageX/pageY属性介绍
        鼠标在页面上的位置,从页面左上角开始,
    即是以页面为参考点,随滑动条移动而变化
    四.扩展:screenXscreenY属性
        鼠标点击位置到windows屏幕窗口的坐标位置
    
    
    五.事件流(事件捕获——事件目标——事件冒泡)

    兼容阻止冒泡

    
                document.getElementById("btn").onclick = function(evt){
                    evt = evt || window.event;
                    alert(this.nodeName);
    //              evt.stopPropagation();//IE不兼容
    //              evt.cancelBubble = true;//IE
                    evt.stopPropagation ? evt.stopPropagation() : evt.cancelBubble = true;
                }
    
    六.键盘事件

    onkeydown/onkeyup    keyCode   
    onkeypress
    event.keyCode || event.charCode || event.which

    ### Day12
    ##### 一.如何阻止事件的默认行为?
    ###### 1.右键菜单 : oncontextmenu return false
    ###### 2.超链接:
    event.preventDefault? event.preventDefault() : event.returnValue = false

    
                var oA = document.getElementById("aa");
                oA.onclick = function(evt){
                    evt = evt || window.event;
                    evt.preventDefault();
                    evt.returnValue = false;
                }
    

    ###### 3.拖拽 : ondragstart return false

    
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">style type="text/css">
                #box{
                    width: 100px;
                    height: 100px;
                    background: red;
                    position: absolute;
                }
                img{
                    width: 100px;
                    height: 100px;
                    position: absolute;
                    left :150px;
                }
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">style>
        </<span class="hljs-name" style="margin: 0px; padding: 0px;">head>
        <<span class="hljs-name" style="margin: 0px; padding: 0px;">body style="height: 5000px;">
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">div id="box">
                
                
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">div>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">img src="img/1.jpg" id="img1"/>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">script type="text/javascript">
                drag('box');
                drag('img1')
                function drag(id){
                    var ele = document.getElementById(id);
                    ele.onmousedown = function(evt){
                        var e = evt || window.event;
                        var disX = e.offsetX;
                        var disY = e.offsetY;
                        document.onmousemove = function(evt){
                            var e = evt || window.event;
                            ele.style.left = e.pageX - disX + 'px';
                            ele.style.top = e.pageY - disY + 'px';
                        }
                        document.onmouseup = function(){
                            document.onmousemove = null;
                        }
                        //去掉拖拽的默认行为
                        document.ondragstart = function(){
                            return false;
                        }
                    }
                }
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">script>
        </<span class="hljs-name" style="margin: 0px; padding: 0px;">body>
    

    ##### 二.添加事件监听器

    
    function addEventListener(obj,event,fn,boo){
        if(obj.addEventListener){
            obj.addEventListener(event,fn,boo);
        }else{
            obj.attachEvent('on' + event,fn);
        }
    }
    

    ##### 三.移除事件监听 器

    
    function removeEventListener(obj,event,fn,boo){
        if(obj.removeEventListener){
            obj.removeEventListener(event,fn,boo);
        }else{
            obj.detachEvent('on' + event,fn);
        }
    }
    

    ##### 四.事件委托/事件代理
    ###### 1.事件委托的优点:==提高性能==
    ###### 2.原理 : ==事件冒泡==

    
        <<span class="hljs-name" style="margin: 0px; padding: 0px;">body>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">ul>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>1</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>2</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>3</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>4</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>5</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">h2>hhhh222</<span class="hljs-name" style="margin: 0px; padding: 0px;">h2>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>6</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>7</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>8</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>9</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
                <<span class="hljs-name" style="margin: 0px; padding: 0px;">li>10</<span class="hljs-name" style="margin: 0px; padding: 0px;">li>
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">ul>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">script type="text/javascript">
                var oUl = document.getElementsByTagName_r('ul')[0];
                oUl.onmouseover = function(evt){
                    var e = evt || window.event;
                    var target = e.target || e.srcElement;
                    if(target.nodeName.toUpperCase() === 'LI'){
                        target.style.background = 'red';
                    }
                    
                }
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">script>
        </<span class="hljs-name" style="margin: 0px; padding: 0px;">body>
    

    ##### 五.事件
    onclick
    ondblclick
    onmousedown
    onmouseup
    onmouseover : 移入事件
    onmouseout :移出事件
    onmouseenter : 移入事件(默认阻止事件冒泡)
    onmouseleave : 移出事件(默认阻止事件冒泡)
    onmousemove
    onkeydown
    onkeyup
    onkeypress
    onload
    onblur
    onfocus
    onchange
    onscroll
    onresize
    oncontextmenu
    ondragstart
    onsubmit
    ##### 六.拖拽

    ##### 七. offset

    offsetWidth : width + padding + border

    offsetHeight : height + padding + border

    offsetLeft : 相对于父节点的left值

    offsetTop : 相对于父节点的top值

    Day13

    一.什么是cookie?

    存储在浏览器的文档
    在本地的客户端的磁盘上以很小的文件 形式保存数据。

    二.如何创建cookie?

    ==document.cookie = "key=value;[expires=日期对象;path='/']"==

    三.cookie的特点:

    ==1.一个cookie的大小不超过4KB
    2.一个域中的cookie数量在50条左右
    3.cookie存在一定的风险==

    Day14

    一.什么是正则表达式?

    匹配字符的一组规则

    二.如何定义正则表达式?
    1. /正则表达式/标志位
    2. new RegExp("正则表达式",'标志位')
    3.元字符 : 三三二三个一

    三: {} [] ()
    X{} : 表示括号前的一个或一组字符连续出现的次数.
    X{m} : 表示括号前的一个或一组字符连续出现m次.
    X{m,} : 表示括号前的一个或一组字符连续出现m至无限次.
    X{m,n} : 表示括号前的一个或一组字符连续出现m至n次.
    [] : 表示范围 (可以把正则的符号放进[]中解析为字符);
    [u4e00-u9fa5]
    () : 表示组

    三: * + ?
    X* : {0,}
    表示*前的一个或一组字符连续出现0至无限次.
    X+ : {1,}
    表示+前的一个或一组字符连续出现1至无限次.
    X? : {0,1}
    表示?前的一个或一组字符连续出现0至1次.

    二 : ^ $
    ^ : 用于正则的开头 : 表示定头
    用于[]的开头: 表示取反 [^0-9]
    $ : 表示定尾

    三个一: . |  
    . : 表示模糊匹配任意一个字符
    | : 表示或者
     : 转义符 (将正则的符号放在后,解析为字符串);
    d : 数字
    D : 非数字
    s : 空白符
    S : 非空白符
    w : 字母数字下划线
    W : 非字母数字下划线
     : 表示边界

    三.标志位
    g : 表示全局
    i : 不区别大小写
    四.正则的方法
    1.test() 返回boolean
    2.exec() :返回数组 null
    五.字符串的方法
    1.match() :返回数组 null
    2.search() : 返回下标值, -1
    3.replace()
    六.exec与match的区别

    exec是正则调用,参数是字符串
    match是字符串调用,参数是正则表达式

    
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">script type="text/javascript">
                var str = 'how do you do';
                var re = /o/;
                console.log(re.exec(str));
                console.log(str.match(re));
                
                 
                 
                var str = 'how do you do';
                var re = /o/g;
                console.log(re.exec(str));
                console.log(str.match(re));
                
                //全局匹配时,exec无效
                
                var str = 'how do you do';
                var re = /(o).*(o)/;
                console.log(re.exec(str));
                console.log(str.match(re));
                
                 //()有几个就代表有几个相应的匹配个数,整体也是一个
                
                
                var str = 'how do you do';
                var re = /(o).*(o)/g;
                console.log(re.exec(str));
                console.log(str.match(re));
                
    

    Day15

    一.ES6
    1. bind()/call()/apply()

    ==bind() : 返回一个函数==
    ==call()/apply() :返回一个对象==

    2. JSON : 网络数据传输格式

    JSON是一种基于文本的数据交换方式,或者叫做数据描述格式。

    JSON的优点:
    1. 基于纯文本,跨平台传递极其简单
    2. JS原生支持,后台语言几乎全部支持
    3. 轻量级数据格式,占用字符数量极少,特别适合互联网传递
    4. 可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的
    5. 容易编写和解析,当然前提是你要知道数据结构
    1.==[]==
    2. =={"key" : "value","key" : "value"}==
    
        //原生对象 : {key : 'value',"key" : "value",key : "value"}
    

    【注】
    ==JSON 的健和值必须加双引号,数字可不加,不可加单引号。==
    一个JSON中只能有一个JSON数据。[ ]
    可以在[ ] 中写多个 { }。

    3. JSON.parse()/JSON.stringify() IE8以下不兼容

    ==JSON.parse()== : 将json字符串转为json对象
    ==JSON.stringify()== :将json对象转为json字符串

    
                var str = '{"name" : "张志林","age" : 18}';
                //转为json对象
                //eval_r() : 存在风险
    //          var json = eval_r('(' + str + ')');
    //          console.log(json.name);
                var json = JSON.parse(str);
                json.address = "青岛";
                //转为json字符串
                str = JSON.stringify(json);
                console.log(str);
    
    4.let/const

    1> let声明的变量不能做变量提升

    2> 同一个作用域中不能重复声明一个变量

    3> let声明,会产生块级作用域
    注: for循环有两个作用域,for循环本身是一个块级作用域,for循环的{}又是for循环的子级作用域

    4> let声明的全局变量不再是window的属性

    const 好处: 一改全改

    【注】const
    使用const命名是为了当有大量重复常量时,方便修改
    常量要求全大写,
    当常量是数组时,可以修改数组的元素,地址不可修改。

    5.变量的解构赋值

    [] // 返回一个数组
    可以直接对应赋值;
    ++交换变量的值[x, y] = [y, x];++
    上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰。

    {} // 返回一个对象
    ++从函数返回多个值,传参可不按顺序++
    函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

    
                ;
    //          var a = 3;
    ////            ;
    //          let b = 4;
    //          var a = 5;
    //          var a = 6;
    //           b = 8;
    //          {
    //              let a = 3;
    //              
    //          }
    //          ;
    
    //          for(let i = 1;i < 5;i ++,console.log(i)){
    //              let i = 8;
    //              console.log(i);
    //          }
    //          const G = 10;
    //          const ARR = [1,2,3,4];
    //          ARR[0] = 10;
    //          console.log(ARR[0]);
    //          let a = 3;
    //          ;
    //          let b = 3 * G;
    //          let [a,b,c] = [1,2,3];
    //          let [q,[w,[e],r],t] = [1,[2,[3],4],5];////不写的话显示,undefined
    //          [a,b] = [b,a];
    //          console.log(a,b,c);
    //          let {a,b=9,c} = {c : 8,a : 2};
    //          console.log(a,b,c);
                
                
                function fn({a = 1,b = 2,c = 3}){
                    return [a,b,c];
                }
                let [x,y,z] = fn({a : 3,c : 5,b : 4});
                console.log(x,y,z);
    
    6.字符串的扩展方法

    1> includes() :
    判断子串是否在父串中包含,如果有,返回true,没有,返回false

    2> startsWith():
    判断子串是否在父串的开头部分,如果在,返回true,不在,返回false

    3> endsWith() : 判断子串是否在父串的结尾部分,如果在,返回true,不在,返回false

    4> repeat() :
    重复字符串
    注: 如果<= -1 报错
    如果是小数 : 自动取整
    如果是字符串:自动转为数字,如果转不了数字的,转为NaN,NaN按0算

    
                var str = "how do you do";
                console.log(str.includes('do',str.length));
                console.log(str.startsWith('do',4));
                console.log(str.endsWith('do',5));
    
    7.生成器函数:解决异步产生的问题

    ==异步:同时进行==
    ==同步:执行完一个,再执行一个==
    //生成器函数
    *指针函数,按照指针一步一步执行,每次要点一次 fn().next()

    
        function * fn(){
            yield  setTimeout(()=>{
                alert('1');
            },3000);
            yield  setTimeout(()=>{
                alert('2');
            },2000);
            yield  setTimeout(()=>{
                alert('3');
            },1000);
            
        }
        var me = fn();
        console.log(me.next())
    
    8.箭头函数 =>

    ++唯一好处: this自动指向所在函数外部的对象++

    
                var fn = ()=>{
    //              var a = 3;
    //              var b = 3;
    //              return a + b;
    //          }
    //          ;
    //          var fn1 = (a,b)=>a + b;
    //          ;
                document.onclick = function(){
                //;
    //          var that = this;
                setTimeout(()=>{
                    alert(this);
                },5000)
            }
    
    9.set

    1>自动去重

    
     let set = new Set([1,2,1,2,3,2,1,1,4]);//构造一个新的set
     console.log(set.size);//获取集合长度
     console.log([...set]);//转成数组
     
    

    2>添加元素
    set.add('a');

    3>删除元素
    set.delete(1);

    4>判断是否包含某个元素
    console.log(set.has(2));

    5>清空整个set
    // console.log(set.clear());
    // console.log(set);

    6>遍历
    //keys
    //values
    //entries
    //forEach()

    
            for(let key of set.keys()){
                console.log(key);
            }
            for(let key of set.values()){
                console.log(key);
            }
            for(let [key,value] of set.entries()){
                console.log(key,value);
            }
            set.forEach(function(value,key,set){
                console.log(key +'=>' + value);
            })
    
    10.
    
    数组 
    set
    原生 对象
    map
    
    
    //          var a = {x : 2},b = {x : 3},c = {};
    //          ;
    //          c[a] = 7;// '[object Object]'
    //          c[b] = 8; //'[object Object]'
    //          console.log(c);
    //          var obj = {};
    //          obj[[]] = 3;
    //          obj[[]] = 4;
    //          console.log(obj);
                //原生对象:所有key默认都会自动 转为字符串
                //map {name : '张三',[] : '1',[] : '2'}
                let map = new Map([
                    [1,2],
                    [[],3],
                    [[],4],
                    [{},5],
                    [{},6],
                    ['a',7]
                ]);
    //          console.log(map);
    //          ;
    //          console.log(map.size);
                //1.添加元素
                map.set('b',8).set('c',9);
                //2.访问元素
    //          console.log(map.get('b'));
                //3.删除元素
    //          console.log(map.delete('b'));
    //          console.log(map.delete([]));
                //4.清除map中所有的元素
    //          map.clear();
                //5.判断是否包含某个key的value
    //          console.log(map.has('c'));
    //          console.log(map);
                //6.遍历map
                //keys
                //values
                //entries
                //forEach()
                for(let key of map.keys()){
                    console.log(key);
                }
                for(let value of map.values()){
                    console.log(value);
                }
                for(let [key,value] of map.entries()){
                    console.log(key,value);
                }
                map.forEach(function(value,key,map){
                    console.log(key,value);
                })
    
    11.Symbol : 保证变量中的值是唯一的.
    
                var str1 = Symbol('hello');
                var str2 = Symbol('hello');
    //          console.log(str1 == str2);
    //          console.log(typeof str1);
                var obj = {};
                obj[str1] = 1;
                obj[str2] = 2;
                console.log(obj);
    
    12.class extends
    
            // Father
        
    

     

    
                class Father{
                //默认的方法
                //构造器
                constructor(name,age){
                    //属性
                    this.name = name;
                    this.age = age;
                }
                showName(){
                    return this.name;
                }
                showAge(){
                    return this.age;
                }
            }
            class Son extends Father{
                constructor(name,age){
                    //调用父类的构造器方法
                    super(name,age);  //超类,基类,父类
                    
                }
            }
            var son = new Son('张三',18);
            console.log(son.name);
            console.log(son.showName());
    

    class例子,拖拽

    html页面

    
    <<span class="hljs-name" style="margin: 0px; padding: 0px;">html>
        <<span class="hljs-name" style="margin: 0px; padding: 0px;">head>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">meta charset="UTF-8">
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">title></<span class="hljs-name" style="margin: 0px; padding: 0px;">title>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">style type="text/css">
                body{
                    height: 5000px;
                }
                #fa{
                    width: 100px;
                    height: 100px;
                    background: red;
                    position: absolute;
                }
                #so{
                    width: 100px;
                    height: 100px;
                    background: green;
                    position: absolute;
                    left: 130px;
                }
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">style>
        </<span class="hljs-name" style="margin: 0px; padding: 0px;">head>
        <<span class="hljs-name" style="margin: 0px; padding: 0px;">body>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">div id="fa">
                父类:无边界拖拽
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">div>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">div id="so">
                子类:有边界拖拽
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">div>
            
            
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">script type="text/;"></<span class="hljs-name" style="margin: 0px; padding: 0px;">script>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">script type="text/;"></<span class="hljs-name" style="margin: 0px; padding: 0px;">script>
            <<span class="hljs-name" style="margin: 0px; padding: 0px;">script type="text/javascript">
                new Drag('fa');
                new Subdrag('so');
            </<span class="hljs-name" style="margin: 0px; padding: 0px;">script>
        </<span class="hljs-name" style="margin: 0px; padding: 0px;">body>
    </<span class="hljs-name" style="margin: 0px; padding: 0px;">html>
    

    父类

    
    class Drag{
        constructor(id){
            this.ele = document.getElementById(id);
            this.ele.onmousedown = function(evt){
                this.fnDown(evt);
            }.bind(this);
        }
        fnDown(evt){
            var e = evt || window.event;
            this.disX = e.offsetX;
            this.disY = e.offsetY;
            document.onmousemove = (evt)=>{
                this.fnMove(evt);
            }
            document.onmouseup = this.fnUp;
        }
        fnMove(evt){
            let e = evt || window.event;
            this.ele.style.left = e.pageX - this.disX + 'px';
            this.ele.style.top = e.pageY - this.disY + 'px';
        }
        fnUp(){
            document.onmousemove = null;
        }
    }
    

    子类

    
    class Subdrag extends Drag{
        constructor(id){
            super(id);
        }
        fnMove(evt){
            let e = evt || window.event;
            let left = e.pageX - this.disX;
            let top = e.pageY - this.disY;
            //设置边界
            if(left <= 0){
                left = 0;
            }else if(left >= document.documentElement.clientWidth - this.ele.offsetWidth){
                left = document.documentElement.clientWidth - this.ele.offsetWidth;
            }
            if(top <= 0){
                top= 0;
            }else if(top >= document.documentElement.clientHeight - this.ele.offsetHeight){
                top = document.documentElement.clientHeight - this.ele.offsetHeight;
            }
            this.ele.style.left = left + 'px';
            this.ele.style.top = top + 'px';
        }
    }
    
  • 相关阅读:
    康复计划#4 快速构造支配树的Lengauer-Tarjan算法
    康复计划#3 简单常用的几种计算自然数幂和的方法
    长链剖分随想
    康复计划#2 常用基础数论知识杂烩
    康复计划#1 再探后缀自动机&后缀树
    WC2017游记 & 能力残废康复计划
    Bubble Cup 8 finals I. Robots protection (575I)
    Bubble Cup 8 finals H. Bots (575H)
    Angular懒加载模块使用http拦截失效问题
    Git Commit提交规范
  • 原文地址:https://www.cnblogs.com/guanhuohuo/p/12526226.html
Copyright © 2020-2023  润新知