首页 文章 精选 留言 我的

精选列表

搜索[JavaScript],共9118篇文章
优秀的个人博客,低调大师

一个用JavaScript生成思维导图(mindmap)的github repo

github 地址:https://github.com/dundalek/markmap 作者的readme写得很简单。 今天有同事问作者提供的例子到底怎么跑。这里我就写一个更详细的步骤出来。 首先查看example.parse.js的内容: var fs = require('fs'); var parse = require('../parse.markdown'); var transform = require('../transform.headings'); var text = fs.readFileSync('gtor.md', 'utf-8'); var headings = parse(text); var root = transform(headings); console.log(root); fs.writeFileSync('gtor.json', JSON.stringify(root)); 使用nodejs命名node example.parse.js执行这段代码:代码读取包含思维导图的本地文件gtor.md, 解析并转换生成本地文件gtor.json. 然后查看example.view.js, 发现作者使用了d3来做UI的渲染。 d3.json("gtor.json", function(error, data) { if (error) throw error; markmap('svg#mindmap', data, { preset: 'default', // or colorful linkShape: 'diagonal' // or bracket }); }); 如果直接双击examples文件夹里的index.html文件在浏览器里打开,会出现跨域错误导致本地文件gtor.json无法访问: 必须把这个example部署到服务器上运行才行。 为了简单起见,我做了一个简单的封装。如果您想跑跑例子看看效果,只需要下载我的project到本地:https://github.com/i042416/jerrylist 直接在本地用nodejs 命令行启动服务器: node local.js 然后localhost:3000/mindmap即可看到思维导图的效果 要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

优秀的个人博客,低调大师

基于规则评分的密码强度检测算法分析及实现(JavaScript)

