JavaScript 基础入门:深入理解 ECMAScript 核心运算符
在 JavaScript 开发中,运算符是构建逻辑的基础。本文将系统梳理 ECMAScript 中的一元运算符、位运算和布尔运算符,包括 delete、void、逻辑短路等关键特性,通过代码示例展示其实际行为与边界条件。
一元运算符的操作机制
一元运算符仅针对一个操作数进行运算。在 JavaScript 中,常见的类型转换与内存管理运算符包括 delete、void 以及自增自减操作。
第1步:使用 delete 移除对象属性
delete 运算符用于删除对象中以前定义的属性或方法引用,但无法删除由浏览器内置或语言规范定义的不可配置属性。
var o = new Object;
o.name = "Nicholas";
o.show = function(){
return "test";
};
console.log(o.name); // outputs Nicholas
console.log(o.show()); // outputs test
delete o.name;
delete o.show;
console.log(o.name); // outputs undefined
// console.log(o.show()); // TypeError: o.show is not a function
delete o.toString;
console.log(o.toString()); // outputs [object Object] (内部属性未被删除)
第2步:使用 void 避免链接默认行为
void 运算符对任何值都返回 undefined。它常配合 javascript: URI 协议使用,防止链接点击后页面跳转或输出意外内容。
<a href="javascript:void(window.open('about:blank'))">Click Me</a>
第3步:执行前/后自增与自减
自增 (++) 和自减 (--) 分为前缀和后缀形式。前缀式先增值后参与表达式计算;后缀式先参与计算,后增值。
// 前增量/减量
var iNum = 10;
console.log(++iNum); // outputs 11 (等同于 iNum = iNum + 1)
console.log(iNum); // outputs 11
console.log(--iNum); // outputs 10
// 后增量/减量:先取值计算,后改变变量值
var num = 10;
console.log(num--); // outputs 9 (此时 num 变为 9)
console.log(num); // outputs 9
第4步:利用一元正负号进行类型转换
一元加号 (+) 可将字符串转换为数字,类似于 parseInt() 或 Number(),但对以 "0x" 开头的字符串自动识别为十六进制。一元减号 (-) 则用于求负并触发类型转换。
var sNum = "50";
console.log(typeof sNum); // outputs string
console.log(+sNum); // outputs 50 (number)
var hexStr = "0xB";
console.log(-hexStr); // outputs -11 (识别为十六进制)
var octStr = "017";
console.log(-octStr); // outputs -17 (注意:ES5之后严格模式可能报错,通常按十进制处理需留意)
位运算的二进制处理规则
位运算符直接在数值的 32 位二进制形式上进行操作,适用于底层的位掩码处理及性能优化的场景。
第1步:执行按位 NOT (~) 运算
~ 运算符将数字转为 32 位二进制,取反后再转回浮点数。实质上等效于:-N - 1。
var iNum = 25; // 00...00011001
var result = ~iNum; // 11...11100110
console.log(result); // outputs -26 (等同于 -(25) - 1)
第2步:执行按位 AND (&)、OR (|) 和 XOR (^)
- AND (&):两位均为 1 时结果为 1。
- OR (|):一位为 1 结果即为 1。
- XOR (^):只有一位为 1 时结果为 1。
var n1 = 25; // 00...00011001
var n2 = 3; // 00...00000011
console.log(n1 & n2); // outputs 1 (仅最低位同为1)
console.log(n1 | n2);
console.log(n1 ^ n2); // outputs 26 (差异位被标记)
第3步:使用移位运算符调整数值
- 左移 (< < < code>):左侧丢弃,右侧补 0。相当于乘以 2 的幂。
- 有符号右移 (> >):右侧丢弃,左侧补符号位。相当于除以 2 的幂。
- 无符号右移 (> > >):右侧丢弃,左侧补 0。始终返回非负数。
console.log(2 << 5); // outputs 64 (2 * 2^5)
console.log(64 >> 5); // outputs 2 (64 / 2^5)
// 无符号右移处理负数
var neg = -2;
console.log(neg >>> 1); // outputs 2147483647
// 解释:-2 的补码右移后,符号位变为 0,成为极大的正整数
布尔运算符与短路求值
逻辑运算符不仅用于判断真假,还涉及具体的返回值确定,且具备“短路”特性。
第1步:使用逻辑 NOT (!) 强制布尔化
! 将操作数转换为布尔值并取反。记住以下真理表:
- 对象 → false
- 0、NaN、null、undefined → true
- 非 0 数字 → false
第2步:应用逻辑 AND (&&) 实现短路保护
&& 只要第一个操作数为假(falsy),就停止计算并直接返回该值。
var bFalse = false;
var res = bFalse && someVar; // 不会触发 ReferenceError,res 为 false
var bTrue = true;
// var res2 = bTrue && someUndefinedVar;
// 若启用此行,会抛出 ReferenceError
第3步:应用逻辑 OR (||) 提供默认值
|| 只要第一个操作数为真(truthy),就立即返回该值。
var bTrue = true;
var res = bTrue || riskyCalc(); // riskyCalc 不会被执行,返回 true
乘性与取模运算符的边界值
乘法 (*)、除法 (/) 和取模 (%) 在处理特殊数值时需格外注意。
- Infinity 与 NaN:Infinity * 0 结果为
NaN;Infinity / Infinity 结果为NaN。 - 0 除以一个非无穷大数字:结果为
NaN(注:标准 JS 中 0/x = 0,x/0 = Infinity,此处原文可能有误,常规标准下 0/5=0, 5/0=Infinity。但若原文指代特定环境或旧规范需注意,一般遵循 IEEE 754:0.0/5.0 = 0.0, 5.0/0.0 = Infinity)。
上述关于 JavaScript 运算符的详细解析涵盖了从基础语法到底层原理的关键点。以上就是 JavaScript 运算符的核心知识,更多关于前端基础的知识请继续关注我们!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









