前言:

一开始一个朋友发消息问我:

var a = ['123.JpG','123.jpg'];
var reg = /(jpg|png)$/ig;
a.forEach(v => {
    if(reg.test(v) === true){
        console.log(123)
    }
})

会输出什么。 我理所当然的说,当然是输出两个123了。

lastIndex:

QQ20181015090701.png

这时候你会发现,我们在连续使用一个正则匹配其他字符串的时候,第一次匹配是 true,而第二次匹配则是 false。

查看了一下 MDN文档 发现这样一个描述:

如果正则表达式设置了全局标志,test() 的执行会改变正则表达式 lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身的 lastIndex属性值).

QQ20181015090907.png

解决方案:

  1. 方案1 既然文档说了是因为全局标志才会影响到lastIndex,于是可以把g去掉就可以了。
var reg = /(jpg|png)$/i;
console.log(reg.test(a[0])); //true
console.log(reg.test(a[0])); //true
  1. 方案2 有时候既然需要用到g,那就不能用到方案1的方法了。 其实,我们的lastIndex属性是可读可写的。 我们可以在下一次匹配的之前更改lastIndex的值来达到目的:
var reg = /(jpg|png)$/ig;
console.log(reg.test(a[0])); //true
console.log(reg.lastIndex); //7
reg.lastIndex = 0;
console.log(reg.test(a[0])); //true

最后:

再来回顾最开始的问题,我们只需要选择方案1或者方案2中的一个方法,即可实现输出两个123:

3.png

参考地址:

阅读全文

ONE·一个 每日阅读

复杂世界里,一个就够了。

该小程序所有数据均由 「ONE · 一个」 提供,本人采取非正常手段获取,仅作为日常学习之用。获取跟共享的行为或许有侵犯权益的嫌疑。若被告知需停止共享与使用,本人会及时删除该小程序与整个项目。

在线访问html5版:https://one.mrabit.com

小程序码:

gh_35dcdd9b6f58_258.jpg

GitHub仓库地址: https://github.com/mrabit/WeChatApp_ONE

阅读全文

在开发小程序时候,所有功能都正常使用,不管是开发板、体验版,发送模版消息都是能正常工作的,结果发布正式版的时候,设定定时任务发送模版消息却失败了。 找到后端代码调试了一番发现发送模版消息返回的数据

{“errcode”:41030,”errmsg”:”invalid page hint: [gP1eXXXXXX]”}

查看 小程序文档 发现:

QQ20180906092421.png

原来是在调用发送模版消息接口的时候page参数写错了:

{
    ...
    page: `/pages/oneDetails/oneDetails?id=${oneDetails.id}`,
    ...
}

正确的做法是:

{
    ...
    page: `pages/oneDetails/oneDetails?id=${oneDetails.id}`,
    ...
}

pages前面不需要加上 /

不过在开发版和体验版上为什么是正常的这就不知道了https://ws4.sinaimg.cn/bmiddle/62e721e4gw1et02g5wksrj200k00k3y9.jpg

阅读全文

使用vue-router的时候会有路由守卫 afterEach 方便跳转页面后执行跳转到页面顶部:

router.afterEach(function () {
  window.scrollTo(0, 0);
})

但是react-router 却没有这种函数,特别是react-router 4 更是取消了onEnter onUpdate函数.

解决方法:

withRouter可以包装任何自定义组件,将react-router 的 history,location,match 三个对象传入。无需一级级传递react-router 的属性,当需要用的router 属性的时候,将组件包一层withRouter,就可以拿到需要的路由信息

  1. 定义ScrollToTop组件:
import React, { Component } from 'react';
import { withRouter } from "react-router-dom";

class ScrollToTop extends Component {
  componentDidUpdate(prevProps) {
    if (this.props.location.pathname !== prevProps.location.pathname) {
      window.scrollTo(0, 0);
    }
  }
  render() {
    return this.props.children;
  }
}

export default withRouter(ScrollToTop)
  1. 在定义路由处引用该组件:
import ScrollToTop from '../components/ScrollToTop';
export default class Root extends Component {
  render() {
    return (
      <Router>
        <ScrollToTop>
          <Header />
          <Menus />
          {/* 首页 */}
          <Route exact path="/" component={Home} />
          {/* 图文 */}
          <Switch>
            <Route exact path="/one" component={OneList} />
            <Route path="/one/:id" component={OneDetails} />
          </Switch>
        </ScrollToTop>
      </Router>
    )
  }
}

参考地址:

阅读全文

号码组成

中华人民共和国国家标准 GB 11643-1999《公民身份号码》中规定:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。

公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

  1. 地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T 2260 的规定执行。

  2. 出生日期码表示编码对象出生的年、月、日,按 GB/T 7408 的规定执行。年、月、日代码之间不用分隔符。(例:某人出生日期为 1966 年 10 月 26 日,其出生日期码为 19661026。)

  3. 顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

  4. 校检码是根据前面十七位数字码,按照公式计算出来的检验码。

计算方法

  1. 将前面的身份证号码 17 位数分别乘以不同的系数,从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

  2. 将这 17 位数字和系数相乘的结果相加;

  3. 用加出来和除以 11,看余数是多少;

  4. 余数只可能有 0 1 2 3 4 5 6 7 8 9 10 这11个数字,其分别对应的最后一位身份证的号码为 1 0 X 9 8 7 6 5 4 3 2;

  5. 通过上面得知如果余数是 2,就会在身份证的第18位数字上出现罗马数字的 X。如果余数是 10,身份证的最后一位号码就是 2。

JavaScript代码实现:

function check(code) {
    code = code.split('');

    var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
        parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2],
        sum = 0,
        ai = 0,
        wi = 0;

    for (var i = 0; i < 17; i++) {
        ai = code[i];
        wi = factor[i];
        sum += ai * wi;
    }

    var last = parity[sum % 11];

    return last == code[17];
}

问题:

这种方法只能做前端的简单校验,我们java后台进行的判断方式是根据省市县出身年月算出身份证后四位,比这种只对最后一位校验要精准得多,不过不是很清楚他们的做法

阅读全文