摘要: 在 JavaScript 中,有两个地方用到了反斜杠转义序列,一个是在字符串字面量里,一个是在正则字面量里。其中字符串字面量里的反斜杠转义序列又分为下面几种形式: 1. \ 后面跟着单引号(')、双引号(")、反斜杠自己(\)、b、f、n、r、t、v 其中的一个 2. \ 后面跟着某个行终止符序列,阅读全文
posted @ 2016-11-28 13:31 紫云飞 阅读(747) 评论(1) 编辑
摘要: 考虑下面的这三句代码和对应的报错信息: 假设写这个代码的人一开始不知道 ES6 里新增的构造函数不能省略 new,于是第一行写错了。然后第二行尝试重新声明一次,结果又报错说重复声明了。那干脆不声明,直接赋值总行吧,结果又报错说 map 未定义。 这三个报错直接对应规范里的下面三条规则(并附通俗解释)阅读全文
posted @ 2016-11-15 19:31 紫云飞 阅读(518) 评论(1) 编辑
摘要: ES6 里新增了两种声明变量的方式,let 和 const,加上原来的 var,一共就有三种方式来声明变量了。那到底该用哪个呢?关于“尽可能不用 var” 这一点,大家应该没有什么意见分歧(其实还是有少数人不这么想的),关于“是用 let 还是用 const”,社区里主要有两种不同的观点: 1. 默阅读全文
posted @ 2016-11-11 17:33 紫云飞 阅读(1339) 评论(0) 编辑
摘要: const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assignment to constant variable. 但遗憾的是,这个错误不是个静态错误(stat阅读全文
posted @ 2016-11-10 00:12 紫云飞 阅读(515) 评论(0) 编辑
摘要: 非简单参数就是 ES6 里新加的参数语法,包括:1.默认参数值、2.剩余参数、3.参数解构。本文接下来要讲的就是 ES7 为什么禁止在使用了非简单参数的函数里使用 "use strict" 指令: function f(foo = "bar") { "use strict" // SyntaxErr阅读全文
posted @ 2016-11-01 21:11 紫云飞 阅读(420) 评论(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 紫云飞 阅读(540) 评论(1) 编辑
摘要: 在传统的浏览器中,同步的 script 标签是会阻塞 HTML 解析器的,无论是内联的还是外链的,比如: 在这个例子中,HTML 解析器会先解析到第一个 script 标签,然后暂停解析,转而去下载 a.js,下载完后开始执行,执行完后,才会继续解析、下载、执行后面的两个 script 标签,最后解阅读全文
posted @ 2016-09-18 14:13 紫云飞 阅读(1577) 评论(0) 编辑
摘要: 因为 HTTP 协议是无状态的,所以很久以前的网站是没有登录这个概念的,直到网景发明 cookie 以后,网站才开始利用 cookie 记录用户的登录状态。cookie 是个好东西,但它很不安全,其中一个原因是因为 cookie 最初被设计成了允许在第三方网站发起的请求中携带,CSRF 攻击就是利用阅读全文
posted @ 2016-07-12 20:13 紫云飞 阅读(306) 评论(0) 编辑
摘要: 随着近些年社交网站的流行,越来越多的人学会了“刷”网页 ── 刷微博,刷朋友圈,刷新闻,刷秒杀页。这里的“刷”,就是刷新的意思,在浏览器里,你可以通过点击刷新按钮,或者用快捷键,或者移动端的下拉操作来进行刷新。 但普通网民不知道的是,通过刷新操作导致的页面加载和通过其他操作(比如点击页面链接,地址栏阅读全文
posted @ 2016-07-06 20:02 紫云飞 阅读(292) 评论(0) 编辑
摘要: 1997 年,IE 4.0 发布,带来的众多新特性中有一个对未来“影响深远”的 DOM API:document.all。在随后的 6 年里,IE 的市场占有率越来越高,直到 2003 年的 95%。 在这段时间里,产生了两种成千上万的页面。第一种:IE only 的页面,由于超高的市场占有率,开发阅读全文
posted @ 2016-06-26 20:29 紫云飞 阅读(1071) 评论(0) 编辑
摘要: 温馨提示:本文目前仅适用于在 Chrome 51 及以上中浏览。 2016.11.1 追加,Firefox 52 也已经实现。 2016.11.29 追加,Firefox 的人担心目前规范不够稳定,未来很难保证向后兼容,所以禁用了这个 API,需要手动打开 dom.IntersectionObser阅读全文
posted @ 2016-06-13 18:57 紫云飞 阅读(479) 评论(3) 编辑
摘要: 很久以前,addEventListener() 的参数约定是这样的: 后来,最后一个参数,也就是控制监听器是在捕获阶段执行还是在冒泡阶段执行的 useCapture 参数,变成了可选参数(传 true 的情况太少了),成了: 去年年底,DOM 规范做了修订:addEventListener() 的第阅读全文
posted @ 2016-06-01 14:08 紫云飞 阅读(267) 评论(0) 编辑
摘要: https://jeffmo.github.io/es-trailing-function-commas 目前是一个 stage 3 的提案,Chakra 和 JSC 已经实现了,它允许我们在函数定义时的最后一个形参和函数调用时的最后一个实参的尾部加上逗号。 最后一个参数加上逗号有什么优点? 注意:阅读全文
posted @ 2016-05-30 19:24 紫云飞 阅读(225) 评论(0) 编辑
摘要: 即便 Bash 没有从父进程继承任何的环境变量,Bash 自己也会创建三个环境变量,分别是:$ env -i bash -c exportdeclare -x OLDPWDdeclare -x PWD="/"declare -x SHLVL="1"SHLVL如果父进程传递了 SHLVL 环境变量,那...阅读全文
posted @ 2015-11-27 14:13 紫云飞 阅读(238) 评论(0) 编辑
摘要: 每个 C 程序都有一个 main 函数,每个 main 函数都有一个 argv 参数,这个参数是一个字符串数组,这个数组的值是由该 C 程序的父进程在通过 exec* 函数启动它时指定的。很多人说 Bash 中的 $0 的值就是 bash 这个 C 程序在它的 main 函数中获取到的 argv[0...阅读全文
posted @ 2015-11-27 11:32 紫云飞 阅读(210) 评论(0) 编辑
摘要: 我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序。fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 fork 子进程,直接在当前进程执行 execve()。bash -c 'command'如果用了...阅读全文
posted @ 2015-11-13 21:42 紫云飞 阅读(204) 评论(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 紫云飞 阅读(122) 评论(0) 编辑
摘要: 你有没有留意过下面这种场景:$lsfile1 file2 file3 file4 file5$ ls | catfile1file2file3file4file5单独执行 ls 时,它的输出是一行多个文件名,在它后面接个管道的话,它的输出就变成了一行一个文件名,这是为什么呢?这种表现的原理是:ls ...阅读全文
posted @ 2015-11-02 17:05 紫云飞 阅读(138) 评论(0) 编辑
摘要: Bash 4.4 中新增了一种 ${...} 语法,长这样:${parameter@operator}。根据不同的operator,它展开后的值可能是parameter 这个参数的值经过某种转换后的值,又可能是关于 parameter 参数自身的某种信息。这句话太抽象了,还是看下面的详细解释吧。op...阅读全文
posted @ 2015-10-28 21:10 紫云飞 阅读(218) 评论(0) 编辑
摘要: 在 Bash 中,有两个内置命令用来控制 Bash 的各种可配置行为的开关(打开或关闭),这些开关称之为选项(option)。其中一个命令是 set,set 命令有三种功能:显示所有的变量和函数;修改 Bash 的位置参数;控制 Bash 的第一套选项。可见 set 命令完全违背了“一个命令只干一件...阅读全文
posted @ 2015-10-27 15:29 紫云飞 阅读(431) 评论(0) 编辑
摘要: 在 Bash manual 里叫 Word Splitting,在 Posix 规范里叫 Field Splitting,这两者指的是同一个东西,我把它翻译成“分词”,下面我就说三点很多人都忽略掉(或者说从没仔细考虑过)的分词细节。1. 分隔符到底是字符还是字符串?IFS 里面可以包含多个字符,那么...阅读全文
posted @ 2015-10-21 17:07 紫云飞 阅读(232) 评论(0) 编辑
摘要: read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已:$ read name1$echo "$name"1$ read1$ echo "$REPLY"1当没有指定变量名时,read 会给默认的变量 REPLY 赋值,仅此而已。然而今天我却发现个细微的区别(下面为了显示...阅读全文
posted @ 2015-10-19 17:49 紫云飞 阅读(149) 评论(0) 编辑
摘要: 上文中曾讲到,我在我的 Mac 上发现很多和 Bash 内部命令同名的外部命令,在那 24 个外部命令中,我发现个奇怪的现象:它们中有 15 个居然是 Shell 脚本,更奇怪的是,居然是同一个 Shell 脚本的硬链接:$find /usr/bin -inum 376183/usr/bin/ali...阅读全文
posted @ 2015-09-26 23:54 紫云飞 阅读(267) 评论(0) 编辑
摘要: 我们知道,在 Bash 中,当变量出现在一个赋值语句的右侧时,变量只会展开,不会分词,即便变量两边没有引号:$foo="1 2"$bar=$foo # 不会被拆分成 bar=1 和 2 两个词$echo "$bar"1 2但是,当一个形似赋值语句的词,作为...阅读全文
posted @ 2015-09-25 06:13 紫云飞 阅读(163) 评论(0) 编辑
摘要: 网上经常有人问这个问题:为什么我写的 alias 在 sudo 下就不管用了?$ alias 'll=ls -l'$ sudo ll a-private-dirsudo: ll: command not found为什么会这样?因为正常情况下,alias 只有出现在一条简单命令的命令名称的位置(大部...阅读全文
posted @ 2015-09-24 08:49 紫云飞 阅读(174) 评论(0) 编辑
摘要: 昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息。有人回答他了,原因是coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受任何选项。当你在 Bash 里执行[ --help 时,当然优先执行的是内部命令 [,而不是外部命令 ...阅读全文
posted @ 2015-09-23 17:23 紫云飞 阅读(289) 评论(0) 编辑
摘要: 在上文中曾说到:所谓的环境变量的真实面目其实就是个任意字符串Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量Bash 在启动外部命令时会将自己内部标记为环境变量的变量重组成字符串数组赋值给environ本文中继续深入讲三点:environ 数组中可能存在 = 左边...阅读全文
posted @ 2015-09-22 16:17 紫云飞 阅读(210) 评论(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 紫云飞 阅读(203) 评论(0) 编辑
摘要: 除非特别说明,本文中出现的 Shell 均指 Bash 4.3。首先说一个基础知识:Shell 中的变量在展开成值(Parameter Expansion)之后,这个值在某些上下文(Context)中,还会进行分词操作(Word Splitting),但在另外一些上下文中,不会进行分词操作。本文中把...阅读全文
posted @ 2015-09-15 11:55 紫云飞 阅读(209) 评论(0) 编辑
摘要: 在 Bash 里,可以通过export 命令查看当前 Shell 进程的环境变量,这些环境变量一些是 Bash 自己创建的,还有一些是 Bash 从父进程继承来的,然而需要注意的是,父进程传给 Bash 的环境变量不一定是我们想象的那样。在 C 语言层面,环境变量是存放在一个名为environ 的全...阅读全文
posted @ 2015-09-14 16:13 紫云飞 阅读(219) 评论(0) 编辑
摘要: SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,而BASH_SUBSHELL 是记录一个 Bash 进程实例中多个子 Shell(subshell)嵌套深度的累加器。看不懂上面这句话不要紧,因为是我临时编的。其实如果你混淆了这两个变量,我猜你多半是对BASH_SUBSHELL 这个变量名...阅读全文
posted @ 2015-09-13 08:09 紫云飞 阅读(418) 评论(1) 编辑
摘要: SHLVL 环境变量代表 Shell 嵌套执行的深度。$ echo $SHLVL1$ bash$ echo $SHLVL2$ bash$ echo $SHLVL3在 Bash 里,这个值的范围是 [0, 1000],0 是怎么来的呢?是在上次的 SHLVL 值为负数的时候:$ SHLVL=-1$ b...阅读全文
posted @ 2015-09-12 12:36 紫云飞 阅读(171) 评论(0) 编辑
摘要: $_ 有好几个功能,我们最常用的是用它来获取“刚刚执行过的命令的最后一个参数”这个功能,比如下面这样:$ ls ~/Downloads/very/long/dir/ # ls 到某个目录看看有没有我们想要的文件file1 file2 needed_file$ cd $_ # 如果有,就进入到那个文件...阅读全文
posted @ 2015-09-07 17:34 紫云飞 阅读(179) 评论(0) 编辑
摘要: 首先,我们想到的会是 export(等价于 declare -x)命令:$ export | grep 'declare -x _='没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则本篇文章就该结束了。别忘了还有 env(或者 printenv)命令:$ env | grep '_='...阅读全文
posted @ 2015-09-06 23:40 紫云飞 阅读(227) 评论(0) 编辑
摘要: 我们知道,在 Shell 中,一个变量在被展开后,如果它没有被双引号包围起来,那么它展开后的值还会进行一次分词(word splitting,或者叫拆词,分词这个术语已经被搜索引擎相关技术占用了)操作,分成几个词,传给命令的就是几个单独的参数。举个例子,比如:$ foo="1 2 3"$how_ma...阅读全文
posted @ 2015-09-04 12:19 紫云飞 阅读(151) 评论(0) 编辑
摘要: 在 Bash 里,一共有五个地方支持反斜杠开头的转义序列,包括两个内部命令 echo 和 printf 的参数里,字符串语法 $'...' 里,还有四个提示符变量 PS1-PS4 里,以及在 Readline 配置文件里(用来自定义键盘快捷键)。其中后两者不在本文的讨论范围内,我们只看看前三个命令/...阅读全文
posted @ 2015-09-03 11:47 紫云飞 阅读(188) 评论(0) 编辑
摘要: 原文:http://whereswalden.com/2013/08/12/micro-feature-from-es6-now-in-firefox-aurora-and-nightly-binary-and-octal-numbers/几年前,当SpiderMonkey实现了严格模式的时候.我了解到,严格模式禁用了八进制整数字面量的写法.因为有证据表明,一些新手会利用前导0来对齐多行中的数字,从而导致意想不到的结果:var sum = 015 + // 相当于十进制的13,而不是15 197 + 001; // 反正是1console.log(su...阅读全文
posted @ 2013-08-14 10:20 紫云飞 阅读(1598) 评论(1) 编辑
摘要: 原文:http://fiddler2.com/blog/blog/2013/02/13/understanding-the-request-line最近有一位Fiddler用户问我一个问题:我在使用Fiddler查看HTTP请求的时候发现Raw和HexView两个面板中显示的数据有点小区别,比如当我请求www.microsoft.com时,Raw面板中的数据是这样的: GEThttp://www.microsoft.com/ HTTP/1.1 ... Host: www.microsoft.com而HexView面板中是这样的: GET / HTTP/1.1 ... Host: www.mic阅读全文
posted @ 2013-07-21 13:21 紫云飞 阅读(3814) 评论(1) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/06/javascript-source-transformation-non-destructive-vs-regenerative.html很多的JavaScript工具都需要对JavaScript源码进行转换,包括压缩器(minifier)和转译器(transpiler).这些工具所使用的转换的技术可以分为两种:对源码进行非破坏式的(non-destructive)修改和从语法树完全再生(full regeneration)出新的源码.这两种技术服务于不同的需求,且往往是相辅相成的.无论选择哪种技术,输入的源码都需要先被解阅读全文
posted @ 2013-07-15 11:14 紫云飞 阅读(2430) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/07/es6-and-proxy.html能够拦截在一个对象上的指定操作的能力是非常有用的,尤其是在故障调试的时候.通过ECMAScript 6中的新特性——代理(proxy),这种能力才最终得以实现.在目前最新的ES6规范草案中(2013年5月14日发布,第15次修订版),第15.18小节——代理对象(Proxy Objects)这部分的文档仍然是空的.不过随着规范的日趋稳定,这里会补充上完整的参考文档的.目前,可以在ES wiki上的直接代理(Direct Proxies)页面内找到最详细的资料.在我写这篇文章的时候,只有F阅读全文
posted @ 2013-07-14 10:42 紫云飞 阅读(1304) 评论(0) 编辑