javascript运算符语法概述
前面的话
javascript中的运算符大多由标点符号表示,少数由关键字表示,它们的语法言简意赅,它们的数量却着实不少。运算符始终都遵循着一些固定语法,只有了解并掌握这些内容,才能正确使用运算符。本文将主要介绍javascript运算符语法概述
操作数个数
javascript的运算符总共有46个,如果根据其操作数的个数进行分类,则大多数是二元运算符(binary operator),它们的操作数都是两个,它们将两个表达式合并成复杂表达式
1 + 2;
true || false;
javascript中的一元运算符(unary operator)将一个表达式转换为另一个稍复杂的表达式,主要包括以下9个:
++ -- - + ~ ! delete typeof void
a++;
typeof true;
javascript只有一个三元运算符(ternary operator),是条件判断运算符?:,它将三个表达式合并成一个表达式
2>1 ? 2 : 1;
优先级
运算符优先级控制着运算符的执行顺序,优先级高的运算符的执行总是先于优先级运算符低的运算符
46个运算符总共分为14级的优先级,从高到低依次是:
1 ++ -- - + ~ ! delete typeof void
2 * / %
3 + -
4 << >> >>>
5 < <= > >= instanceof in
6 == != === !==
7 &
8 ^
9 |
10 &&
11 ||
12 ?:
13 = *= /= %= += -= &= ^= |= <<= >>= >>>=
14 ,
由这14级的运算符优先级等级可以看出:
一元运算符 > 算术运算符 > 比较运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符 > 逗号运算符
[注意]逻辑取反运算符属于一元运算符,其优先级最高
例子
!2<1&&4*3+1;
像上面这种情况就比较复杂,逐步来分解其运算顺序
先计算一元运算符!,!2;//false
//于是表达式变为
false < 1 && 4*3 + 1;
计算算术运算符4*3+1;//13
//于是表达式变为
false < 1 && 13;
计算比较运算符<,false<1;//true
//于是表达式变为:
true && 13;//
可以使用圆括号来强行指定运算次序
2+3*5;//
(2+3)*5;//25;
结合性
运算符具有两种结合性,一种是从左向右结合,记号为L,一种是从右向左结合,记号为R。结合性指定了在多个具有同样优先级的运算符表达式中的运算顺序
多数运算符都具有从左向右的结合性,只有一元运算符、条件运算符和赋值运算符具有从右向左的结合性
w = x + y + z;
//等价于:
w = ((x + y)+ z);
w = x = y = z;
//等价于:
w = (x = (y = z));
q = a ? b : c ? d : e ? f : g;
//等价于:
q = a ? b : (c ? d : (e ? f : g));
运算符的优先级和结合性决定了它们在复杂表达式中的运算顺序,但子表达式相互有影响时,顺序会发生变化
例子
a = 1;
b = a++ + a-- * a++;
先分析该表达式中,根据优先级的顺序,分别运算递增运算符、乘法运算符、加法运算符和赋值运算符
先计算第一个a++;//结果为1,a为2
//表达式变成
b = 1 + a-- * a++;
计算a--;//结果为2,a为1
//表达式变成
b = 1 + 2 * a++;
计算第二个a++;//结果为1,a为2
//表达式变成
b = 1 + 2 * 1;
所以,最终a = 2; b = 3;
a = 1;
b = a++ + a-- * a++;
console.log(a,b);//2 3
//类似地
a = 1;
b = a-- * a++ + a++;
console.log(a,b);//2,1
类型
一些运算符可以作用于任何数据类型,但仍然希望它们的操作数是指定类型的数据,并且大多数运算符返回一个特定类型的值,在下面的运算符规则表中,箭头前为运算符操作数的类型,箭头后为运算结果的类型
【左值】
左值(lvalue)是一个古老的术语,指表达式只能出现在运算符的左侧
在javascript中,变量、对象属性和数组元素都是左值
递增运算符++、递减运算符--和赋值运算符的操作数类型是左值
var a = 3;
a++;//
3--;//报错
({}).a += '1';//'undefined1'
'test' -= 'test';//报错
运算符规则表
运算符 操作 类型
++ 增量 lval->num
-- 减量 lval->num
- 求反 num->num
+ 转换为数字 num->num
~ 按位求反 int->int
! 逻辑非 bool->bool
delete 删除属性 lval->bool
typeof 检测类型 any->str
void 返回undefined any->undef
******************************************************
* \ % 乘、除、求余 num,num->num
******************************************************
+ - 加、减 num,num->num
+ 字符串连接 str,str->str
******************************************************
<< 左移位 int,int->int
>> 有符号右移位 int,int->int
>>> 无符号右移位 int,int->int
******************************************************
< <= > >= 比较数字顺序 num,num->bool
< <= > >= 比较字母表顺序 str,str->bool
instanceof 测试对象类 obj,func->bool
in 测试属性 str,obj->bool
******************************************************
== 判断相等 any,any->bool
!= 判断不等 any,any->bool
=== 判断恒等 any,any->bool
!== 判断非恒等 any,any->bool
******************************************************
& 按位与 int,int->int
******************************************************
^ 按位异或 int,int->int
******************************************************
| 按位或 int,int->int
******************************************************
&& 逻辑与 any,any->any
******************************************************
|| 逻辑或 any,any->any
******************************************************
?: 条件运算符 bool,any,any->any
******************************************************
= 赋值 lval,any->any
*= /= %=
+= -= &= 运算且赋值 lval,any->any
^= |= <<=
>>= >>>=
******************************************************
, 忽略第一个操作数, any,any->any
返回第二个操作数
参考资料
【1】 阮一峰Javascript标准参考教程——运算符 http://javascript.ruanyifeng.com/grammar/operator.html#toc29
【2】《javascript权威指南(第6版)》第4章 表达式和运算符
javascript运算符语法概述的更多相关文章
- Unit04: JavaScript 概述 、 JavaScript 基础语法 、 流程控制
Unit04: JavaScript 概述 . JavaScript 基础语法 . 流程控制 my.js function f3() { alert("唐胜伟"); } demo1 ...
- 前端基础-JavaScript的基本概述和语法
1.JavaScript概述 2.JavaScript引入方式 3.JavaScript语言规范 4.JavaScript语言基础 5.JavaScript数据类型 6.JavaScript运算符 7 ...
- javascript基础语法——变量和标识符
× 目录 [1]定义 [2]命名规则 [3]声明[4]特性[5]作用域[6]声明提升[7]属性变量 前面的话 关于javascript,第一个比较重要的概念是变量,变量的工作机制是javascript ...
- javascript基础语法——词法结构
× 目录 [1]java [2]定义 [3]大小写[4]保留字[5]注释[6]空白[7]分号 前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫 ...
- JavaScript交互式网页设计 • 【第1章 JavaScript 基本语法】
全部章节 >>>> 本章目录 1.1 JavaScript 概述 1.1.1 JavaScript 简介 1.1.2 JavaScript 的概念和执行原理 1.1.3 J ...
- JavaScript基本语法(二)
上篇博文写到JavaScript的数据类型.JavaScript包括了字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null).未 ...
- JavaScript基本语法(一)
前段时间学习了HTML和CSS,也实战了一些结构较简单的项目.在还没运用到JS的知识时,做出来的效果总觉得少了些什么.虽然总体布局与一些基本的特效,也能用HTML+CSS就能完成.但如今开始进入Jav ...
- javascript基础语法——表达式
× 目录 [1]原始表达式 [2]复杂表达式 前面的话 一般地,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但是,其实还有一个术语经常使用,却很少被提到,这就是javascr ...
- JavaScript 运算符
JavaScript 运算符 JavaScript 运算符用于赋值,比较值,执行算术运算等. JavaScript 算术运算符 算术运算符用于执行两个变量或值的运算. 赋值 y = 5, 以下表格将向 ...
随机推荐
- git学习之branch分支
作为新手,站在我的角度肤浅的来理解,分支就是相当于开辟了一个新的临时工作区,在这个工作区进行文件代码改动,然后在合并到master主工作区,这样能保证主工作区的安全性和稳定性,对于团队协作尤为重要. ...
- 在IIS7.5中ASP.NET调用cmd程序拒绝访问决绝方法小记
前言 昨天利用Github的Webhook实现自动部署站点,其中要调用命令行(cmd.exe)程序执行shell脚本. 在本地测试没有任何问题,部署到服务器之后,发现错误信息:访问拒绝. 问题 没有权 ...
- 浅谈 C#委托
看了<CLR via C#>的17章委托后,为自己做一点浅显的总结,也分享给需要的人. .NET通过委托来提供一种回调函数机制,.NET委托提供了很多功能,例如确保回调方法是类型安全的(C ...
- HTML5填充颜色的fillStyle测试
效果:http://hovertree.com/texiao/html5/canvas/1/ 代码: <html> <head> <meta http-equiv=&qu ...
- [WCF编程]11.错误:错误契约
一.错误传播 服务需要向客户端报告特定错误,当WCF默认的错误屏蔽方法并不包含这一实现.另一个重要的问题与传播到客户端有关,即由于异常是针对特定技术的,因此无法跨越服务边界而被共享.要实现无缝的互操作 ...
- C#动态编译
C#提供了DynamicObject和IDynamicMetaObjectProvider两种方式实现动态类型,动态类型的好处是类型的公有接口可以在运行时改变. 创建动态类型最简单的方法就是继承Dyn ...
- jquery 之for 循环
jquery 的 for 循环: 1. var userList = [11,22,33,44]; $.each(userList,function(i,item){ console.log(i, i ...
- Oracle学习总结_day01_day02_表的创建_增删改查_约束
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 更新: SELECT * FROM (SELECT R ...
- 2分钟在eclipse下使用SpringBoot搭建Spring MVC的WEB项目
1. 首先用eclipse创建一个maven工程, 普通maven工程即可 2. 修改pom如下: <?xml version="1.0" encoding="UT ...
- thinkphp学习简易教程(二) thinkphp连接读取MySQL数据库
首先, 在本地服务器中新建项目APP,依据第一讲中的步骤配置好thinkphp,这里为了测试方便,不分前台和后台模块,统一把模块路径设为'./APP/'. 1.新建数据库myapp,以及数据库表thi ...