简言 用正则表达式做用户密码强度的通过性判定,过于简单粗暴,不但用户体验差,而且用户帐号安全性也差。那么如何准确评价用户密码的强度,保护用户帐号安全呢?本文分析介绍了几种基于规则评分的密码强度检测算法,并给出了相应的演示程序。大家可以根据自己项目安全性需要,做最适合于自己的方案选择。 1 方案1 (简单) 方案1算法通过密码构成分析,结合权重分派,统计得出密码强度得分。得分越高,表示密码强度越大,也就越安全。方案1算法思想简单,实现容易。 1.1 方案1评分标准 一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二、字母: 0 分: 没有字母 10 分: 全都是小(大)写字母 20 分: 大小写混合字母 三、数字: 0 分: 没有数字 10 分: 1 个数字 20 分: 大于1 个数字 四、符号: 0 分: 没有符号 10 分: 1 个符号 25 分: 大于1 个符号 五、奖励: 2 分: 字母和数字 3 分: 字母、数字和符号 5 分: 大小写字母、数字和符号 1.2 方案1等级划分 根据密码评分,将密码划分成以下7个等级: >= 90: 非常安全(VERY_SECURE) >= 80: 安全(SECURE) >= 70: 非常强(VERY_STRONG) >= 60: 强(STRONG) >= 50: 一般(AVERAGE) >= 25: 弱(WEAK) >= 0: 非常弱( VERY_WEAK) 该评分标准及等级划分,实际使用时,可小做调整,但不建议做大的变动。 1.3 方案1演示程序 演示程序 1.4 方案1测试分析 // 评分 25,纯小写字母无法通过验证 console.log("aaaaaaaa".score()); // 评分 45,纯数字无法通过验证 console.log("11111111".score()); // 评分 47,小写+数字无法通过验证 console.log("aa111111".score()); // 评分 45,小写+大写无法通过验证 console.log("aaaaAAAA".score()); // 评分 50,4位密码不可能通过验证 console.log("11!!".score()); // 评分 70,5位密码可通过验证 console.log("0aA!!".score()); // 评分 67,小写+大写+数字可通过验证(8位) console.log("aA000000".score()); // 评分 70,数字+符号可通过验证 console.log("000000!!".score()); 从以上测试结果中,我们可以看出算法是十分的有效的,基本能够保证密码具有一定的安全性。但是存在的问题也很明显,其中最主要的问题是对重复或连续的字符评分过高。以测试用例中最后一个为例: 000000!! 可以得到70分,但显然并不是一个非常强壮的密码。 另外,方案1最高可以得到95分,也就是说没有100分(绝对安全)的密码,这一点也是很有智慧的设计。 2 方案2 针对方案1中的不足,方案2中引入了减分机制。对于重复出现,连续出现的字符给予适当的减分,以使得密码评分更准确。同时在方案2中密码的评分基数及计算过程都十分的复杂,要想理解其中每一步的含义,请保持足够的耐心。 2.1 方案2加分项 一、密码长度: 公式 :+(n*4),其中n表示密码长度 二、大写字母: 公式:+((len-n)*2),其中n表示大写字母个数,len表示密码长度 三、小写字母: 公式:+((len-n)*2),其中n表示小写字母个数,len表示密码长度 四、数字: 公式:+(n*4),其中n表示数字个数 条件:满足n < len,才能得到加分,len表示密码长度 五、符号: 公式:+(n*6),其中n表示符号个数 六、位于中间的数字或符号: 公式:+(n*2),其中n表示位于中间的数字或符号个数 七、最低条件得分: 公式:+(n*2),其中n表示满足的最低条件条目数 条件:只有满足最低条件,才能得到加分 其中最低条件的条目如下: 1.密码长度不小于8位 2.包含大写字母 3.包含小写字母 4.包含数字 5.包含符号 最低条件要求满足条目1并至少满足条目2-5中的任意三条。 2.2 方案2减分项 一、只有字母: 公式:-n,其中n表示字母个数 二、只有数字: 公式:-n,其中n表示数字个数 三、重复字符数(大小写敏感): 该项描述复杂,具体计算方法见如下示例程序: var pass = "1111aaDD"; //示意密码 var repChar = 0; var repCharBonus = 0; //得分 var len = pass.length; for(var i = 0; i < len; i++) { var exists = false; for (var j = 0; j < len; j++) { if (pass[i] == pass[j] && i != j) { exists = true; repCharBonus += Math.abs(len/(j-i)); } } if (exists) { repChar++; var unqChar = len - repChar; repCharBonus = (unqChar) ? Math.ceil(repCharBonus/unqChar) : Math.ceil(repCharBonus); } } 四、连续大写字母: 公式:-(n*2),其中n表示连续大写字母出现的次数 举例:如输入AUB,则n=2 五、连续小写字母: 公式:-(n*2),其中n表示连续小写字母出现的次数 举例:如输入aub,则n=2 六、连续数字: 公式:-(n*2),其中n表示连续数字出现的次数 举例:如输入381,则n=2 七、正序或逆序字母: 公式:-(n*3),其中n表示连续发生的次数 正序或逆序是指字母表中的顺序 不区分大小写 条件:只有连续3个字母或以上,才会减分, 例1:如输入ABC,则n=1 例2:如输入dcBA,则n=2 八、正序或逆序数字: 公式:-(n*3),其中n表示连续发生的次数 条件:只有连续3个数字或以上,才会减分 例1:如输入123,则n=1, 例2:如输入4321,则n=2 例3:如输入12,则不会减分 九、正序或逆序符号: 公式:-(n*3),其中n表示连续发生的次数 条件:只有连续3个符号或以上,才会减分 2.3 方案2等级划分 根据密码评分,将密码划分成以下5个等级: >= 80: 非常强(VERY_STRONG) >= 60: 强(STRONG) >= 40: 好(GOOD) >= 20: 弱(WEAK) >= 0: 非常弱( VERY_WEAK) 2.4 方案2演示程序 演示程序 2.5 方案2测试分析 // 评分 0 console.log("11111111".score()); // 评分 2 console.log("aa111111".score()); // 评分 38 console.log("000000!!".score()); // 评分 76 console.log("Asdf2468".score()); // 评分 76 console.log("Mary2468".score()); // 评分 60 console.log("@dmin246".score()); 从以上测试可以看出方案2较方案1有了比较大的改进和提升,尤其是对连续或重复字符上表现出色。但是方案2也存在明显的不足,主要缺点包括对人名(Mary)、单词(Story)、键盘上相连的键(Asdf)、L33T(@dmin)没法识别。 L33T:是指把拉丁字母换成数字或是特殊符号的书写形式。例如把E写成3、A写成@、to写成2、for写成4。 3 方案3 zxcvbn 3.1 简要说明 针对方案2中的不足,引入了方案3,进一步的提长密码强度。方案3完全引入一个第三方检验工具zxcvbn。 zxcvbn是一个受密码破解启发而来的密码强度估算器。它通过模式匹配和保守估计,大概可以识别大约30K左右的常规密码。主要基于美国人口普查数据,维基,美国电影,电视流行词以及其它一些常用模式,像日期,重复字符,序列字符,键盘模式和L33T会话等。 从算法的设计思想上,该方案完全秒杀基于构成的统计分析方法(前两种方法)。同时zxcvbn支持多种开发语言。因其模式的复杂及字典的存在,当前版本的zxcvbn.js大约有800多K。 要了解项目的详情及算法见zxcvbn官网: github zxcvbn 3.2 方案3演示程序 演示程序 以上是三胖对密码强度检测算法和方案的理解和分析,不足之处还请大家多多指正! 原文链接

