JavaScript表达式与运算符核心指南

Owen
Owen
发布时间:2026-10-15| 6人浏览过
原创

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一元运算符R1见具体类型
, . [] (..)成员/索引/逗号L2高优先级
new对象创建L2+obj
*, /, %乘除取余L2num
+, -加减/连接L2num/str
<< >> >>>移位L2int
<= >= < >比较L2bool
in instanceof属性/类检测L2bool
== != === !==相等性判断L2bool
& ^ |按位运算L2int
&&逻辑与L2any
||逻辑或L2any
? :条件R3any
= 复合赋值赋值R2any

关键概念解析

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),以及一元运算符和三元运算符。

常用运算符详解

算术与类型转换

加法运算符(+):既做数值相加也做字符串连接。规则如下:

  1. 若任一操作数为对象,先转为原始值(Date 调 toString,其他优先调 valueOf)。
  2. 若转为原始值后其中一个是字符串,另一也转字符串,进行连接。
  3. 否则,都转为数字进行加法。

注意:运算顺序影响结果,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基础知识资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。