javascript运算符语法全面概述


Posted in Javascript onJuly 14, 2016

前面的话

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级的优先级,从高到低依次是:

++ -- - + ~ ! delete typeof void
 * / %
 + -
 << >> >>>
 < <= > >= instanceof in
 == != === !==
 &
 ^
 |
&&
||
?:
= *= /= %= += -= &= ^= |= <<= >>= >>>=
,

由这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;//13

可以使用圆括号来强行指定运算次序

2+3*5;//17
(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
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
         返回第二个操作数

以上这篇javascript运算符语法全面概述就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript学习笔记8 用JSON做原型
Jan 11 Javascript
JS获取随机数函数可自定义最小值最大值
May 08 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
js使用setTimeout实现定时炸弹的方法
Apr 10 Javascript
javascript中加var和不加var的区别 你真的懂吗
Jan 06 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
Apr 21 Javascript
angularJS开发注意事项
May 26 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 Javascript
微信小程序公用参数与公用方法用法示例
Jan 09 Javascript
原生JS实现天气预报
Jun 16 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
Jul 14 #Javascript
浅谈addEventListener和attachEvent的区别
Jul 14 #Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 #Javascript
全面了解addEventListener和on的区别
Jul 14 #Javascript
js计算系统当前日期是星期几的方法
Jul 14 #Javascript
原生javascript 学习之js变量全面了解
Jul 14 #Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
Jul 14 #Javascript
You might like
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
js实时监听文本框状态的方法
2011/04/26 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
Python内置函数dir详解
2015/04/14 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python算术运算符实例详解
2017/05/31 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
大学生毕业的自我评价分享
2014/01/02 职场文书
自考生自我评价分享
2014/01/18 职场文书
40岁生日感言
2014/02/15 职场文书
班主任班级寄语大全
2014/04/04 职场文书
文明单位创建材料
2014/12/24 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
如何撰写创业策划书
2019/06/27 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
golang特有程序结构入门教程
2021/06/02 Python
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js