本文来自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把命令式语句转换为表达式相关推荐

  1. 代码之谜(二)- 语句与表达式

    虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值.在此之外,也会继续表述这个『代码之谜』系列的主题--数学与计算机之间被经常忽略的矛盾. 简单的讲 "表达 ...

  2. 小白必看!JS中循环语句大集合

    摘要:JavaScript中,一共给开发者提供了一下几种循环语句,分别是while循环,do-while循环,for循环,for Each,for-in循环和for-of循环. 本文分享自华为云社区& ...

  3. JS中for语句的循环的嵌套

    今天说一下JS中for语句的循环嵌套. for语句是JS中十分重要的循环语法. for(表达式1;表达式2;表达式3){for(表达式4;表达式5;表达式6){执行语句块儿}} 这是嵌套写法的基本结构 ...

  4. js中switch语句的参数问题

    js中switch语句是可以使用变量,表达式,字符串,布尔值等来作为参数的! 例如: <!DOCTYPE html> <html lang="en"> &l ...

  5. “输入字符不是 MATLAB 语句或表达式中的有效字符”的解决办法

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 问题描述: 输入字符不是 MATLAB 语句或表达式中的有效字符 原因分析: 标点符号:采用了中文的标点符号 解决方案: ...

  6. Oracle的CASE语句和表达式

    http://space.itpub.net/15203236/viewspace-534849 Oracle的CASE语句和表达式 上一篇 /下一篇  2009-01-09 23:19:46 / 天 ...

  7. nashorn预编译_Java 8:在新的Nashorn JS引擎中编译Lambda表达式

    nashorn预编译 在最近的一篇文章中,我了解了Java 8和Scala如何实现Lambda表达式. 众所周知,Java 8不仅引入了对Javac编译器的改进,而且还引入了全新的解决方案-Nasho ...

  8. Java 8:在新的Nashorn JS引擎中编译Lambda表达式

    在最近的一篇文章中,我了解了Java 8和Scala如何实现Lambda表达式. 众所周知,Java 8不仅引入了对Javac编译器的改进,而且还引入了全新的解决方案-Nashorn. 这个新引擎旨在 ...

  9. [js] 使用for-in语句能保证遍历对象的顺序吗?如果不能那为什么?如果可以那又如何保证?

    [js] 使用for-in语句能保证遍历对象的顺序吗?如果不能那为什么?如果可以那又如何保证? Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版规范. ...

最新文章

  1. 在云中进行灾难恢复的五种有效方式
  2. asp.net .ashx文件使用server.mappath解决方法
  3. eclipse添加缺失的包/src/main/resource
  4. 【三种可能问题】RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED
  5. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
  6. 【Tools】Visual Studio 2010下载和安装
  7. Frida 基础操作2
  8. ios修改了coredata数据结构后,更新安装会闪退
  9. .NET中的内存管理
  10. AT3857-[AGC020C]Median Sum【背包,bitset】
  11. Linux 中vim编辑器学习笔记
  12. python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法
  13. Android 之 下拉框(Spinner)的使用
  14. unity api中文手册_unity 中文API之Display
  15. Q学习(Q learning) 强化学习的简单例子 Matlab实现 可视化
  16. RISC-V 之一 使用 ARM CMSIS 的 SVD 文件辅助调试
  17. oppo手机解锁_oppo手机密码解锁大全【图文】
  18. python爬取豆瓣电影并分析_Python爬虫入门 | 2 爬取豆瓣电影信息
  19. 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
  20. IE地址栏的最大长度

热门文章

  1. JAVA Native Method 转自CSDN
  2. Java 类型, Hibernate 映射类型及 SQL 类型之间的相应关系
  3. 加载gif图片的方法:(需要SDWebImage方法)
  4. 兼容谷歌的光标居中写法
  5. Ubuntu14.04如何备份和恢复系统
  6. 第一章练习题三级菜单
  7. 【BZOJ3132】【TYVJ1716】上帝造题的七分钟 二维树状数组
  8. CF540 B 贪心
  9. Maven学习笔记5:Maven属性、profile和资源过滤
  10. 单张图片上传预览【超简洁,未完待续】