JavaScript表达式与运算符核心指南
JavaScript程序由表达式组成,解释器将其计算为结果。理解表达式的构建与运算符(包括优先级、结合性、短路逻辑及特殊行为)是掌握JS编程的关键。本文将全面梳理各类表达式结构与核心运算规则。
表达式基础与构造
表达式是 JavaScript 中的一个短语,解释器会将其计算出一个结果。最简单的表达式称为“原始表达式”,它们不包含其他表达式。复杂表达式则由简单表达式通过运算符组合而成。
第1步:识别原始表达式
原始表达式是表达式的最小单位,主要包括以下几类:
- 直接量(常量):如数字
1.23、字符串"hello"、正则/pattern/。 - 关键字:
true、false、null、this。this不是常量,其值取决于当前的执行上下文。 - 变量:如
i、sum,返回变量当前持有的值。undefined是一个全局变量,非关键字。
第2步:构建对象与数组初始化表达式
这些表达式用于创建新对象或数组,也称为对象直接量和数组直接量。
- 数组直接量:使用方括号
[],元素间用逗号分隔。若省略中间元素,位置填充为undefined。示例:[1,,,,5]包含4个undefined元素。 - 对象直接量:使用花括号
{},格式为属性名: 值。属性名可以是标识符或字符串(适合保留字或含特殊字符的名称)。示例:var p = {x: 2.1, y: -3}。
第3步:定义函数与访问属性
- 函数表达式:以
function关键字开头,可包含参数和函数体。例如:var square = function(x){ return x*x};。 - 属性访问:有两种方式:
expression.identifier(点符号,适用于合法标识符)和expression[expression](方括号,适用于动态属性名或保留字)。若左侧表达式值为null或undefined,访问属性将抛出 TypeError。
第4步:调用与创建对象
- 调用表达式:函数表达式后跟圆括号,如
f(0)或方法调用a.sort()。若左值为不可调用对象,则报错。 - 对象创建:使用
new关键字调用构造函数,如new Object()。若无参,圆括号可省略。
运算符核心机制
JavaScript 运算符用于操作数据,具有优先级、结合性和操作数数量之分。下表按优先级从高到低排列了主要运算符。
| 运算符 | 操作 | 结合性 | 元数 | 类型 |
|---|---|---|---|---|
| ++, --, -, +, ~, !, delete, typeof, void | 一元运算符 | R | 1 | 见具体类型 |
| , . [] (..) | 成员/索引/逗号 | L | 2 | 高优先级 |
| new | 对象创建 | L | 2+ | obj |
| *, /, % | 乘除取余 | L | 2 | num |
| +, - | 加减/连接 | L | 2 | num/str |
| << >> >>> | 移位 | L | 2 | int |
| <= >= < > | 比较 | L | 2 | bool |
| in instanceof | 属性/类检测 | L | 2 | bool |
| == != === !== | 相等性判断 | L | 2 | bool |
| & ^ | | 按位运算 | L | 2 | int |
| && | 逻辑与 | L | 2 | any |
| || | 逻辑或 | L | 2 | any |
| ? : | 条件 | R | 3 | any |
| = 复合赋值 | 赋值 | R | 2 | any |
关键概念解析
1. 左值(Lvalue):指能出现在赋值运算符左侧的表达式,如变量、对象属性、数组元素。只有少数运算符(如赋值、递增)要求操作数为左值。
2. 优先级与括号:高优先级先执行。例如 w=x+y*z 中乘法先于加法。不确定时可加括号强制顺序,如 (x+y)*z。属性访问 . 和 [] 优先级高于绝大多数运算符。
3. 结合性:
- 左结合(L):从左向右计算,如
x-y-z等同于(x-y)-z。 - 右结合(R):从右向左计算,如
x=y=z等同于x=(y=z),以及一元运算符和三元运算符。
常用运算符详解
算术与类型转换
加法运算符(+):既做数值相加也做字符串连接。规则如下:
- 若任一操作数为对象,先转为原始值(Date 调
toString,其他优先调valueOf)。 - 若转为原始值后其中一个是字符串,另一也转字符串,进行连接。
- 否则,都转为数字进行加法。
注意:运算顺序影响结果,1+2+"bmice" 为 "3 bmice",而 1+(2+"bmice") 为 "12bmice"。
一元运算符:+x 转数字,-x 转数字并取反。++x 和 --x 仅作用于数值,不进行字符串拼接。
相等性比较
- ===(严格相等):不转换类型。NaN 不等于自身;null 等于 undefined;对象需引用同一才相等。
- ==(宽松相等):允许类型转换。null == undefined 为 true;字符串与数字比较时转数字;布尔值转数字(true→1, false→0);对象转原始值后再比较。
关系与逻辑
- 比较运算符(<, > 等):优先转数字比较。若两操作数均为字符串,则按 Unicode 码位比较。
- in 运算符:
"prop" in obj检查属性是否存在(包括继承属性)。 - instanceof 运算符:
obj instanceof Func检查原型链。所有对象都是 Object 实例。 - 逻辑与(&&):支持短路。左值为假值则返回左值,否则返回右值。常用于默认值处理。
- 逻辑或(||):支持短路。左值为真值则返回左值,否则返回右值。常用于备选值选取。
赋值与其他
- 复合赋值:如
a += b等价于a = a + b。区别在于左值只计算一次,避免副作用风险。 - delete 运算符:删除对象属性或数组元素。删除后属性消失(返回 false 表示无法删除如 var 声明的变量),但数组长度不变,留下空洞。
- void 运算符:计算表达式并返回 undefined。常用于链接中防止页面跳转,如
javascript:void(0)。
高级特性:Eval 与作用域
eval() 函数可执行字符串形式的 JavaScript 代码。
- 直接 Eval:直接调用
eval()会在当前词法作用域内执行,可读写局部变量。 - 间接 Eval:通过别名调用(如
var g = eval; g("..."))或在严格模式下,被视为全局代码执行,只能影响全局作用域。
总结
掌握 JavaScript 表达式与运算符的核心在于理解类型转换规则、优先级与结合性。特别是 + 的重载行为、相等性判断的差异以及逻辑运算符的短路机制,是编写健壮代码的基础。建议在实际开发中合理使用括号明确意图,并警惕 eval 的作用域陷阱。
以上就是JavaScript表达式与运算符的详细内容,更多关于JavaScript基础知识资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













