js语法中运算符的二义性之逗号“,”的二义性

看到《js语言精髓与编程实践》中讲解的js语法中运算符的二义性之逗号的二义性,做些笔记

我们先来看看这两个例子:

alert(eval(‘a=(1,2,3);‘));//示例1
alert(eval(‘a=1,2,3;‘));//示例2
结果是两者都会弹出3,这种用法产生的混乱,是因为逗号“,”既可以是语法分隔符,又可以是运算符所导致的。在上面的示例1,示例2中,逗号都被作为”连续运算符“在使用。示例1中的括号强制运算符,因此它的效果是运算如下表达式:
(1,2,3)
并将结果赋值给变量a。由于该表达式是三个(直接量的)单值表达式连续运算,其结果值是最后一个表达式,亦即是数值3.而示例2因为没有括号来强制优先级,因此按默认优先级会先完成赋值运算,效果时“变量a赋值为1”,示例2在完成赋值运算“a=1”之后,还仍将继续指向连续运算,而最后一个表达式就是直接量3。
下面来看示例3:
a=(1,2,(3,4,5),6);//示例3
同样的,我们也可以知道示例3的结果是使变量a赋值为:
[1,2,5,6]
这是因为表达式“(3,4,5)”将会被先运算并返回结果值5,作为数组声明时的一个元素。示例3中要强调的是,逗号在这里分别有“数组声明时的语法分隔符”和“连续运算符”两种作用。但是如果像示例4:
var a=1,2,3;//示例4
这样,逗号被解释成了语句var声明时用来分隔多个变量的语法分隔符,而不是连续运算符。而语句var要求用“,”号来分隔的是多个标识符,而数值2和数值3显然都不是合法的表只发,因此示例4的代码会在语法解释期就提示出错。
存在同样混乱问题的,还有下面这个示例5的例子:
//示例5.显示最后表达式的值"value:240"
var i=100;
alert((i+=20,i*=2,‘value:‘+i));
弹出“value:240”,因为在这个示例的alert()函数调用中,还存在一对括号,用来表示强制运算。因为alert()是函数,所以如果这样写:
alert(i+=20,i*=2,‘value:‘+i);//示例6
alert()函数会理解为三个参数传入。而函数参数表的传值顺序是从左至右的,那么示例6这行代码会被理解为:
alert(120,240,‘value:240‘);
但alert()函数自身只会处理一个参数,因此最终显示的结果会是值“120”,而不是我们期望的240,但需要补充的是,这行代码执行完毕之后,变量i的值其实已经变成240了,为了让js理解这里的逗号“,”是连续运算符,而不是函数参数表的语法分隔符,我们在这里加入了一对强制(表达式)运算的括号,即是示例5,这样,由于外层的括号是函数调用符,因此将内部的
(i+=20,i*=2,‘value:‘+i)
理解为一个参数,并且是一个需要求值得表达式。因此这里的括号就顺理成章地理解成了“强制运算符”,下面的代码:
i+=20
i*=2
‘value:‘+i
也就被作为这个强制运算符的一个运算元:由“,”连接起来的一个表达式。直到饶了这样大的一个圈子,逗号才被合理地解释为“连续运算符”。
时间: 2024-08-08 13:53:59

js语法中运算符的二义性之逗号“,”的二义性的相关文章

关于js语法中的一些难点(预解析,变量提前,作用域)

******标题很吓人************ 其实就是一个小例子 ,从例子中浅析 这些知识点 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>关于js中的那些小知识点</title> </head> <body> </body> <script> var a=1; function zero

eclipse中加放js文件报js语法错误解决办法

1) eclipse设置         window->preference-> JavaScript -> Validator->Errors/Warnings->Enable Javascript Sematic validation前面的钩号去掉 2) .project文件    下面的代码删除 <buildCommand> <name>org.eclipse.wst.jsdt.core.javascriptValidator</name

C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?

(1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功能特别有用.例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义. (2).C#语法中两个问号(??)的运算符是指null 合并运算符,合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null. MSDN上面的解释: ?? 运算符称为 null 合并运算符

Mongodb中的js语法

定义一个变量 > var len = 10; For循环 这里的db和data都可以作为对象 save是方法 接收一个临时定义的对象 > for(var i = 0; i < len; i++){db.data.save({x:i})}; WriteResult({ "nInserted" : 1 }) > db.data.find(); { "_id" : ObjectId("593177646a6bb0f03293efe1&qu

关于js代码中与或运算符||&amp;&amp;的妙用

看bootstrap时看到如下一行JavaScript代码产生了疑惑. return window.pageYOffset || e.scrollTop ||在这里的作用是什么呢? 首先明确概念,在js逻辑运算中,0."".null.false.undefined.NaN都会判为false,其他都为true. a&& b :如果执行a后返回true,则执行b并返回b的值:如果执行a后返回false,则整个表达式返回a的值,b不执行: a || b :如果执行a后返回tr

js语法和数据类型

基础知识(Basics) JavaScript 的很多语法借鉴自 Java,但也受 Awk,Perl 和 Python 影响. JavaScript 是大小写敏感的,使用 Unicode 字符集. 在JavaScript中,语句被称为 statements,并用分号分隔(;).空格.制表符和换行符被称为空白.  JavaScript的脚本的源文本从左到右扫描,并转换成由令牌,控制字符,行结束符,注释或空白组成的输入元素序列.  ECMAScript中还定义了某些关键字和字面值,并具有分号自动插入

js文件中函数前加分号和感叹号是什么意思?

本文转自:http://blog.csdn.net/h_o_w_e/article/details/51388500 !function(){}();   !有什么用? 从语法上来开,JavaScript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单独的JS文件中,开头的分号是没有任何意义的,可以删掉. 叹号是逻辑运算符,是"非"的意思,常见这种写法 if(!true){}:而将运算符加载函数定义的前面,则是将函数看做一

JS 语法大全

来源http://blog.csdn.net/newegg2009/article/details/6230582 js语法2008年03月19日 星期三 11:14一.js的数据类型和变量 JavaScript 有六种数据类型.主要的类型有 number.string.object 以及 Boolean 类型,其他两种类型为 null 和 undefined. String 字符串类型:字符串是用单引号或双引号来说明的.(使用单引号来输入包含引号的字符串.)如:"The cow jumped

javascript中运算符的优先级

运算符优先级 JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低的优先级列出JavaScript运算符.具有相同优先级的运算符按从左至右的顺序求值. 其中圆括号可用来改变运算符优先级所决定的求值顺序.这意味着圆括号中的表达式应在其用于表达式的其余部分之前全部被求值. z = 78 * (96 + 3 + 45) 在该表达式中有五个运算符: =, *, (), +