浅谈JS中逗号运算符的用法


Posted in Javascript onJune 12, 2016

注意:

一、由于目前正在功读JavaScript技术,所以这里拿JavaScript为例。你可以自己在PHP中试试。

二、JavaScript语法比较复杂,因此拿JavaScript做举例。

最近重新阅读JavaScript权威指南这本书,应该说很认真的阅读,于是便想把所学的东西多记录下来。后

面本人将逐步写上更多关于本书的文章。

本文的理论知识来自于JavaScript权威指南,我这里做一下整理,或者说叫笔记。

如果你的基础够好的话,完全理解不成问题,但是如果读得有些郁闷的话,可以加我的QQ:76863715

阅读本文的前提是,你能区分什么是表达式,什么是语句。还有明确运算符和运算数多是些啥东西。所

谓的表达式就是—— 一个JavaScript的“短语“,JavaScript的解释器可以计算它,从而生成一个值。表达式可

以分为以下三种:

1)直接量,如1.7是数字直接量、"JavaScript权威指南"是一个字符串直接量等。

2) 变量

直接量表达式的值就是这个直接量本身,变量表达式的值则是该变量所存放或引用的值。

3) 可以“合并”上面提到的“简单”表达式来创建为比较复杂的表达式。例如1.7是表达式,i也是表达式,下面的代码所示的同样也是(也可以叫)表达式:

i + 1.7

上面这个表达式的值是两个简单表达式(一个变量表达式和一个简单表达式)的和。在此例中,“+”是一个运算符,用于将两个简单表达式合并起来以组成一个复杂的表达式。

运算数的个数

可 以根据运算符需要的运算数的个数对运算符进行分类,大多数运算符都是二元运算符,它们把两个“表达式”合并成一个复杂的表达式。简而言之,就是它有两个运 算数。此外,JavaScript还支持大量的一元运算符,它能将一个表达式转换成另一个更复杂的表达式。如表达式-3中,运算符“-”就是一元运算符, 它执行操作是对运算数取反。

JavaScript还支持三元操作符“?:”,它可以将三个表达式合并为一个复杂的表达式。

OK,下面开始讲解逗号运算符。

逗号运算符,它将先计算左边的参数,再计算右边的参数值。然后返回最右边参数的值。

原书举的例子不太好,无法解释上面那句话,这里另外提供一个:

<script>
var a = 10, b = 20;

function CommaTest(){
return a++, b++, 10;
}

var c = CommaTest();

alert(a); // 返回11
alert(b); // 返回21
alert(c); // 返回10

</script>

变量c的值是函数CommaTest返回的值,而a和b多加1了。

逗号运算符和函数调用运算符的冲突

在JavaScript中,函数调用确实是函数调用运算符。它很特殊,因为其它编程语言资料中多从来没有这个叫法的。然后,(才是)它没有固定数目的运算数。

函数调用运算符的第一个参数是一个函数名或者是一个引用函数的表达式,其后是括号()。括号中间可以是数目不定的运算符,这些运算数可以是任意的表达式,它们之间用逗号隔开。

函数调用运算符将计算它的每一个运算数,第一个运算数指定为函数名(括号前),而括号中间的所有运算数的值将传递给这个函数作为函数的参数。

例如:

document.close()
Math.sin(x)
alert("Welcome " + name)
Date.UTC(2000, 11, 31, 23, 59, 59)
funcs.f(funcs.args[0], funcs.args[1])

知道了调用函数运算符后,我们举个例子说明关于如何处理它们冲突的事。

<script>
alert(2*5, 2*4); // 输出10
</script>

上面这段代码输出10,但是如果根据逗号运算符的原理来解释的话,那应该是输出8才对。为什么呢?

因为逗号运算符在JavaScript在的优先级是最底的,记住这一点非常有用。所以函数调用运算符将先于逗号运算符运行。结果alert函数输出第一个参数的值。将上面的代码修改成如下所示即可。

