CMAScript描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、 关系操作符和相等操作符。
ECMAScript 操作符能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。在应用于对象时,相应的操作符通常都会调用对象的valueOf()或toString()方法,以便取得可以操作的值。
只能操作一个值的操作符叫做一元操作符
1. 递增和递减操作符
递增和递减操作符直接借鉴自 C,而且各有两个版本:前置型和后置型。前置型应该位于要操作的变量之前,而后置型则应该位于要操作的变量之后。
在使用前置递增操作符给一个数值加 1 时,要把两个加号(++)放在这个数值变量前面:
var age=29;
++age;
同理,前置递减为:
var age=29;
--age;
执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。
var age=29;
var anotherAge=--age + 2;
alert(age); // 输出28
alert(anotherAge); // 输出30
后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过要放在变量的后面而不是前面。 后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求 值之后才执行的。
var age=29;
age++;
把递增操作符放在变量后面并不会改变语句的结果,因为递增是这条语句的唯一操作。但是,当语 句中还包含其他操作时,上述区别就会非常明显了。请看下面的例子:
var num1=2;
var num2=20;
var num3=num1-- + num2; // 等于 22
var num4=num1 + num2; // 等于 21
在应用于不同的值时,递增和递减操作符遵循下列规则:
var s1="2";
var s2="z";
var b=false;
var f=1.1;
var o={
valueOf: function() {
return -1;
}
};
s1++; //值变成数值 3
s2++; //值变成 NaN
b++; //值变成数值 1
f--; //值变成 0.10000000000000009(由于浮点舍入错误所致)
o--; // 值变成数值-2
位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。
对于有符号的整数,32 位中的前 31 位用于表示整数的值。第 32 位用于表示数值的符号:0 表示正 数,1 表示负数。这个表示符号的位叫做符号位,符号位的值决定了其他位数值的格式。其中,正数以 纯二进制格式存储,31 位中的每一位都表示 2 的幂。
1. 按位非(NOT)
按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码
var num1=25;
var num2=-num1 - 1;
alert(num2); // "-26"
按位非操作的本质:操作数的负值减 1
2. 按位与(AND)
按位与操作符由一个和号字符(&)表示,它有两个操作符数。从本质上讲,按位与操作就是将两 个数值的每一位对齐,然后根据下表中的规则,对相同位置上的两个数执行 AND 操作:
第一个数值的位 第二个数值的位 结果
1 1 1
1 0 0
0 1 0
0 0 0
按位与操作只在两个数值的对应位都是 1 时才返回 1,任何一位是 0,结果都是 0。
var result=25 & 3; 6
alert(result); //1
3. 按位或(OR)
按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。按位或操作遵循下面这个真值表。
第一个数值的位 第二个数值的位 结果
1 1 1
1 0 1
0 1 1
0 0 0
按位或操作在有一个位是 1 的情况下就返回 1,而只有在两个位都是 0 的情况下才返回 0。
var result=25 | 3;
alert(result); //27
4. 按位异或(XOR)
按位异或操作符由一个插入符号(^)表示,也有两个操作数。以下是按位异或的真值表
第一个数值的位 第二个数值的位 结 果
1 1 0
1 0 1
0 1 1
0 0 0
按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有一个 1 时才返回 1,如果对 应的两位都是 1 或都是 0,则返回 0。
var result=25 ^ 3;
alert(result); //26
5. 左移
左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。
如果将数值 2(二进制码为 10)向左移动 5 位,结果就是 64(二进制码为 1000000)
var oldValue=2; // 等于二进制的10
var newValue=oldValue << 5; // 等于二进制的1000000,十进制的64
注意,左移不会影响操作数的符号位
6. 有符号的右移
有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即
正负号标记)。有符号的右移操作与左移操作恰好相反,即如果将64向右移动5位,结果将变回 2:
var oldValue=64; // 等于二进制的1000000
var newValue=oldValue >> 5; // 等于二进制的10 ,即十进制的2
同样,在移位过程中,原数值中也会出现空位。只不过这次的空位出现在原数值的左侧、符号位的 右侧。而此时 ECMAScript 会用符号位的值来填充所有空位,以便得到一个完整的值。
7. 无符号右移
无符号右移操作符由 3 个大于号(>>>)表示,这个操作符会将数值的所有 32 位都向右移动。对正 数来说,无符号右移的结果与有符号右移相同。仍以前面有符号右移的代码为例,如果将 64 无符号右移5位,结果仍然还是 2:
var oldValue=64;// 等于二进制的1000000
var newValue=oldValue >>> 5;// 等于二进制的10 ,即十进制的2
但是对负数来说,情况就不一样了。首先,无符号右移是以 0 来填充空位,而不是像有符号右移那 样以符号位的值来填充空位。所以,对正数的无符号右移与有符号右移结果相同,但对负数的结果就不一样了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码。而且,由于负数以其绝对值的二进制补码形式表示,因此就会导致无符号右移后的结果非常之大。
位运算符将其操作数当做32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。
我们主要了解的有七种,分别是:&、|、^、~、<<、>>、>>>。
按位与 & 运算符,对两个 32 位表达式的每一位执行按位与运算。如果a 和 b 都为1 则结果为1,否则结果为0。
示例:
下面演示如何使用& 运算符:
console.log(1 & 3); // 1
1 & 3 的结果为1,1的二进制表示为00000001,3的二进制表示为00000011,根据 & 的规则,相同得1,不同得0,可以得出结果为 00000001,即1。
按位或 | 运算符,只要a 和 b有一个为1,则结果为1,否则结果为0。
示例:
| 运算符和 & 运算符的区别在于,只要有一个操作数为1,结果就为1。同样是1 | 3 ,结果输出为3。
console.log(1 | 3); // 3
1的二进制表示为00000001,3的二进制表示为00000011,根据 | 的规则,得到00000011,转为十进制,结果为3。
按位异或 ^ 运算符,当 a 和 b 不相同时,结果为1,否则结果为0:
示例:
^ 运算符和 | 运算符有点类似,不同在于,如果操作位都为1,则结果为0。
console.log(1 ^ 3); // 2
1的二进制表示为00000001,3的二进制表示为00000011,根据 ^ 的规则,得到00000010,转为十进制,结果为2。
按位非 ~ 运算符,对位求反,将1变0,将0变1,也就是求二进制的反码。
示例:
例如 1的二进制表示为00000001,取反得到11111110,转为十进制,得到-2:
console.log(~1); // -2
console.log(~0); // -1
console.log(~3); // -4
右移 >> 运算符 ,使指定值的二进制所有位都右移规定的次数,对于其移动规则只需记住符号位不变,左边补上符号位即按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
示例:
例如1的二进制为00000001,所以1>>1的结果为1:
console.log(1 >> 1); // 0
console.log(8 >> 2); // 2
console.log(64 >> 2); // 16
console.log(128 >> 1); // 64
左移 << 运算符,使指定值的二进制所有位都左移规定的次数,对于其移动规则只需记住丢弃最高位,0补最低位即按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
示例:
console.log(1 << 1); // 2
console.log(8 << 2); // 32
console.log(64 << 2); // 256
无符号右移 >>>,该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。
示例:
console.log(-5 >>> 1); // 2147483645
console.log(-8 >>> -2); // 8
console.log(-24 >>> 2); // 1073741818
1.分别用七种按位运算符输出一些自定义的内容,然后有一个更进一步的认识与了解。
2.请说出下列代码的输出结果:
用 Vim 时有一个非常重要的一点需要注意,那就是按键的功能取决于编辑器当前的“模式”。 -- Himanshu Arora
本文导航
-基本操作 …… 14%
-方向键 …… 19%
-浏览文档 …… 31%
-插入文本 …… 37%
-特殊插入 …… 42%
-删除文本 …… 46%
-简单替换文本 …… 52%
-复制/粘贴文本 …… 55%
-撤销/重做操作 …… 61%
-搜索和替换 …… 64%
-书签 …… 73%
-选择文本 …… 77%
-改动选中文本 …… 80%
-保存并退出 …… 85%
-下载 Vim 快捷键速查表 …… 92%
编译自: https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/作者: Himanshu Arora
译者: martin2011qi
本文是 Vim 用户指南[1] 系列的其中一篇:
Vim 初学者入门指南[2]
Vim 快捷键速查表
5 个针对有经验用户的 Vim 技巧[3]
3 个针对高级用户的 Vim 编辑器实用技巧[4]
Vim 编辑器是一个基于命令行的工具,是传奇编辑器 vi 的增强版。尽管图形界面的富文本编辑有很多,但是熟悉 Vim 对于每一位 Linux 的使用者都能有所帮助——无论你是经验丰富的系统管理员,还是刚上手树莓派的新手用户。
这个轻量级的编辑器是个非常强大的工具。在有经验的使用者手中,它能完成不可思议的任务。除了常规的文本编辑功能以外,它还支持一些进阶特性。例如,基于正则表达式的搜索和替换、编码转换,以及语法高亮、代码折叠等的编程特性。
使用 Vim 时有一个非常重要的一点需要注意,那就是按键的功能取决于编辑器当前的“模式”。例如,在“普通模式”输入字母j时,光标会向下移动一行。而当你在“插入模式”下输入字符,则只是正常的文字录入。
下面就是速查表,以便于你充分利用 Vim。
快捷键 | 功能 |
---|---|
Esc | 从当前模式转换到“普通模式”。所有的键对应到命令。 |
i | “插入模式”用于插入文字。回归按键的本职工作。 |
: | “命令行模式” Vim 希望你输入类似于保存该文档命令的地方。 |
快捷键 | 功能 |
---|---|
h | 光标向左移动一个字符 |
j 或 Ctrl + J | 光标向下移动一行 |
k 或 Ctrl + P | 光标向上移动一行 |
l | 光标向右移动一个字符 |
0 | (数字 0)移动光标至本行开头 |
$ | 移动光标至本行末尾 |
^ | 移动光标至本行第一个非空字符处 |
w | 向前移动一个词 (上一个字母和数字组成的词之后) |
W | 向前移动一个词 (以空格分隔的词) |
5w | 向前移动五个词 |
b | 向后移动一个词 (下一个字母和数字组成的词之前) |
B | 向后移动一个词 (以空格分隔的词) |
5b | 向后移动五个词 |
G | 移动至文件末尾 |
gg | 移动至文件开头 |
快捷键 | 功能 |
---|---|
( | 跳转到上一句 |
) | 跳转到下一句 |
{ | 跳转到上一段 |
} | 跳转到下一段 |
[[ | 跳转到上一部分 |
]] | 跳转到下一部分 |
[] | 跳转到上一部分的末尾 |
][ | 跳转到上一部分的开头 |
快捷键 | 功能 |
---|---|
a | 在光标后插入文本 |
A | 在行末插入文本 |
i | 在光标前插入文本 |
o | (小写字母 o)在光标下方新开一行 |
O | (大写字母 O)在光标上方新开一行 |
快捷键 | 功能 |
---|---|
:r [filename] | 在光标下方插入文件 [filename] 的内容 |
:r ![command] | 执行命令 [command] ,并将输出插入至光标下方 |
快捷键 | 功能 |
---|---|
x | 删除光标处字符 |
dw | 删除一个词 |
d0 | 删至行首 |
d$ | 删至行末 |
d) | 删至句末 |
dgg | 删至文件开头 |
dG | 删至文件末尾 |
dd | 删除该行 |
3dd | 删除三行 |
快捷键 | 功能 |
---|---|
r{text} | 将光标处的字符替换成 {text} |
R | 进入覆写模式,输入的字符将替换原有的字符 |
快捷键 | 功能 |
---|---|
yy | 复制当前行至存储缓冲区 |
["x]yy | 复制当前行至寄存器 x |
p | 在当前行之后粘贴存储缓冲区中的内容 |
P | 在当前行之前粘贴存储缓冲区中的内容 |
["x]p | 在当前行之后粘贴寄存器 x 中的内容 |
["x]P | 在当前行之前粘贴寄存器 x 中的内容 |
快捷键 | 功能 |
---|---|
u | 撤销最后的操作 |
Ctrl+r | 重做最后撤销的操作 |
快捷键 | 功能 |
---|---|
/search_text | 检索文档,在文档后面的部分搜索 search_text |
?search_text | 检索文档,在文档前面的部分搜索 search_text |
n | 移动到后一个检索结果 |
N | 移动到前一个检索结果 |
:%s/original/replacement | 检索第一个 “original” 字符串并将其替换成 “replacement” |
:%s/original/replacement/g | 检索并将所有的 “original” 替换为 “replacement” |
:%s/original/replacement/gc | 检索出所有的 “original” 字符串,但在替换成 “replacement” 前,先询问是否替换 |
快捷键 | 功能 |
---|---|
m {a-zA-Z} | 在当前光标位置设置书签,书签名可用一个大小写字母({a-zA-Z}) |
:marks | 列出所有书签 |
{a-zA-Z} | 跳转到书签 {a-zA-Z} |
快捷键 | 功能 |
---|---|
v | 进入逐字可视模式 |
V | 进入逐行可视模式 |
Esc | 退出可视模式 |
快捷键 | 功能 |
---|---|
~ | 切换大小写 |
d | 删除一个词 |
c | 变更 |
y | 复制 |
> | 右移 |
< | 左移 |
! | 通过外部命令进行过滤 |
快捷键 | 功能 |
---|---|
:q | 退出 Vim,如果文件已被修改,将退出失败 |
:w | 保存文件 |
:w new_name | 用 new_name 作为文件名保存文件 |
:wq | 保存文件并退出 Vim |
:q! | 退出 Vim,不保存文件改动 |
ZZ | 退出 Vim,如果文件被改动过,保存改动内容 |
ZQ | 与 :q! 相同,退出 Vim,不保存文件改动 |
仅仅是这样是否还不足以满足你?别担心,我们已经为你整理好了一份下载版的速查表,以备不时之需。
点此下载(英文):http://www.maketecheasier.com/cheatsheet/vim-keyboard-shortcuts-cheatsheet/
via: https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/
作者:Himanshu Arora[6] 译者:martin2011qi 校对:wxy
本文由 LCTT[7] 原创编译,Linux中国 荣誉推出
[1]: https://www.maketecheasier.com/series/vim-user-guide/
[2]: https://linux.cn/article-8143-1.html
[3]: https://www.maketecheasier.com/vim-tips-tricks-for-experienced-users/
[4]: https://www.maketecheasier.com/vim-tips-tricks-advanced-users/
[5]: http://www.maketecheasier.com/cheatsheet/vim-keyboard-shortcuts-cheatsheet/
[6]: https://www.maketecheasier.com/author/himanshu/
[7]: https://github.com/LCTT/TranslateProject
*请认真填写需求信息,我们会在24小时内与您取得联系。