逗号运算符的用法详解

注意:
一、由于目前正在功读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逗号运算符的用法详解的更多相关文章

  1. 21.Python算术运算符及用法详解

    算术运算符是处理四则运算的符号,在数字的处理中应用得最多.Python 支持所有的基本算术运算符,如表 1 所示. 表 1 Python常用算术运算符 运算符 说明 实例 结果 + 加 12.45 + ...

  2. JS中的this用法详解

    随着对js的深入学习和使用,你会发现它里面包含了很多令人困惑的机制,比如对象.闭包.原型链继承等等,而这其中肯定包含令你现在或者曾经费解的this,如果你不把心一横,花点时间还真不明白这个this的用 ...

  3. 26.Python三目运算符(三元运算符)用法详解

    Python 可通过 if 语句来实现三目运算符的功能,因此可以近似地把这种 if 语句当成三目运算符.作为三目运算符的 if 语句的语法格式如下: True_statements if expres ...

  4. JS中setTimeout()的用法详解

    1. SetTimeOut() 1.1 SetTimeOut()语法例子 1.2 用SetTimeOut()执行Function 1.3 SetTimeOut()语法例子 1.4 设定条件使SetTi ...

  5. js中this关键字用法详解

    1.全局环境中的this 在全局环境中,this 指向全局对象Global,即 window 对象 如: alert(this); // 显示 [object Window] alert(this = ...

  6. BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

    转自:https://blog.csdn.net/ochangwen/article/details/51531866 一.简介 Java在java.math包中提供的API类BigDecimal,用 ...

  7. js replace 与replaceall实例用法详解

    这篇文章介绍了js replace 与replaceall实例用法详解,有需要的朋友可以参考一下stringObj.replace(rgExp, replaceText) 参数 stringObj 必 ...

  8. js数组中foEach和map的用法详解 jq中的$.each和$.map

    数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...

  9. js原生之scrollTop、offsetHeight和offsetTop等属性用法详解

    scrollTop.offsetHeight和offsetTop等属性用法详解:标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼容 ...

随机推荐

  1. Hibernate映射一对多双向关联关系及部门关联属性

    一对多双向关联关系:(Dept/Emp的案例) 既可以根据在查找部门时根据部门去找该部门下的所有员工,又能在检索员工时获取某个员工所属的部门. 步骤如下: 1.构建实体类(部门实体类加set员工集合) ...

  2. android-BaseAdapter自定义控件深刻理解

    一.自定义控件的实现 自定义控件需要继承BaseAdapter抽象类,该类实现了ListAdapter, SpinnerAdapter两个接口,这两个接口继承了Adapter接口类,没错.是继承Ada ...

  3. nodeType

    nodeType 属性返回节点的类型 语法attrObject.nodeType DOM节点的类型有很多种 12种常用如下 元素节点 : 1属性节点 : 2文本节点 : 3 nodeType取值 No ...

  4. Daily Scrum 11.3

    今天开发人员的任务都还行,测试的同学要开始辛苦了. 下面是今天的Task统计:

  5. 手机触屏触摸特效javascript-TouchSwipe(依赖于jquery库)中文说明

    by 郑州seo on 2013 年 7 月 6 日 in jquery, 网站建设 with 6 Comments 最近需要做一个手机小门户网站,因为目前主流的手机都是安卓和苹果的,他们的浏览器内核 ...

  6. CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方

    问题一: document.forms1.action 不可使用 需要修改程 document.forms[0] .NET 程序框架 从2.0/3.5升级到4.0 版本后,document.forms ...

  7. JS开发windows phone8.1系列之3

    http://msdn.microsoft.com/zh-cn/library/windows/apps/dn629638.aspx 这部分主要是使用页面导航 管理方式,在程序的default.htm ...

  8. 【iCore3 双核心板_FPGA】Quartus 如何生成jic文件

    PDF下载: http://pan.baidu.com/s/1i5lQ0Rj iCore3 购买链接: https://item.taobao.com/item.htm?id=524229438677

  9. Codeforces Round #375 (Div. 2) A B C D F

    A 数轴上有三个人要到一个点去过年 使三个人走路距离的和最小  让两边的人都走到中间那个点即可 B 给出一个字符串 其中有_ ( ) 三种字符和英文字母 连续的英文字母是一个单词 括号对中不会套括号对 ...

  10. linux下缓存的查看/修改

    起因: 安装openstack过程中内存不够大,提高内存后想起缓存一般设置为内存的两倍. 缓存的实质是硬盘开辟一个空间,然后设置这个空间为缓存. 查看缓存大小 free -m free -m tota ...