Number.EPSILON
今天介绍一个新的属性 - Number.EPSILON 用来表示 JS 中计算时的误差范围。
这个属性是 ECMAScript 2015 (6th Edition, ECMA-262) 开始支持的,兼容性上 IE 至今未支持..
EPSILON属性的值接近于 2^-52,表示1与大于1的最小浮动数之前的差值。 可以这么理解,它表示JS下进行计算时的最小精度,如果误差小于这个值可以认为没有意义。
利用 Numer.EPSILON 可以解决精度计算误差的问题,比如经典的 0.1 + 0.2 != 0.3
1234x = 0.2;y = 0.3;z = 0.1;equal = (Math.abs(x - y + z) < Number.EPSILON
EPSILON(ε0)在数学中是序数,表示最小的数字
Q1. 精度运算问题中,为什么 0.1+0.2 != 0.3, 0.2 + 0.2 == 0.4 ?
这就涉及到计算机组成原理中关于数据存储的问题了,0.1+0.2 的计算步骤为
123456// 0.1 和 0.2 都转 ...
Leancloud 快速搞定网站访问量统计
博客现在用的评论是 Valine, 是一款基于 Leancloud 的快速、简洁且高效的无后端评论系统。看配置什么都挺简单的,也有不少教程,本来没想写这个,但实际在访问量统计这个功能上遇到不少问题(仍然是需要一定开发工作的),找到的教程都挺乱,干脆自己重新梳理下了。
Before. 配置好 Valine先参照 Valine官网教程 把应用配置好,不要遗漏安全域名,至此你的评论功能应该已经好了。
如果你不需要评论功能,或者不需要 Valine 来实现评论功能,可以跳过引用 Valine,但仍然需要创建好 Leancloud 的应用。
Start.访问量统计|前因虽然 Valine 文档中说明从 v1.2.0 版本开始支持了文章阅读量统计
new Valine({ el:’#vcomments’, … visitor: true // 阅读量统计}) 如果开启了阅读量统计,Valine 会自动检测 leancloud 应用中是否存在Counter类,如果不存在会自动创建,无需手动创建~ Vali ...
ZRender 使用记录
在使用 ZRender 过程中遇到的一些问题…
基础链接:
ZRnder 文档
ZRender github
textLineHeight 行高配置无效在家实测 4.0.7 已经修复了这个问题,在公司用的 4.0.4,看了下 commit 记录 官网是在 4.0.6 修复这个问题的,是由于代码中对传入配置优先级的取舍导致的
12不再维护{% codepen OqVgGb js,result 300 100% ldinglding dark %}
多行( \n ) + 超出省略( outerWidth )
扶额 …
从测试代码看没有问题,可以实现多行时仅最后一行出省略符…的效果,那应该是我这块的宽度计算 outerWidth 有问题(我这边做的处理是根据传入的文本计算换行、自适应宽度、自适应高度、超出最大限制后出省略符)
12不再维护{% codepen LaVjMR js,result 300 100% ldinglding dark %}
事件到底如何使用上手的时候看文档是 zrender.Eventful.on ,就去查 Event ...
计算字的宽高
在不算多功能需求中,我们会遇到需要用JS来计算字宽高的情况,比如
canvas根据渲染文字计算换行、块的大小等
IE8及以下双行并且有省略符…
文字少的时候居中,文字超出的时候出省略符…
通常,我们采用建立伪节点来计算
123456789101112131415161718192021// 参数配置的形式function getTextSize (text, style = {}, container = document.body) { let dom = document.createElement('div') // dom.id = 'YOUR_SCOPE_measure' for (let attr in style) { dom.style[attr] = style[attr] } dom.style.opacity = 0 dom.style.display = 'inline-block' dom.innerText = tex ...
如何打乱数组? (洗牌算法)
定义问题既然要让计算机打乱数组,我们得先定义下“打乱”是什么?
让一个数组内的元素随机排列
那么,你怎么定义 随机 ?
要知道在计算机软件层面只能通过各种算法产生伪随机数,真正的随机必须结合物理和硬件来实现,比如可以根据周围电磁场的噪音生成之类
所以稍稍修改下目标:
让一个数组内的元素随机排列,并且每种排列结果尽可能少偏差
制定方案我们有那些随机打乱数组的算法呢?
1. sort + random1arr.sort(function() {return .5 - Math.random()});
运行结果 ↓(橙色正偏差,紫色负偏差,全部接近白灰最佳)
从结果看来这种算法并不好,究其原因,各浏览器 sort 的实现为了追求效率,并不会每两个元素都能进行比较和置换,那么可能性的分布就已经很不均了。
2. map + sort + random1234var random = array.map(Math.random);array.sort(function(a, b) { return rando ...
同源策略(CORS)探究
一、有哪些场景
由 XMLHttpRequest 或者 Fetch 发起跨域 HTTP 请求
Web FONT (CSS @font-face)
WebGL 贴图
canvas API 中的 drawImage
CSS 中的资源请求
二、简单的 CORS 实现在跨域 AJAX 请求中, 浏览器端无需做任何操作,会自动在 header 信息中添加一个 Orgin 字段;如果是 Fetch ,则需要添加字段 mode: 'cors' 。
1234567891011GET http://square.10jqka.com.cn/usercenter/strategy/getrecommendlist HTTP/1.1Host: square.10jqka.com.cnConnection: keep-alivePragma: no-cacheCache-Control: no-cacheAccept: */*Origin: http://www.10jqka.com.cnUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) ...
Fetch 和 Ajax 有什么差别
首先让我们来现清理下概念
Ajax 最正确的概念应该是 异步 JavaScript 和 XML (Asynchronous Javascript And XML) ,是指通过核心对象 XHR (XMLHTTPRequest) 达到一种向服务器提出请求并处理响应而不阻塞用户的技术,为Web交互方向打开了新的大门。再后来,由于很多框架都封装了对应的 Ajax 方法,比如大名鼎鼎的 jQuery 中的 $.ajax(url, func),很多开发者开始直接称呼这类对 XHR (XMLHTTPRequest) 对象进行方法封装的方法为 Ajax 。
而 Fetch 这种新方法提供了一种简单,合理的方式来跨网络异步获取资源。
下面来了解下 Fetch 在使用中和 Ajax 的差别~
一、Promise标准提到 Fetch 和 Ajax 最大的不同,应该是 Fetch 是基于标准 Promise 实现,支持 async/await
试试这个简单的请求
1234567fetch('http://example.com/movies. ...
VPS出事的又一天
今天 vps 又被禁了,记一下检查流程 ╮(╯▽╰)╭
S1.检查是不是机子挂了进行海外连接ip测试站长工具 ping.chinaz.com/ 选择“海外”进行测试
如果全部超时,机子挂了,解决方案:
可能搬瓦工机房服务器处于维修状态,这个页面 可以查看当前机房服务器状态,绿色是正常
重启
重装
提交工单,找客服
备用 ip 测试工具
http://ping.pe/
S2. 检查是否ip被禁进行国内连接 ip 测试 同S1, 选择所有国内站点进行测试,如果全部超时,ip被封无疑
更换ip
免费更换地址 登陆后,点击 Test ,如果 bwg 检查 ip 确实被封,可以免费换(现在是,每十周并且被封才能免费换)
收费更换地址
S3.检查是否端口被封
telnet IP 端口
如果不是 ssh 端口被封还好,把自己暴露的服务端口改下重启,麻烦的是要通知所有用你机子的人..
SSH 端口被封
修改配置文件,修改/添加端口号
1vim /etc/ssh/sshd_config
...
了解你使用的 Sort ( 实现剖析) - 3
先上图, 本篇文章涉及 归并排序 和 基数排序 两种算法
往期:
了解你使用的 Sort ( 实现剖析) - 1 中,介绍了 **插入排序** 和 **交换排序** 中四种排序算法
了解你使用的 Sort ( 实现剖析) - 2 中,介绍了 **选择排序** 中两种算法
归并排序归并排序使用分治法,核心在于数列的“分”与“合”,不断地将两个已排好序的数组合并一个有序数组
思路:
将数组分割为两个部分,创建新的数组a1和 b1
如果a1的长度大于2,则继续执行1过程,直至ai
将ai中两个数字进行比较交换位置形成有效数组
递归向上比较两个数组大小并合并成新的有序数组 (例如比较数组第一位,即可得出哪个数组更小)
参考动画去理解 ↓
基数排序前置条件:
必须为整数数组,或者你可以转化为整数数组
知道数组的位数范围(比如 0 - 999 最多三位)
基数排序是桶排序的改进算法。由于桶排序需要创建数组数据范围长度的空间,很浪费空间,基数排序则是一个逐位(个位、十位、百位等)的桶排序,空间仅需长度为10的数组
思路:
首先只关注数组a中每个数的个位 ...
了解你使用的 Sort ( 实现剖析) - 2
先上图, 本篇文章涉及 选择排序 中两种算法
往期:
了解你使用的 Sort ( 实现剖析) - 1中,介绍了 **插入排序** 和 **交换排序** 中四种排序算法
直接选择思路:
遍历数组a[0]-a[n]并得出最小值a[j], 将a[0]与a[j]互换
遍历数组a[1]-a[n]并得出最小值a[j], 将a[1]与a[j]互换
循环直至结束
参考动画去理解 ↓
堆排序核心:将数组构造成二叉堆↓(左侧数组,右侧对应二叉堆)
二叉堆(英语:binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。当父节点的键值总是大于或等于任何一个子节点的键值时为“最大堆”。当父节点的键值总是小于或等于任何一个子节点的键值时为“最小堆”。
思路:
构建二叉堆 (注意如果子节点与父节点交换了位置,则交换位置后的父节点仍需要向下验证)
解构二叉堆为数组(注意二叉堆两个子节点的大小关系是不保证的,需要做比较)
& ...