优秀的个人博客,低调大师

JavaScript 中 Array.prototype.sort 的稳定性与比较函数陷阱

最近在重构一个数据表格组件时,遇到一个看似简单却折腾了半天的 bug:明明按状态和时间排序,结果分页后部分行顺序乱跳。排查后发现根源是 Array.prototype.sort 的默认行为与比较函数返回值处理。在 V8 引擎中,数组长度小于等于 10 时使用插入排序,大于 10 时使用快速排序,而快速排序在旧版 V8 中是不稳定的。虽然 ES2019 已经要求 sort 必须稳定,但 Node.js 10 及之前、部分旧浏览器仍可能不稳定,并且比较函数返回非数字、返回布尔值、返回浮点数都会导致不可预期的排序结果。这篇文章会从实际代码出发,分析排序不稳定的表现、比较函数的正确写法、数字与字符串排序差异,以及如何用 Intl.Collator 处理中文排序。

优秀的个人博客,低调大师

JavaScript 中的 AbortController:如何优雅地取消 fetch 请求与清理副作用

在单页应用里,用户快速切换路由、连续触发搜索或者重复提交表单时,发出去的异步请求往往已经不再需要了。浏览器虽然会继续接收响应,但回调里执行的状态更新可能覆盖掉最新的结果,甚至对已经卸载的组件执行 setState,造成内存泄漏或界面闪烁。过去我们用 XMLHttpRequest 的 abort 方法,或者引入 axios 的 CancelToken,现在浏览器原生提供了 AbortController 和 AbortSignal,可以统一取消 fetch、监听事件流以及清理各种异步副作用。这篇文章不堆砌 API 列表,而是从实际开发中常见的搜索框竞态、组件卸载后清理、超时控制这几个场景出发,说明 AbortController 的工作机制、和 fetch 配合时的注意点,以及如何用同一个 signal 管理多个异步操作,最后给出几个容易踩坑的细节。

优秀的个人博客,低调大师

从普通 script 到 ESM:一文搞懂 JavaScript 模块、IIFE 和 window

写前端代码时,我们经常遇到两种用法: import { hello } from './xxdemo.js' 同样是 JS 文件,为什么加载方式不同?为什么有些库会写 window.xxx,有些库却使用 export?IIFE 又是什么,为什么要让函数定义后立即执行? JS、TS、ESM、npm,分别在说什么? 先分清它们描述的层面: | 名称 | 描述的事情 | 简单理解 | | --- | -

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册