探索语句和表达式的本质

语句与表达式的基本定义

语句 指构成语言的基本单位,按照一定的语法规则组织,具有完整的意义。

表达式 在数学领域中是一些符号依据上下文的规则,有限而定义良好的组合

比如数学中的加减乘除就是数学符号。

数学领域的符号是指:可用于标定数字(常量)、变量、操作、函数、括号、标点符号和分组,帮助确定操作顺序以及有其它考量的逻辑语法。

等式 是将两个表达式用等于符号连起来,就构成了等式,例如 6-2=4,即6-2与4是相等的。

比如,在1 + 1 = 2这个等式中,1 + 1是表达式,2也是表达式。但如果数字2如果单独存在,则不能称之为表达式,它只是一个数学符号;同样+2-2也不是表达式,表达式需具有一个运算或赋值的过程。

——以上探讨基于维基百科


程序中运算符与表达式

程序运算符是构成表达式的基本单位,当“值、变量、常量与运算符依据规则进行组合时,就构成了表达式”。

程序运算符在不同语言中有不同的定义。在这里列举一下javajavascript运算符的共同点:

  1. 算术运算符:+, -, *, /, %, ++, --
  2. 关系运算符:==, !=, >, <, >=, <=
  3. 位运算符:&, |, ^, 〜, <<, >>, >>>
  4. 逻辑运算符:&&, ||, !
  5. 赋值运算符:=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=
  6. instanceof运算符

程序中的表达式与语句

现在来看一个程序代码:

let addUp = 1 + 1;

在这个例子中— —

  • let 是一个声明,用于声明addUp这个变量。
  • 1 + 1 是表达式,它有一个值2
  • =赋值运算符,将1 + 1的值赋给变量。

这些规则构成了一个声明赋值语句,于是我们可以这样解读这个语句:

let  addUp     =      1 + 1;
声明  变量  赋值运算符  表达式;

这里的let是程序定义的声明语句,而addUp = 2是由变量与数字使用=组成的表达式;语句和表达式组合,就变成了一个语句

在程序中=是赋值语句,而等式应该是双等于号==

因此let addUp = 1 + 1不是等式。如果let addUp = 1 + 1是一个等式,那么1 + 1 = let addUp也应该成立,但很可惜1 + 1 = let addUp在程序中是错误的。

let addUp = 1 + 1若使用双等于描写应该分离语句和表达式:

// 声明语句
let addUp;
// 赋值表达式
addUp = 2;
// 等式表达式
addUp == 1 + 1;
// 等式反过来同样成立
1 + 1 == addUp;

值得一提的是,如果表达式按照程序语言的语法规则组织,作为构成一个程序的基本单位时,它也是一个语句。因此,当表达式是一个程序中的组成部分时,表达式也是语句

函数表达式

这里需要说一下javascript中的函数表达式,依据函数式编程的规则,函数可以为变量赋值,那么函数在某些情况下也可以看做表达式,叫做“函数表达式”:

// 声明语句
let addUp
// 等号左边的是声明的变量
// 等号自身是“赋值语句”
// 右边是将函数声明语句当做“函数表达式”
addUp = function () {
  return 1 + 1
}
// 将函数表达式看做一个整体,然后组成等式
;(function () {
  return 1 + 1
}) == false
// 上面这个也相当于
addUp == false

容易混淆的知识点

赋值语句不能作为表达式看待

注意赋值语句不能作为表达式看待,因为赋值语句仅仅是将自己的值付给别人,造成了语句有值的假象:

const cache = addUp = function () {
  return 1 + 1
}

这句话可拆分为:

let addUp
addUp = function () {
  return 1 + 1
}
const cache = addUp
运行语句不能作为表达式看待

如果一个方法或函数等子程序的运行结果是一个值,程序会将结果值做为表达式的组成部分:

function addUp(a, b) {
  return a + b;
}
addUp(1, 1) == 2;

addUp(1, 1)这类子程序调用是一个语句,当语句的运行结果是值时,会将这个值作为表达式的组成部分(而非将语句作为组成部分,虽然它看起来像)。

结论

综合这篇文章来看,表达式在程序领域中是变量、常量、数字、字符、运算符以及有返回值的子程序之间依据上下文的规则,有限而定义良好的组合。

一个设想

如果我们使用-><-来代替赋值语句,将=解放给等式,不再使用==,那么程序中的一些概念应该更为直观一点:

// 赋值语句:右表达式赋值给左变量
let addUp <- 1 + 1
// 赋值语句:左自然数赋值给右变量
2 -> let two
// 表达式:变量two等于addUp
two = addUp
// 产生true

本文中所有的探索和设想是依照笔者已知的知识构建而成,它不一定对,还请以批判的观点看待这篇文章。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值