博主:DongJiang
码龄:7年
等级:
文章:631
访问:52336
博客简介:DongJiang的博客
博客创建时间:2018-04-12
给博主送颗小红心
1002
后台管理系统: 进入后台

友情链接

公告通知

    Mysql数据库基本操作语句

    查看指定数据库创建时的sql指令

    mysql> show databases;
     -------------------- 
    | Database           |
     -------------------- 
    | information_schema |
    | website            |
     -------------------- 
    

    创建数据库

    mysql> create database website;
    Query OK, 1 row affected (0.04 sec)
    

    创建数据库 如果不存在

    mysql> create database if not exists website;
    Query OK, 1 row affected (0.00 sec)
    

    创建数据库 并设置编码

    mysql> CREATE database if not exists website character set utf8;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    

    删除数据库

    mysql> drop database if exists website;
    Query OK, 0 rows affected (0.00 sec)
    

    使用数据库

    mysql> use website;
    Database changed
    

    CSS Flex弹性布局基本属性说明

    display: 指定 HTML 元素的盒子类型

    flex-direction: 指定弹性盒子中子元素的排列方式

    flex-wrap: 设置当弹性盒子的子元素超出父容器时是否换行

    flex-flow: flex-direction 和 flex-wrap 两个属性的简写

    justify-content: 设置弹性盒子中元素在主轴(横轴)方向上的对齐方式

    align-items: 设置弹性盒子中元素在侧轴(纵轴)方向上的对齐方式

    align-content: 修改 flex-wrap 属性的行为,类似 align-items,但不是设置子元素对齐,而是设置行对齐

    order: 设置弹性盒子中子元素的排列顺序

    align-self: 在弹性盒子的子元素上使用,用来覆盖容器的 align-items 属性

    flex: 设置弹性盒子中子元素如何分配空间

    flex-grow: 设置弹性盒子的扩展比率

    flex-shrink: 设置弹性盒子的收缩比率

    flex-basis: 设置弹性盒子伸缩基准值

    我的书签收藏夹
    东江哥 2022-03-15 15:13:54
    571访问人次

    CSS盒子模型边框样式属性设置

    边框宽度

    /*边框的宽度*/
    border-width:3px;
    /*上边框的宽度*/
    border-top-width:3px;
    /*右边框的宽度*/
    border-right-width:3px; 
    /*下边框的宽度*/
    border-bottom-width:3px; 
    /*左边框的宽度*/
    border-left-width :3px;
    

    边框颜色

    /*边框的颜色*/
    border-color: #eee;
    /*上边框的颜色*/
    border-top-color: #eee;
    /*右边框的颜色*/
    border-right-color: #eee;
    /*下边框的颜色*/
    border-bottom-color: #eee; 
    /*左边框的颜色*/
    border-left-color: #eee; 
    

    边框样式

    /*边框的样式*/
    border-style: solid;
    /*上边框的样式*/
    border-top-style: solid;
    /*右边框的样式*/
    border-right-style: solid;
    /*下边框的样式*/
    border-bottom-style: solid;
    /*左边框的样式*/
    border-left-style: solid;
    

    php strtotime获取时间段今天昨天本周本月

    // 今天开始
    strtotime('today');
    // 今天结束
    strtotime('today 23:59:59');
    // 昨天开始
    strtotime('yesterday');
    // 昨天结束
    strtotime('yesterday 23:59:59');
    // 本周开始
    strtotime('last Monday');
    // 本周结束
    strtotime('sunday 23:59:59');
    // 本月开始
    strtotime(date("Y-m-01"));
    // 本月结束
    strtotime(date("Y-m-t"));
    

    php当前时间不准有以下两种方法设置

    PHP默认时区是UTC,在使用PHP获取系统时间,会发现时间不对,所以需要把时区设置为北京时区UTC。

    方法一:修改php.ini文件

    打开php.ini文件:

    查找date.timezone,找到date.timezone =”UTC”,

    将其改为date.timezone ="PRC",若date.timezone左边有分号,要将该分号去掉。

    <?php 
      echo "当前时间:" . date("Y-m-d H:i:s") 
    ?>
    

    方法二:使用date_default_timezone_set(”)方法;

    <?php
      date_default_timezone_set('PRC'); 
      echo date("Y-m-d H:i:s");
    ?>
    

    js正则表达式,匹配括号中的内容(不包含括号)

    match用来在一个字符串中查找匹配的子串,并返回一个包含匹配结果的数组。match()方法可以接收一个参数,这个参数可以是正则表达式对象或者一个字符串。

    1、匹配括号中的内容,包含括号

    var str = 'HTML(小括号)的全称为[中括号]超文本【中文中括号】标记语言,是一种{花括号}标记语言。'
    
    var reg1 = /\((. ?)\)/g // () 小括号
    var reg2 = /\[(. ?)\]/g // [] 中括号
    var reg3 = /\【(. ?)\】/g // 【】中文大括号
    var reg4 = /\{(. ?)\}/g // {} 花括号
    
    str.match(reg1) // ['(小括号)']
    str.match(reg2) // ['[中括号]']
    str.match(reg3) // ['{花括号}']
    str.match(reg4) // ['【中文中括号】']
    

    2、匹配括号中的内容,不包含括号

    var str = 'HTML(小括号)的全称为[中括号]超文本【中文中括号】标记语言,是一种{花括号}标记语言。'
    
    var reg1 = /(?<=\()(. ?)(?=\))/g // () 小括号
    var reg2 = /(?<=\[)(. ?)(?=\])/g // [] 中括号
    var reg3 = /((?<=\【)(. ?)(?=\】))/g // 【】中文大括号
    var reg4 = /(?<=\{)(. ?)(?=\})/g // {} 花括号,大括号
    
    str.match(reg1) // ['小括号']
    str.match(reg2) // ['中括号']
    str.match(reg3) // ['中文中括号']
    str.match(reg4) // ['花括号']
    

    mysql查询去除重复数据的两种式

    1、使用distinct关键字

    distinct可以去除select查询结果中的重复行。

    select distinct username from user;
    

    2、使用group by关键字

    group by能够将select查询结果按照指定列分组,并对每组进行聚合运算。

    select * from user group by username;
    

    用户登录前端进行密码md5加密

    用户在登录时,数据传输过程中如果密码使用的是明文,那么在报文被拦截之后是可以直接获取传输的数据,所以明文密码在传输时被拦截是十分危险,因此在传输密码前前端需要对密码进行加密。

    前端使用MD5进行加密如下:

    1、使用npm安装md5

    npm install js-md5
    

    2、引入md5

    import md5 from 'js-md5'
    

    3、使用md5进行加密,加密方式有以下三种

    // 密码
    let password="123456"
    // 盐值
    let solt = 'yanzhi'
    
    // 普通的md5加密
    md5(password)
    
    // 双重md5加密
    md5(md5(password))
    
    // md5加盐solt加密算法
    md5(solt password)
    md5(password solt)
    md5(solt password solt)
    md5(md5(password) solt)
    md5(solt md5(password))
    

    利用ES6解构赋值删除对象部分属性

    通过扩展运算符,在对象最后一个命名参数以...为前缀,则它将成为一个由剩余参数组成的对象,所以将要删除的属性结构出来,剩余的通过...带上新的参数名,则新的参数名就是新的对象

    // 删除user对象下的qq和电话属性字段
    let user = {
      name: 'shenghao',
      age: 13,
      sex: '男',
      province: '广东省',
      cidy: '广州市',
      address: '天河区',
      qq: '365121369',
      phone: '15000000000',
    }
    
    let { qq, phone, ...info } = user
    
    通过对象解构后info值是:
    {
        "name": "shenghao",
        "age": 13,
        "sex": "男",
        "province": "广东省",
        "cidy": "广州市",
        "address": "天河区"
    }
    

    vue的生命周期(带图详解)

    一、创建(实例)

    1、beforeCreate:这个阶段实例已经初始化,只是数据观察与事件机制尚未形成,不能获取DOM节点(没有data,没有el)

    使用场景:因为此时data和methods都拿不到,所以通常在实例以外使用

    2、created:实例已经创建,仍然不能获取DOM节点(有data,没有el)

    使用场景:模板渲染成html前调用,此时可以获取data和methods,so 可以初始化某些属性值,然后再渲染成视图,异步操作可以放在这里

    二、载入(数据)

    1、beforeMount:是个过渡阶段,此时依然获取不到具体的DOM节点,但是vue挂载的根节点已经创建(有data,有el)

    2、mounted:数据和DOM都已经被渲染出来了 使用场景:模板渲染成html后调用,通常是初始化页面完成后再对数据和DOM做一些操作,需要操作DOM的方法可以放在这里

    三、更新

    1、beforeUpdate:检测到数据更新时,但在DOM更新前执行

    2、updated:更新结束后执行

    使用场景:需要对数据更新做统一处理的;如果需要区分不同的数据更新操作可以使用$nextTick

    四、销毁

    1、beforeDestroy:当要销毁vue实例时,在销毁前执行

    2、destroyed:销毁vue实例时执行

    通过speechSynthesis方法实现HTML5语音合成

    // 实例化对象
    const speakMsg = new SpeechSynthesisUtterance()
    
    // 设置在说话时将合成的文本内容。
    speakMsg.text = speech;
    // 设置话语的语言。 例如:“zh-cn”表示中文
    speakMsg.lang = "zh-CN";
    // 设置将在其中发言的音量。区间范围是0到1,默认是1
    speakMsg.volume = 1;
    // 设置说话的速度。默认值是1,范围是0.1到10,表示语速的倍数,例如2表示正常语速的两倍
    speakMsg.rate = 1;
    // 设置说话的音调(音高)。范围从0(最小)到2(最大)。默认值为1
    speakMsg.pitch = 10;
    //音高:0-1
    
    // 方法调用
    window.speechSynthesis.speak(speakMsg)
    

    JS 找出两个数组中的并集

    方法一(利用解构赋值...和Set的唯一性)

    先将两个数组合并再通过Set()去重

    let arr1 = [1, 2, 3, 4, 5]
    let arr2 = [4, 5, 6, 7, 8]
    
    let result = [...new Set(arr1.concat(arr2))]
    console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8]
    

    方法二(reduce)

    先合并和排序,然后通过reduce参数进行对比,判断上一个和当前元素不相同时,就push到新的数组中。

    let arr1 = [1, 2, 3, 4, 5]
    let arr2 = [4, 5, 6, 7, 8]
    let arr = [...arr1, ...arr2].sort()
    let result = [arr[0]]
    
    arr.reduce((pre, now) => {
      if (pre !== now) {
        result.push(now)
      }
      return now
    })
    console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8]
    

    方法三(转json对象)

    将数组转成JSON对象,数组每个元素都作为对象的键和值,如果元素相同,则对象键和值会覆盖,达到去重效果,接着再使用Object.values提取对象的值返回一个新的数组。

    let arr1 = [1, 2, 3, 4, 5]
    let arr2 = [4, 5, 6, 7, 8]
    let obj = {}
    
    arr1.forEach((item) => {
      obj[item] = item
    })
    arr2.forEach((item) => {
      obj[item] = item
    })
    let result = Object.values(obj)
    console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8]
    

    JS 找出两个数组中的交集

    1、方法一(常规for循环)

    两个数组进行for循环嵌套,然后判断元素是否相等,如果相等就push到新的数组中。

    let arr1 = [1, 2, 3, 4, 5]
    let arr2 = [4, 5, 6, 7, 8]
    let intersection = []
    
    for (let i = 0; i < arr1.length; i  ) {
      for (let j = 0; j < arr2.length; j  ) {
        if (arr1[i] === arr2[j]) {
          intersection.push(arr1[i])
        }
      }
    }
    console.log(intersection) // [4, 5]
    

    方法二(使用ES6的filter函数和includes函数)

    let arr1 = [1, 2, 3, 4, 5]
    let arr2 = [4, 5, 6, 7, 8]
    console.log(arr1.filter((item) => arr2.includes(item))) // [4, 5]
    

    方法三(reduce)

    先合并和排序,然后通过reduce参数进行对比,判断上一个和当前元素相同时push到新的数组中。

    let arr1 = [1, 2, 3, 4, 5]
    let arr2 = [4, 5, 6, 7, 8]
    let arr = arr1.concat(arr2).sort()
    let intersection = []
    
    arr.reduce((pre, now) => {
      if (pre === now) {
        intersection.push(now)
      }
      return now
    })
    console.log(intersection) // [4, 5]
    

    php如何将json数据和数组进行转换

    1、php将json数据转成数组

    json_decode()函数将json字符串$json解析为php数组"$decoded_json"。第二个参数"true"表示返回的结果为数组而不是对象。

    <?php
      $json = '{"name": "shenghao", "age": 3, "city": "广州"}';
      // 第二个参数用于返回数组代替对象
      $decoded_json = json_decode($json, true); 
    
    // 返回结果为数组:
    Array( 'name' => 'shenghao', 'age' => 3, 'city' => '广州');
    ?>
    

    2、php将数组转成json字符串

    json_encode()用于对变量进行JSON编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。

    <?php
      $arr = Array( 'name' => 'shenghao', 'age' => 3, 'city' => '广州');
      $encoded_json = json_encode($arr); 
    
    // 返回结果为json:
    {"name":"shenghao","age":3,"city":"广州"}
    ?>
    

    指令v-if和v-for的使用注意事项

    1、提示:指令v-if和v-for不能用在同一个标签上,否则性能会消耗很大。

    2、原因:如果写在同一标签,会先对所有数据进行以下操作,就是一边循环一边执行v-if,循环中多次对 DOM 元素进行添加或删除,这样会造成大量的性能消耗

    3、优先级:v-for 优先级 高于v-if

      <div v-for="(item, index) in dataList" :key="index">
        <div v-if="item.status">
          {{item.name}}
        </div>
      </div>
    

    4、解决办法

    1.不要把v-for和v-if 写在同一个标签上,而是新建div引入v-for包裹v-if

    2.使用v-show代替v-if

    vue代码中v-show和v-if指令能否共同使用

    v-show指令是操作css样式display属性,用来控制DOM元素显示和隐藏。

    v-if指令是对页面上DOM节点的添加与删除

    从效果上来看是一样,都是设置DOM元素的展示隐藏。但是它们的性质是不一样,一个是设置display属性值,一个是操作DOM元素添加和删除。它们之间可以同时使用是没有冲突。

    <!-- v-if指令 -->
    <div v-if="status"></div>
    
    <!-- v-if指令 -->
    <div v-show="show"></div>
    
    <!-- v-if和v-show指令 -->
    <div v-if="status" v-show="show"></div>
    

    dom创建与dom操作

    创建:新的标签(元素节点) = document.createElement("标签名")

    删除:父节点.removeChild(子节点);

    插入:insertBefore(新插入的节点,参照物节点) 往某个节点的前面插入一个新的节点

    追加:appendChild(新的节点的名) 当前对象追加一个子节点

    原生JavaScript绑定事件的3种方法

    1.行内绑定:在标签上写οnclick=“事件名”

    <button onclick="handleClick">Click Me</button>
    

    2.在script中绑定

    document.getElementById("标签").onclick=function(){
        /*   函数体   */    
    }
    

    3.绑定事件监听函数

    绑定事件的第三种方法是用addEventListener()或者attachEvent()来绑定事件监听函数

    元素选择器.addEventListener(事件名(click,keydown...), 回调函数, true捕获/false冒泡);

    移除事件监听

    document.getElementById("选择的标签").removeEventListenner('click') 
    

    Git常用命令大全和使用说明

    1、第一次初始化

    2、工作基本操作

    3、初始化仓库

    4、查看仓库当前状态

    5、文件相关操作

    6、查看历史记录

    7、代码回滚

    8、版本库相关操作

    9、远程仓库相关操作

    10、分支相关操作

    11、git相关配置

    12、其他查看配置相关

    13、撤消某次提交

    14、标签

    JavaScript常用的日期时间方法大全

    let date = new Date(); // 获取中国标准时间

    date.getFullYear(); / /获取完整的年份(4位)

    date.getMonth(); // 获取当前月份(0-11,0代表1月)

    date.getDate(); // 获取当前日(1-31)

    date.getDay(); // 获取当前星期(0-6,0代表星期天)

    date.getTime(); // 获取当前时间的时间戳

    date.getHours(); // 获取当前小时数(0-23)

    date.getMinutes(); // 获取当前分钟数(0-59)

    date.getSeconds(); // 获取当前秒数(0-59)

    date.getMilliseconds(); //获取当前毫秒数(0-999)

    date.toLocaleDateString(); // 获取当前日期

    date.toLocaleTimeString(); // 获取当前时间

    date.toLocaleString(); // 获取当前日期与时间

    date.setFullYear(); // 设置年份信息 获取该年份当前月日时分秒的时间戳

    date.setMonth(); // 设置月份信息 获取该月份当前年日时分秒的时间戳 (0-11,0代表1月)

    date.setDate(); // 设置日信息 获取该日当前年月时分秒的时间戳

    date.setHours(); // 设置小时信息 获取该小时当前年月日分秒的时间戳

    date. setMinutes(); // 设置分信息 获取该分当前年月日时秒的时间戳

    date.setSeconds(); // 设置秒信息 获取该秒当前年月日时分的时间戳

    JavaScript复制文本到剪切板中

    判断navigator.clipboard是否为undefined,因为navigator.clipboard对象只能在安全网络环境中才能使用,比如在localhost或者https中才能正常使用,直接用ip地址和http访问出现undefined,所以需要表单元素来实现。

    HTML部分

    <body>
        <button id="copy">复制</button>
        <div id="text">你好啊</div>
    </body>
    

    JavaScript部分

    <script>
          var copy = document.getElementById('copy')
          copy.onclick = function copy(e) {
            var text = document.getElementById('text')
            if (navigator.clipboard && window.isSecureContext) {
              return navigator.clipboard.writeText(text.innerHTML)
            } else {
              let input = document.createElement('input')
              document.body.appendChild(input)
              input.value = text.innerHTML
              input.focus()
              input.select()
              if (document.execCommand('copy')) {
                document.execCommand('copy')
              }
              input.blur()
              document.body.removeChild(input)
            }
          }
        </script>
    

    网页图片不存在时的以下两种处理方法

    图片不存在会触发onerror事件,我们通过触发该事件后进行以下方式处理。

    1、把图片元素隐藏

    <img src="图片地址" onerror="this.style.display='none'" />
    

    2、替换成默认图片

    <img src="图片地址" onerror="this.src='默认图片的地址'" />
    

    PHP获取某月的第一天和最后一天

    先确定某一日期,再转换成时间戳,然后通过date函数根据时间戳来获取该月的第一天和最后一天

    1、默认时间

    $date = "2022-06-30";
    

    2、开始时间

    date("Y-m-01", strtotime($date));
    

    3、结束时间

    date("Y-m-t", strtotime($date));
    

    css样式表的三种方式

    1、行内样式表

    <div style="width: 100px; height: 100px">style属性的设置</div>
    

    2、内部样式表

    <div class="box">类标签设置</div>
    

    3、外部样式表

    <!-- CSS链接样式 -->
    <link type="text/css" rel="styleSheet"  href="/css.css" />
    
    <!--CSS导入式 -->
    <link type="text/css" rel="styleSheet"  href="/css.css" />
    <style type="text/css">
        @import url("/css.css");
    </style>
    

    前端常用正则校验规则

    1、校验手机号码

    // 正则
    const regex = /^1[3456789]d{9}$/;
    

    2、校验邮箱地址

    // 正则
    const regex = /^w ([- .]w )*@w ([-.]w )*.w ([-.]w )*$/;
    

    3、校验身份证号码

    // 身份证号码为15位或18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
    const regex =
      /^[1-9]d{5}(19|20)d{2}(0[1-9]|1[012])(0[1-9]|[12]d|3[01])d{3}[0-9Xx]$/;
    

    4、校验密码强度

    // 正则
    const regex = /^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]{6,20})$/;
    

    5、校验 URL 地址

    // 正则
    const regex = /^(http|https)://([w-] .) [w-] (:d )?(/S*)?$/;
    

    6、校验 IP 地址

    const regex =
      /^([01]?d{1,2}|2[0-4]d|25[0-5]).([01]?d{1,2}|2[0-4]d|25[0-5]).([01]?d{1,2}|2[0-4]d|25[0-5]).([01]?d{1,2}|2[0-4]d|25[0-5])$/;
    

    7、校验中文名

    // 正则
    const regex = /^[u4e00-u9fa5]{2,4}$/;
    

    8、校验首位不为零的数字

    // 正则
    const regex = /^[1-9]d*$/;
    

    9、校验只允许字母和数字

    // 正则
    const regex = /^[A-Za-z0-9] $/;
    

    CSS优先级算法

    CSS优先级:是由四个级别和各级别的出现次数决定的。 四个级别分别为:行内选择符ID选择符类别选择符元素选择符

    优先级的算法:

    每个规则对应一个初始"四位数":0、0、0、0

    若是 行内选择符,则加1、0、0、0

    若是 ID选择符,则加0、1、0、0

    若是 类选择符/属性选择符/伪类选择符,则分别加0、0、1、0

    若是 元素选择符/伪元素选择符,则分别加0、0、0、1

    ...

    不请求后端前端实现分页功能

    1、声明页数和页码

    let page=1 let size=10 let dataList []

    2、通过数组slice方法截取

    dataList.slict((page-1)*size, (page-1)*size size)

    起始位置:(page-1)*size

    终止位置: (page-1)*size size)

    根据数组索引位置截取来实现翻页效果

    当page=1截取的位置是0到9

    当page=2截取的位置是10到19

    当page=3截取的位置是20到29

    http有哪些特点

    1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。

    2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    3、无连接:限制每次连接只处理一个请求。

    4、无状态:指协议对于事务处理没有记忆能力。

    5、扩展:支持B/S及C/S模式。

    使用Vue3开发的图片上传和裁剪作为用户头像背景功能

    上传背景图片并拖拽调整图片,找到适合部分然后裁剪作为个人用户头像背景图。

        // 拖拽图片
        function onmousedown(ev: any) {
          ev.preventDefault()
          let oevent = ev || event
          let distanceX = oevent.clientX //鼠标点击位置
          let distanceY = oevent.clientY //鼠标点击位置
          //dX和dY是鼠标在pic内的相对位置
          //在移动后,设置图片的外边距,利用负外边距移动图片
          ...
    

    用nodejs实现httpserver服务

    //导入模块是require 类似于import java.io
    const http = require('http')
    
    //创建httpserver服务
    http
      .createServer(function (request, response) {
        //告诉浏览器将以text-plain去解析hello server
        response.writeHead(200, { 'Content-type': 'text/plain' })
        //输出内容给浏览器
        response.end('hello server!!!')
      })
      .listen(8888)
    console.log('你启动的服务是:http://localhost:8888')
    //监听端口8888
    //启动运行服务器node httpserver.js
    //浏览器访问http://localhost:8888
    

    http简单简介

    1、是一个简单的请求-响应协议。

    2、通常运行在TCP [传出层控制协议] 之上

    3、指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

    4、请求和响应消息的头以ASCII码形式给出。

    5、消息内容则具有一个类似MIME的格式。

    ...

    XSS 是什么

    概念: 是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式。

    跨脚本攻击有以下两种形式

    1、反射型攻击: 通过引诱用户点击带有嵌入恶意脚本的链接而达到攻击目的。

    原理: 攻击者要获取一个网站管理员 cookie,他会向 admin 用户发送一个链接地址,而再链接地址后面会加上参数值为 document.cookie,当 admin 用户在点击该链接时会将自己的 cookie 显示出来,返回给攻击者[攻击这会监听到该链接的端口从而获取管理员 cookie 信息]。攻击者拿到管理员 cookie 信息后会进行制造伪请求进行破坏操作。

    ...

    怎么判断数组所有元素都相同

    通过ES6 Set方法去重,再判断去重后的数组长度是否等于1

    let arr = [23, 23, 23, 23, 23, 23, 23];
    let item = [...new Set(arr)];
    if(item.length === 1){
      console.log("true")
    }else{
      console.log("false")
    }
    

    vscode编辑器常用快捷键

    1、快速创建HTML基础代码

    输入!后按Tab键

    2、快速复制一行

    快捷键: shift alt 下箭头/上箭头 或者 ctrl c 然后 ctrl v

    3、撤销还原快捷键

    Ctrl Z: 撤销,Ctr Y:还原

    4、单文件查询和多文件查询

    快捷键:Ctrl F:单文件查询 Shift Ctr F:多文件查询

    ...

    pointer-events: none 是点击dom元素事件触发产生无效状态

    pointer-events: none; 是看得到却摸不着,点击不到,点击会穿透触发到下层元素的css属性。

    <div style="pointer-events: none;"></div>
    

    双鱼座2月19日-3月20日

    双鱼座是十二宫最后一个星座,他集合了所有星座的优缺点于一身,同时受水象星座的情绪化影响,使他们原来复杂的性格又添加了更复杂的一笔。双鱼座的人最大的优点是有一颗善良的心,他们愿意帮助别人,甚至是牺牲自己。

    水瓶座1月20日-2月18日

    水瓶座的人很聪明,他们最大的特点是创新,追求独一无二的生活,个人主义色彩很浓重的星座。他们对人友善又注重隐私。水瓶座绝对算得上是”友谊之星“,他喜欢结交每一类朋友,但是确很难与他们交心,那需要很长的时间。他们对自己的家人就显得冷淡和疏远很多了。

    摩羯座12月22日-1月19日

    摩羯座是十二星座中最有耐心,为事最小心、也是最善良的星座。他们做事脚踏实地,也比较固执,不达目的是不会放手的。他们的忍耐力也是出奇的强大,同时也非常勤奋。他们心中总是背负着很多的责任感,但往往又很没有安全感,不会完全地相信别人。

    射手座11月23日-12月21日

    射手座崇尚自由,勇敢、果断、独立,身上有一股勇往直前的劲儿,不管有多困难,只要想,就能做,你的毅力和自信是难以击倒的。射手男酷爱自由,讨厌被束缚,射手女性格简单直接,不耍心计,可是任性。

    天蝎座10月24日-11月22日

    天蝎座精力旺盛、占有欲极强,对于生活很有目标,不达到目的誓不罢休,复仇心理重,记仇会让自己不顾一切报复曾经伤害过你的人。天蝎男自我主义色彩很强烈,天蝎女的自我保护意识很强,不容易接近。

    天秤座9月23日-10月23日

    天秤座常常追求平等、和谐,擅于察言观色,交际能力很强,因此真心朋友不少,因为你也足够真诚,但是最大的缺点就是面对选择总是犹豫不决。天秤男容易在乎自己而忽略别人,天秤女就喜欢被陪伴的感觉。

    处女座8月23日-9月22日

    处女座虽然常常被黑,但你还是依然坚持追求自己的完美主义,因为在你看来,生活不能将就,追求的完美更不能将就,有目标才有进步,当然也需要鼓励。处女男的毅力很强,能坚持,处女女的求知欲很强。

    狮子座7月23日-8月22日

    狮子座有着宏伟的理想,总想靠自己的努力成为人上人,你向往高高在上的优越感,也期待被仰慕被崇拜的感觉,有点儿自信有点儿自大。狮子男的大男人气息很重,爱面子,狮子女热情阳光,对朋友讲义气。

    巨蟹座6月22日-7月22日

    巨蟹座的情绪容易敏感,也缺乏安全感,容易对一件事情上心,做事情有坚持到底的毅力,为人重情重义,对朋友、家人都特别忠实,巨蟹男是一等一的好男人,顾家爱家人,巨蟹女充满母性光环,非常有爱心。

    双子座5月21日-6月21日

    双子座喜欢追求新鲜感,有点儿小聪明,就是耐心不够,往往做事都是三分钟热度,难以坚持,但是你的可爱性格会让很多人都喜欢跟你做朋友。双子男表面很花心,其实深情,而双子女就喜欢求新和求变。

    金牛座4月20日-5月20日

    金牛座很保守,喜欢稳定,一旦有什么变动就会觉得心里不踏实,性格也比较慢热,但你是理财高手,对于投资理财都有着独特的见解。金牛男的性格有点儿自我,而金牛女就喜欢投资自己,想要过得更好。

    白羊座 3月21日-4月19日

    白羊座有一种让人看见就觉得开心的感觉,因为总是看起来都是那么地热情、阳光、乐观、坚强,对朋友也慷概大方,性格直来直往,就是有点小脾气。白羊男有大男人主义的性格,而白羊女就是女汉子的形象

    分享一些电脑键盘功能基础知识

    Esc: 退出键

    Tab: 表格键

    Caps Lock: 大写锁定键

    Shift: 转换键

    Ctrl: 控制键

    Alt: 可选(切换)键

    ...

    简单介绍下 Set、Map的区别

    应用场景Set用于数据重组,Map用于数据储存
    Set: 
    (1)成员不能重复
    (2)只有键值没有键名,类似数组
    (3)可以遍历,方法有add, delete,has
    Map:
    (1)本质上是健值对的集合,类似集合
    (2)可以遍历,可以跟各种数据格式转换
    

    关于forEach、for in、for of三者遍历数据的说明

    forEach更多的用来遍历数组
    for in 一般常用来遍历对象或json
    for of数组对象都可以遍历,遍历对象需要通过和Object.keys()
    for in循环出的是key,for of循环出的是value