JS把命令式语句转换为表达式
本文来自CCTV5直播【www.cctv5zb.net】:原文地址 www.cctv5zb.net/Article/198131.html 转载注明来源
js教程在表达式运算中,求值是运算的核心。由于运算只产生值,因此可以把所有命令式语句都转换为表达式,并进行求值。
把命令转换为表达式,循环和分支中的一些字句可以弃用,如 break、continue,以及标签语句等。变量声明语句不需要了,只需要值声明和函数内的 return 子句,其他命令都可以省略。
示例1
使用条件运算符或逻辑运算符,可以把分支结构转换为表达式。
var a = ((a == 1) && console.log(1) ||(a == 2) && console.log(2) ||(a == 3) && console.log(3) ||(a == 4) && console.log(4) ||console.log(undefined) );
上面代码主要利用逻辑运算符&&
和||
来执行连续运算。对于逻辑与运算来说,如果运算符左侧的操作数为 true,才会执行右侧的操作数,否则忽略右侧的操作数;而对于逻辑或运算来说,如果运算符左侧的操作数为 false,才会执行右侧的操作数,否侧忽略右侧的操作数。
逻辑与和逻辑或的组合使用可以模拟条件运算符的运算功能。这也说明 JavaScript 逻辑运算符并非是为了布尔计算来设计的,它实际上是分支结构的一种表达式化。
示例2
使用递归运算可以把循环结构转换为表达式。
for(var i = 1;i < 100;i++){console.log(i); //可执行命令 }
使用递归函数进行设计
var i = 1; (function() {console.log(i);(++i < 100) && arguments.callee(); }) ()
使用嵌套函数进一步封装。
(function () {var i = 1;return function (){console.log(i);(++i < 100) && arguments.callee();} })() ()
函数递归运算需要为每次函数调用保留私有空间,因此会消耗大量的系统资源。不过使用尾递归可以避免此类问题。
函数也可以作为表达式的操作数,具有值得含义。不管函数内部结构多么复杂,最终返回的只是一个值,因此可以在函数内封装复杂的逻辑。
例如,在函数中包含循环语句来执行高效运算,这样就间接的实现了把语句作为表达式的一部分投入连续运算中。在特殊环境下只能使用表达式运算,如浏览器地址栏内仅能够运行表达式代码等。
示例3
下面示例是一个连续运算的表达式,该表达式是一个分支结构,并在分支结构中包含函数体,用以判断两种表达式的大小并输出提示信息。整个代码以表达式的形式运算,与命令式语言风格迥然不同。
((function f(x,y) {return (x+y) * (x+y); }) (25,36) > (function f(x,y) {return x * x + y * y; }) (25,36)) ? console.log("(x+y) ^ 2") : console.log("x ^ 2 + y ^ 2") //返回提示信息“x+y ^ 2”
示例4
下面示例使用函数封装复杂的循环结构,然后直接参与到表达式运算。
console.log((function(x,y)) {var c = 0,a = []for(var i = 0;i < x;i++){for(var j = 0;j < y;j++) {a[c] = i.toString() + j.toString();document.write(++c + "");}document.write("<br />");}return a; } )(10,10));
上面代码把两个嵌套的循环结构封装在函数体内,从而实现连续求值的目的。因此,使用连续运算的表达式可以设计足够复杂的逻辑。
类似下面这种复杂的表达式也存在一定的风险,不容易阅读,也不容易调试。
console.log((function (x,y) {var c = 0,a = [];for(var i = 0;i < x;i++) {for(var j = 0;j < y;j++) {a[c] = i.toString() + j.toString();document.write (++c + "");}document.write ("<br />");}return a;}) (10,10));
应该养成良好的编码习惯,设计良好的结构可以降低代码难度。对于长表达式,应该对其进行格式化。从语义上分析,函数的调用过程实际上就是表达式运算中求值的过程。从这一点来看,在函数式编程中,函数是一种高效的连续运算的工具。例如,对于循环结构来说,使用递归运算会存在系统损耗,但是如果把循环语句封装在函数结构中,然后把函数作为值参与表达式的运算,实际上也是高效实现循环结构的表达式化。
关于更多js教程内容,可以收藏本网页。
体育直播吧是中国知名的体育门户网站
JS把命令式语句转换为表达式相关推荐
- 代码之谜(二)- 语句与表达式
虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值.在此之外,也会继续表述这个『代码之谜』系列的主题--数学与计算机之间被经常忽略的矛盾. 简单的讲 "表达 ...
- 小白必看!JS中循环语句大集合
摘要:JavaScript中,一共给开发者提供了一下几种循环语句,分别是while循环,do-while循环,for循环,for Each,for-in循环和for-of循环. 本文分享自华为云社区& ...
- JS中for语句的循环的嵌套
今天说一下JS中for语句的循环嵌套. for语句是JS中十分重要的循环语法. for(表达式1;表达式2;表达式3){for(表达式4;表达式5;表达式6){执行语句块儿}} 这是嵌套写法的基本结构 ...
- js中switch语句的参数问题
js中switch语句是可以使用变量,表达式,字符串,布尔值等来作为参数的! 例如: <!DOCTYPE html> <html lang="en"> &l ...
- “输入字符不是 MATLAB 语句或表达式中的有效字符”的解决办法
写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 问题描述: 输入字符不是 MATLAB 语句或表达式中的有效字符 原因分析: 标点符号:采用了中文的标点符号 解决方案: ...
- Oracle的CASE语句和表达式
http://space.itpub.net/15203236/viewspace-534849 Oracle的CASE语句和表达式 上一篇 /下一篇 2009-01-09 23:19:46 / 天 ...
- nashorn预编译_Java 8:在新的Nashorn JS引擎中编译Lambda表达式
nashorn预编译 在最近的一篇文章中,我了解了Java 8和Scala如何实现Lambda表达式. 众所周知,Java 8不仅引入了对Javac编译器的改进,而且还引入了全新的解决方案-Nasho ...
- Java 8:在新的Nashorn JS引擎中编译Lambda表达式
在最近的一篇文章中,我了解了Java 8和Scala如何实现Lambda表达式. 众所周知,Java 8不仅引入了对Javac编译器的改进,而且还引入了全新的解决方案-Nashorn. 这个新引擎旨在 ...
- [js] 使用for-in语句能保证遍历对象的顺序吗?如果不能那为什么?如果可以那又如何保证?
[js] 使用for-in语句能保证遍历对象的顺序吗?如果不能那为什么?如果可以那又如何保证? Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版规范. ...
最新文章
- 在云中进行灾难恢复的五种有效方式
- asp.net .ashx文件使用server.mappath解决方法
- eclipse添加缺失的包/src/main/resource
- 【三种可能问题】RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
- 【Tools】Visual Studio 2010下载和安装
- Frida 基础操作2
- ios修改了coredata数据结构后,更新安装会闪退
- .NET中的内存管理
- AT3857-[AGC020C]Median Sum【背包,bitset】
- Linux 中vim编辑器学习笔记
- python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法
- Android 之 下拉框(Spinner)的使用
- unity api中文手册_unity 中文API之Display
- Q学习(Q learning) 强化学习的简单例子 Matlab实现 可视化
- RISC-V 之一 使用 ARM CMSIS 的 SVD 文件辅助调试
- oppo手机解锁_oppo手机密码解锁大全【图文】
- python爬取豆瓣电影并分析_Python爬虫入门 | 2 爬取豆瓣电影信息
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
- IE地址栏的最大长度