摘要: 最近这些年在对 JavaScript 进行考古时,发现网景时代的 JavaScipt 实现,存在一些鲜为人知的特性,我从中挑选几个有趣的说一下。 Object.prototype.eval() 方法 在 JavaScript 1.0 中,eval 和现在一样,只是个全局函数。在 JavaScript 阅读全文
posted @ 2017-12-06 17:28 紫云飞 阅读(1868) 评论(0) 推荐(0) 编辑
摘要: 假设你在一段陌生的代码中看到这样一个函数: 单看这个函数你能知道它是想把“日-月-年”替换成“月-日-年”,还是反过来?匿名捕获分组没法做到这一点,那就该命名捕获分组上场了: 俗话说的好,“一个好的变量名赛过一行注释”,命名捕获分组很大的一个作用就是它能起到注释的作用。 另外,命名捕获分组还有一个好 阅读全文
posted @ 2017-04-25 17:54 紫云飞 阅读(10888) 评论(0) 推荐(0) 编辑
摘要: 现如今,网民的网络账户被盗,很有可能是被“钓鱼”了。去年的一份安全报告中指出:“近85%的资金损失是通过钓鱼网址泄露支付信息造成的”。 传统的钓鱼网站通常是申请一个和被冒充网站相似的域名,比如 taobao000.com ,或者直接利用三四级域名来冒充,比如 taobao.com.evil.com。 阅读全文
posted @ 2017-04-24 11:32 紫云飞 阅读(14349) 评论(2) 推荐(0) 编辑
摘要: 正则表达式最早是由 Ken Thompson 于 1970 年在他改进过的 QED 编辑器里实现的,正则里最简单的元字符 “.” 在当时所匹配的就是除换行符外的任意字符: "." is a regular expression which matches any character except < 阅读全文
posted @ 2017-04-07 12:02 紫云飞 阅读(1978) 评论(0) 推荐(0) 编辑
摘要: 不知道你有没有经历过这样的场景:当你打开一张“多图杀猫”的页面后,正一张图一张图边滚边看,在你刚准备定睛看某一张图的时候,这张图突然被它上面的内容挤到了视口下方,然后你赶紧把滚动条往下拉,试图追赶这张没看完的图,当你刚刚追上的时候,这张图又一次被挤到了你看不见的地方。 发生这种情况的原因是因为在很多 阅读全文
posted @ 2017-04-05 17:03 紫云飞 阅读(6108) 评论(0) 推荐(0) 编辑
摘要: 从 ES1 到 ES5 的这 14 年时间里,Function.prototype.toString 的规范一字未变: 这段话说了两点内容: 1. toString() 返回的字符串应该符合 FunctionDeclaration 的语法 2. 要不要保留原始的空白符和分号,规范不管 规范管的一点引 阅读全文
posted @ 2017-03-29 16:36 紫云飞 阅读(871) 评论(0) 推荐(0) 编辑
摘要: 因为受 cancelable promise 的拖延,fetch 一直没有传统的 XHR 所拥有的 abort() 和 onprogress 功能,去年年底 cancelable promise 草案被彻底废弃了,所以今年年初的这几个月里,一份完全新的、fetch 专用的、不依赖 JS 规范、与 P 阅读全文
posted @ 2017-03-26 14:45 紫云飞 阅读(2749) 评论(1) 推荐(0) 编辑
摘要: 在阅读本文前推荐你先阅读我的前两篇文章《 扼杀 304,Cache-Control: immutable》和《关于缓存和 Chrome 的“新版刷新”》;下面要说的两个问题是在淘宝(包括天猫等等)任意主流页面中都存在的,所以你可以随便打开一个页面进行测试;这两个问题我去年在微博上都简单提到过,这里做 阅读全文
posted @ 2017-02-23 15:36 紫云飞 阅读(3015) 评论(3) 推荐(0) 编辑
摘要: 在读本文前你要确保读过我的上篇文章《扼杀 304,Cache-Control: immutable》,因为本文是接着上文写的。上文说到,在现代 Web 上,“条件请求/304 响应”绝大多数都是浪费资源,因为绝大多数静态资源都是永恒不变的,因此 Firefox 实现了 Cache-Control: 阅读全文
posted @ 2017-01-20 12:25 紫云飞 阅读(6094) 评论(2) 推荐(0) 编辑
摘要: 在 JavaScript 中,有两个地方用到了反斜杠转义序列,一个是在字符串字面量里,一个是在正则字面量里。其中字符串字面量里的反斜杠转义序列又分为下面几种形式: 1. \ 后面跟着单引号(')、双引号(")、反斜杠自己(\)、b、f、n、r、t、v 其中的一个 2. \ 后面跟着某个行终止符序列, 阅读全文
posted @ 2016-11-28 13:31 紫云飞 阅读(12218) 评论(2) 推荐(0) 编辑
摘要: 考虑下面的这三句代码和对应的报错信息: 假设写这个代码的人一开始不知道 ES6 里新增的构造函数不能省略 new,于是第一行写错了。然后第二行尝试重新声明一次,结果又报错说重复声明了。那干脆不声明,直接赋值总行吧,结果又报错说 map 未定义。 这三个报错直接对应规范里的下面三条规则(并附通俗解释) 阅读全文
posted @ 2016-11-15 19:31 紫云飞 阅读(3929) 评论(2) 推荐(0) 编辑
摘要: ES6 里新增了两种声明变量的方式,let 和 const,加上原来的 var,一共就有三种方式来声明变量了。那到底该用哪个呢?关于“尽可能不用 var” 这一点,大家应该没有什么意见分歧(其实还是有少数人不这么想的),关于“是用 let 还是用 const”,社区里主要有两种不同的观点: 1. 默 阅读全文
posted @ 2016-11-11 17:33 紫云飞 阅读(32883) 评论(2) 推荐(0) 编辑
摘要: const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assignment to constant variable. 但遗憾的是,这个错误不是个静态错误(stat 阅读全文
posted @ 2016-11-10 00:12 紫云飞 阅读(4619) 评论(0) 推荐(2) 编辑
摘要: 非简单参数就是 ES6 里新加的参数语法,包括:1.默认参数值、2.剩余参数、3.参数解构。本文接下来要讲的就是 ES7 为什么禁止在使用了非简单参数的函数里使用 "use strict" 指令: function f(foo = "bar") { "use strict" // SyntaxErr 阅读全文
posted @ 2016-11-01 21:11 紫云飞 阅读(2233) 评论(0) 推荐(0) 编辑
摘要: 引题:为什么 JavaScript 中的 arguments 对象不是数组 http://www.zhihu.com/question/50803453 JavaScript 1.0 1995 年, Brendan Eich 在 Netscape Navigator 2.0 中实现了 JavaScr 阅读全文
posted @ 2016-09-21 20:48 紫云飞 阅读(1715) 评论(2) 推荐(1) 编辑
摘要: 在传统的浏览器中,同步的 script 标签是会阻塞 HTML 解析器的,无论是内联的还是外链的,比如: 在这个例子中,HTML 解析器会先解析到第一个 script 标签,然后暂停解析,转而去下载 a.js,下载完后开始执行,执行完后,才会继续解析、下载、执行后面的两个 script 标签,最后解 阅读全文
posted @ 2016-09-18 14:13 紫云飞 阅读(39052) 评论(5) 推荐(1) 编辑
摘要: 因为 HTTP 协议是无状态的,所以很久以前的网站是没有登录这个概念的,直到网景发明 cookie 以后,网站才开始利用 cookie 记录用户的登录状态。cookie 是个好东西,但它很不安全,其中一个原因是因为 cookie 最初被设计成了允许在第三方网站发起的请求中携带,CSRF 攻击就是利用 阅读全文
posted @ 2016-07-12 20:13 紫云飞 阅读(30686) 评论(4) 推荐(0) 编辑
摘要: 随着近些年社交网站的流行,越来越多的人学会了“刷”网页 ── 刷微博,刷朋友圈,刷新闻,刷秒杀页。这里的“刷”,就是刷新的意思,在浏览器里,你可以通过点击刷新按钮,或者用快捷键,或者移动端的下拉操作来进行刷新。 但普通网民不知道的是,通过刷新操作导致的页面加载和通过其他操作(比如点击页面链接,地址栏 阅读全文
posted @ 2016-07-06 20:02 紫云飞 阅读(5534) 评论(2) 推荐(1) 编辑
摘要: 1997 年,IE 4.0 发布,带来的众多新特性中有一个对未来“影响深远”的 DOM API:document.all。在随后的 6 年里,IE 的市场占有率越来越高,直到 2003 年的 95%。 在这段时间里,产生了两种成千上万的页面。第一种:IE only 的页面,由于超高的市场占有率,开发 阅读全文
posted @ 2016-06-26 20:29 紫云飞 阅读(3218) 评论(0) 推荐(5) 编辑
摘要: 温馨提示:本文目前仅适用于在 Chrome 51 及以上中浏览。 2016.11.1 追加,Firefox 52 也已经实现。 2016.11.29 追加,Firefox 的人担心目前规范不够稳定,未来很难保证向后兼容,所以禁用了这个 API,需要手动打开 dom.IntersectionObser 阅读全文
posted @ 2016-06-13 18:57 紫云飞 阅读(8883) 评论(8) 推荐(4) 编辑
摘要: 很久以前,addEventListener() 的参数约定是这样的: 后来,最后一个参数,也就是控制监听器是在捕获阶段执行还是在冒泡阶段执行的 useCapture 参数,变成了可选参数(传 true 的情况太少了),成了: 去年年底,DOM 规范做了修订:addEventListener() 的第 阅读全文
posted @ 2016-06-01 14:08 紫云飞 阅读(40560) 评论(7) 推荐(1) 编辑
摘要: https://jeffmo.github.io/es-trailing-function-commas 目前是一个 stage 3 的提案,Chakra 和 JSC 已经实现了,它允许我们在函数定义时的最后一个形参和函数调用时的最后一个实参的尾部加上逗号。 最后一个参数加上逗号有什么优点? 注意: 阅读全文
posted @ 2016-05-30 19:24 紫云飞 阅读(2031) 评论(0) 推荐(0) 编辑
摘要: 即便 Bash 没有从父进程继承任何的环境变量,Bash 自己也会创建三个环境变量,分别是:$ env -i bash -c exportdeclare -x OLDPWDdeclare -x PWD="/"declare -x SHLVL="1"SHLVL如果父进程传递了 SHLVL 环境变量,那... 阅读全文
posted @ 2015-11-27 14:13 紫云飞 阅读(1807) 评论(0) 推荐(1) 编辑
摘要: 每个 C 程序都有一个 main 函数,每个 main 函数都有一个 argv 参数,这个参数是一个字符串数组,这个数组的值是由该 C 程序的父进程在通过 exec* 函数启动它时指定的。很多人说 Bash 中的 $0 的值就是 bash 这个 C 程序在它的 main 函数中获取到的 argv[0... 阅读全文
posted @ 2015-11-27 11:32 紫云飞 阅读(1849) 评论(0) 推荐(0) 编辑
摘要: 我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序。fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 fork 子进程,直接在当前进程执行 execve()。bash -c 'command'如果用了... 阅读全文
posted @ 2015-11-13 21:42 紫云飞 阅读(1176) 评论(0) 推荐(0) 编辑
摘要: 今天无意发现下面这个表现:$ env -i bash -c cdbash: line 0: cd: HOME not set$env -i bash -c 'echo $HOME'这表明了,Bash 只会从环境变量中继承 HOME 变量,从来不自己初始化它?为了证实这个想法,我去翻了下源码,发现其实... 阅读全文
posted @ 2015-11-12 16:59 紫云飞 阅读(842) 评论(0) 推荐(0) 编辑
摘要: 你有没有留意过下面这种场景:$lsfile1 file2 file3 file4 file5$ ls | catfile1file2file3file4file5单独执行 ls 时,它的输出是一行多个文件名,在它后面接个管道的话,它的输出就变成了一行一个文件名,这是为什么呢?这种表现的原理是:ls ... 阅读全文
posted @ 2015-11-02 17:05 紫云飞 阅读(902) 评论(0) 推荐(0) 编辑
摘要: Bash 4.4 中新增了一种 ${...} 语法,长这样:${parameter@operator}。根据不同的operator,它展开后的值可能是parameter 这个参数的值经过某种转换后的值,又可能是关于 parameter 参数自身的某种信息。这句话太抽象了,还是看下面的详细解释吧。op... 阅读全文
posted @ 2015-10-28 21:10 紫云飞 阅读(1448) 评论(0) 推荐(0) 编辑
摘要: 在 Bash 中,有两个内置命令用来控制 Bash 的各种可配置行为的开关(打开或关闭),这些开关称之为选项(option)。其中一个命令是 set,set 命令有三种功能:显示所有的变量和函数;修改 Bash 的位置参数;控制 Bash 的第一套选项。可见 set 命令完全违背了“一个命令只干一件... 阅读全文
posted @ 2015-10-27 15:29 紫云飞 阅读(7112) 评论(0) 推荐(0) 编辑
摘要: 在 Bash manual 里叫 Word Splitting,在 Posix 规范里叫 Field Splitting,这两者指的是同一个东西,我把它翻译成“分词”,下面我就说三点很多人都忽略掉(或者说从没仔细考虑过)的分词细节。1. 分隔符到底是字符还是字符串?IFS 里面可以包含多个字符,那么... 阅读全文
posted @ 2015-10-21 17:07 紫云飞 阅读(1299) 评论(0) 推荐(0) 编辑
摘要: read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已:$ read name1$echo "$name"1$ read1$ echo "$REPLY"1当没有指定变量名时,read 会给默认的变量 REPLY 赋值,仅此而已。然而今天我却发现个细微的区别(下面为了显示... 阅读全文
posted @ 2015-10-19 17:49 紫云飞 阅读(1054) 评论(0) 推荐(0) 编辑
摘要: 上文中曾讲到,我在我的 Mac 上发现很多和 Bash 内部命令同名的外部命令,在那 24 个外部命令中,我发现个奇怪的现象:它们中有 15 个居然是 Shell 脚本,更奇怪的是,居然是同一个 Shell 脚本的硬链接:$find /usr/bin -inum 376183/usr/bin/ali... 阅读全文
posted @ 2015-09-26 23:54 紫云飞 阅读(1768) 评论(0) 推荐(0) 编辑
摘要: 我们知道,在 Bash 中,当变量出现在一个赋值语句的右侧时,变量只会展开,不会分词,即便变量两边没有引号:$foo="1 2"$bar=$foo # 不会被拆分成 bar=1 和 2 两个词$echo "$bar"1 2但是,当一个形似赋值语句的词,作为... 阅读全文
posted @ 2015-09-25 06:13 紫云飞 阅读(553) 评论(0) 推荐(0) 编辑
摘要: 网上经常有人问这个问题:为什么我写的 alias 在 sudo 下就不管用了?$ alias 'll=ls -l'$ sudo ll a-private-dirsudo: ll: command not found为什么会这样?因为正常情况下,alias 只有出现在一条简单命令的命令名称的位置(大部... 阅读全文
posted @ 2015-09-24 08:49 紫云飞 阅读(843) 评论(0) 推荐(0) 编辑
摘要: 昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息。有人回答他了,原因是coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受任何选项。当你在 Bash 里执行[ --help 时,当然优先执行的是内部命令 [,而不是外部命令 ... 阅读全文
posted @ 2015-09-23 17:23 紫云飞 阅读(1882) 评论(0) 推荐(0) 编辑
摘要: 在上文中曾说到:所谓的环境变量的真实面目其实就是个任意字符串Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量Bash 在启动外部命令时会将自己内部标记为环境变量的变量重组成字符串数组赋值给environ本文中继续深入讲三点:environ 数组中可能存在 = 左边... 阅读全文
posted @ 2015-09-22 16:17 紫云飞 阅读(1661) 评论(0) 推荐(0) 编辑
摘要: BASH_SUBSHELL 实现于 Bash 3.0,我一直想不到它在实际编码中有什么用,后来在 Bash 的 Change Log 里找到一句话,才知道它是作调试用的:New variables to support the bash debugger: BASH_ARGC, BASH_ARGV,... 阅读全文
posted @ 2015-09-21 21:29 紫云飞 阅读(1423) 评论(0) 推荐(0) 编辑
摘要: 除非特别说明,本文中出现的 Shell 均指 Bash 4.3。首先说一个基础知识:Shell 中的变量在展开成值(Parameter Expansion)之后,这个值在某些上下文(Context)中,还会进行分词操作(Word Splitting),但在另外一些上下文中,不会进行分词操作。本文中把... 阅读全文
posted @ 2015-09-15 11:55 紫云飞 阅读(3888) 评论(0) 推荐(0) 编辑
摘要: 在 Bash 里,可以通过export 命令查看当前 Shell 进程的环境变量,这些环境变量一些是 Bash 自己创建的,还有一些是 Bash 从父进程继承来的,然而需要注意的是,父进程传给 Bash 的环境变量不一定是我们想象的那样。在 C 语言层面,环境变量是存放在一个名为environ 的全... 阅读全文
posted @ 2015-09-14 16:13 紫云飞 阅读(1400) 评论(0) 推荐(0) 编辑
摘要: SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,而BASH_SUBSHELL 是记录一个 Bash 进程实例中多个子 Shell(subshell)嵌套深度的累加器。看不懂上面这句话不要紧,因为是我临时编的。其实如果你混淆了这两个变量,我猜你多半是对BASH_SUBSHELL 这个变量名... 阅读全文
posted @ 2015-09-13 08:09 紫云飞 阅读(6104) 评论(4) 推荐(1) 编辑