<script>
alert((2*5, 2*4)); // 返回8
</script>

逗号运算符和赋值运算赋的冲突

在JavaScript中,逗号运算符的优先级比赋值运算符还要底。请看下面的代码。

<script>
var a = 20;
var b = ++a,10;
alert(b);
</script>

这段代码似乎不能运行,可能是由于赋值运算符优先于逗号表达式运行,如果将代码改成

<script>
var a = 20;
var b = (++a,10);
alert(b);
</script>

即可了。

上面说到的“可能”我们这里做一下解释,这是本人的一些看法,不一定权威。

逗号运算符要求它的运算数是一个复杂的表达式或简单的表达式(如变量或直接量),但由于赋值运算符优先于逗号运算符执行,因此变成左边不是一个运算数或一个表达式,而是一个含有var关键字的语句

之前不能执行的代码可以看成如下代码:

<script>
var a = 20;
(var b = ++a),10;
alert(b);
</script>

语句中有表达式语句,但不是所有的语句都是表达式。

#################################################

一、逗号运算符的特性及作用

逗号运算符的作用是将若干表达式连接起来。它的优先级别在所有运算符中是最低的,结合方向是"自左至右"的。

如:3*3,4*4

二、逗号表达式

逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n

逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。

看下面几个例子:

x=8*2,x*4 /*整个表达式的值为64,x的值为16*/

(x=8*2,x*4),x*2 /*整个表达式的值为128,x的值为16*/

x=(z=5,5*2) /*整个表达式为赋值表达式,它的值为10,z的值为5*/

x=z=5,5*2 /*整个表达式为逗号表达式,它的值为10,x和z的值都为5*/

逗号表达式用的地方不太多,一般情况是在给循环变量赋初值时才用得到。所以程序中并不是所有的逗号都要看成逗号运算符,尤其是在函数调用时,各个参数是用逗号隔开的,这时逗号就不是逗号运算符。

如:printf(" %d,%d,%d",x,y,z);

###################################################

运算符使它两边的表达式以从左到右的顺序被执行,并获得右边表达式的值。, 运算符最普通的用途是在 for 循环的递增表达式中使用。例如:

for (i = 0; i < 10; i++, j++)
{
k = i + j;
}

每次通过循环的末端时, for 语句只允许单个表达式被执行。, 运算符被用来允许多个表达式被当作单个表达式,从而规避该限制。

以上这篇浅谈JS中逗号运算符的用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js判断用户浏览器是否是XP SP2的IE6
Mar 08 Javascript
JavaScript 事件对象的实现
Jul 13 Javascript
JQuery设置文本框和密码框得到焦点时的样式
Aug 30 Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
js操作滚动条事件实例
Jan 29 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
Vue中render方法的使用详解
Jan 26 Javascript
p5.js入门教程之小球动画示例代码
Mar 15 Javascript
基于element-ui的rules中正则表达式
Sep 04 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
vue自动化路由的实现代码
Sep 30 Javascript
Node.js Addons翻译(C/C++扩展)
Jun 12 #Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 #Javascript
jQuery的each循环用法简单示例
Jun 12 #Javascript
基于jquery插件编写countdown计时器
Jun 12 #Javascript
跨域请求的完美解决方法(JSONP, CORS)
Jun 12 #Javascript
浅谈jquery的map()和each()方法
Jun 12 #Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 #Javascript
You might like
php中取得URL的根域名的代码
2011/03/23 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
python实现二分查找算法
2017/09/21 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
用Python 执行cmd命令
2020/12/18 Python
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
建筑工程毕业生自我鉴定
2014/01/14 职场文书
品质管理部岗位职责范文
2014/03/01 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
教育实习指导教师评语
2014/12/31 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
Python 如何实现文件自动去重
2021/06/02 Python
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript
Python OpenCV超详细讲解基本功能
2022/04/02 Python
ubuntu下常用apt命令介绍
2022/06/05 Servers