聊聊JavaScript和Scala的表达式 Expression

简介: 聊聊JavaScript和Scala的表达式 Expression

我们先看下面这段简单的JavaScript代码。


我在第10行调用了函数f,其中传入的第二个和第三个参数都是一个逗号表达式。


函数f的实现,会检查这两个参数的类型,如果是函数,则执行函数调用,再打印其返回值,否则直接打印传入的表达式的值。


image.png


执行上面这段代码,打印输出如下:


image.png


我们可以看出,虽然传入的第一个参数为true,导致函数f内部只会打印第二个参数y代表的表达式的值,5,但是第三个参数代表的表达式在函数f调用时,也进行了表达式求值,所以最后console也输出了Big calculation2。


如果我们想实现所谓的“惰性求值”,有时候也称”惰性计算“,那么只需要将原本写在表达式位置的逻辑用一个JavaScript函数包裹起来,如下:



image.png

再次调用f,此时传入的参数y和z的类型为函数,因此在f进行调用时,同之前传入的表达式不同,这里并不会即时调用y和z代表的函数。打印输出:


image.png


我们再来看看Scala关于表达式的处理是否和JavaScript一致。


Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。


Scala 运行在Java虚拟机上,并兼容现有的Java程序。


Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。


image.png


下图第5行和第12行我分别定义了两个Scala函数exp_test1和exp_test2, 逻辑和之前的JavaScript函数f类似。


exp_test1接受的第二个和第三个参数类型为exp1 :=> Unit,意思是需要传入一个表达式,这个表达式的返回类型是Unit。


exp_test2接收的第二个和第三个参数类型为exp1() :=> Unit,意思是需要传入一个函数,这个函数没有任何输入参数,函数的返回类型是Unit。


image.png


第19行到第25行是对这两个函数的各种测试,打印输出:


image.png


可以看到,即使传入两个函数exp_test1和exp_test2的第二个和第三个参数都是表达式,Scala也能做到对表达式的惰性求值:


第19行和第20行的函数调用,第三个参数位置的表达式和函数都没有即时求值,而是惰性求值。


第22行和第23行的函数调用,第二个参数位置的表达式和函数都没有即时求值,而是惰性求值。


这个小例子说明了不同的编程语言,对于函数调用的表达式求值方式可能采取了不同的实现:惰性求值或者即时求值。

image.png

相关文章
|
5月前
|
JavaScript 前端开发
JavaScript中的短路表达式
JavaScript中的短路表达式
41 0
|
5月前
|
JavaScript 前端开发 开发者
从0开始学习JavaScript--JavaScript 表达式与运算符
JavaScript中的表达式和运算符是构建逻辑、进行计算的基础。本文将深入研究JavaScript中各类表达式,包括算术表达式、关系表达式、逻辑表达式,以及运算符的使用方法,并通过丰富的示例代码来帮助读者更全面地了解和运用这些概念。
|
5月前
|
JavaScript 前端开发
JavaScript 什么是三元表达式?
JavaScript 什么是三元表达式?
|
16天前
|
JavaScript
js---三元表达式详解
js---三元表达式详解
37 0
|
2月前
|
JavaScript 前端开发
JavaScript基础&实战 JS中正则表达式的使用
这篇文章介绍了JavaScript中正则表达式的使用,包括正则表达式的创建、匹配模式、字符串匹配、拆分、搜索、匹配和替换等方法,并通过示例代码展示了如何应用这些技术。
JavaScript基础&实战 JS中正则表达式的使用
|
2月前
|
JavaScript 前端开发
在js中正则表达式验证小时分钟,将输入的字符串转换为对应的小时和分钟
这篇文章介绍了如何在JavaScript中使用正则表达式来验证时间字符串的格式(小时和分钟),并提供了将时间字符串转换为JavaScript Date对象的示例代码及其测试结果。
|
2月前
|
JavaScript 前端开发 API
vue中将验证表单输入框的方法写在一个js文件中(表达式验证邮箱、身份证、号码、两次输入的密码是否一致)
这篇文章介绍了如何在Vue框架中将表单输入验证逻辑封装到一个JavaScript文件中,并通过正则表达式验证邮箱、身份证、手机号等信息,同时确保两次密码输入的一致性。
|
5月前
|
JavaScript 前端开发
JavaScript中的短路表达式
JavaScript中的短路表达式
29 1
|
12月前
|
JavaScript 前端开发
12Vue - 模板语法(插值-使用JavaScript表达式)
12Vue - 模板语法(插值-使用JavaScript表达式)
213 0
|
5月前
|
JavaScript 前端开发 数据可视化
JavaScript 什么是三元表达式?
JavaScript 什么是三元表达式?
67 1