JS运算符和表达式

操作符

一元操作符

只能操作一个值的操作符叫做一元操作符。

递增(++)递减(--)操作符,有两个版本:

  • 前置型
    • 执行前置递增和递减操作时,变量的值都在语句被求值以前改变的(这种情况被称为副效应)
var age = 29;       
var anotherAge = --age + 2;
alert(age);         //输出28
alert(anotherAge);        //输出30
由于前置递增和递减操作与执行语句的优先级相等,因此整个语句会从左至有被求值,例:
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;        //等于21
var num4 = num1 + num2;        //等于21
  • 后置型
    • 后置递增递减语法不变,但区别是:即递增递减操作是在包含它们的语句被求值之后才执行的,例:
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;        //等于22
var num4 = num1 + num2;        //等于21
  • 在应用不同的值时,递增递减遵循以下规则:
    • 应用一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减一的操作
    • 应用一个不包含有效数字字符的字符串时,将变量值设为NaN。
    • 应用一个布尔值false或者true时,先将其转换为0或者1,再执行加减一的操作
    • 应用于浮点数时,执行加减一操作
    • 应用于对象,先调用对象的valueOf()方法取得一个可操作的值,然后将该值应用前述规则,如果结果NaN,调用toString()方法
var s1 = "2";     s1++;    //3
var s2 = "z";     s2++;    //NaN
var b = false;    b++;    //1
var f = 1.1;    f--;    //0.1000000000009(由于浮点舍入错误导致) 
var o = {
    valueOf: function(){
      return -1;       
    }
};         o--;      //-2

算数操作符

乘法

乘法操作符是由一个(*)表示,用于表示两个数值的乘积处理特殊值,遵循以下规则:

  • 如果操作数都是数值,执行常规乘法计算,如果乘积超过数值的表示范围,用Infinity或-Infinity表示;
  • 如果有一个操作数是NaN,结果是NaN;
  • 如果Infinity与0相乘,结果NaN;
  • 如果Infinity与Infinity相乘,结果是Infinity
  • 如果Infinity与非0数值相乘,结果是Infinity或者-Infinity;
  • 如果有一个操作符不是数值,则调用Number()将其转换为数值。

除法

除法操作符有一个(/)表示,例:var result = 66/11; 处理特殊值,遵循以下规则:

  • 如果操作数都是数值,执行常规除法计算,如果商超过数值的表示范围,用Infinity或-Infinity表示;
  • 如果有一个操作数是NaN,结果是NaN;
  • 如果0被0除,结果NaN;
  • 如果Infinity被Infinity除,结果是NaN
  • 如果非零的有限数被零除,结果是Infinity或者-Infinity;
  • 如果Infinity被任何非零数值除,结果是Infinity或者-Infinity;
  • 如果有一个操作符不是数值,则调用Number()将其转换为数值。

求模

求模(余数)操作符有一个(%)表示,例:var result = 26 % 5; //等于1,处理特殊值,遵循以下规则:

  • 如果操作数都是数值,执行常规除法计算,返回除得的余数;
  • 如果被除数是无穷大值而除数是有限大的值,结果NaN;
  • 如果被除数是有限大的数值而除数是零,结果NaN;
  • 如果Infinity被Infinity除,结果是NaN;
  • 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
  • 如果被除数是零,则结果是零;
  • 如果有一个操作符不是数值,则调用Number()将其转换为数值。

加性操作符

加法操作符用(+)表示。 例: var result = 1 + 2; 处理特殊值,遵循以下规则:

  • 如果有一个操作数是NaN,则结果是NaN;
  • 如果是Infinity加Infinity,结果是Infinity;
  • 如果是-Infinity加-Infinity,结果是-Infinity;
  • 如果Infinity加-Infinity,结果是NaN;
  • 如果+0加+0,结果是+0;
  • 如果-0加-0,结果是-0;
  • 如果+0加-0,结果是+0;
  • 不过如果有一个操作符是字符串,则应用以下规则:
    • 如果两个操作数都是字符串,则拼接起来;
    • 如果只有一个操作符是字符串,则将另一个操作符转换为字符串,然后拼接
  • 如果有一个操作数是对象,数值或布尔,则调用它们的toString()方法取得相应的字符串值,然后再应用前面的关于字符串的规则,对于undefined和null,则调用String()函数取得字符串.
var result = 5 + 5;
alert(result);      // 10
var result1 = 5 + "5";
alert(result1);         // "55"

减法

减法操作符用(-)表示,var result = 2 - 1;处理特殊值,遵循以下规则:

  • 如果操作数都是数值,执行常规计算,返回结果;
  • 如果有一个操作数是NaN,结果NaN;
  • 如果是 Infinity 减 Infinity,结果是NaN;
  • 如果是 -Infinity 减 -Infinity,结果是NaN;
  • 如果是 Infinity 减 -Infinity,结果是 Infinity;
  • 如果是 -Infinity 减 Infinity,结果是 -Infinity;
  • 如果+0减+0,结果是+0;
  • 如果-0减+0,结果是-0;
  • 如果-0减-0,结果是+0;
  • 如果有一个操作符不是数值,则调用Number()将其转换为数值。在计算
var result1 = 5 - true ;    // 4 ,因为true转换为1
var result2 = NaN - 1 ;    // NaN
var result3 = 5 - "" ;     // 5, 因为""被转换为0
var result4 = 5 - null ;   // 5,因为null转换为0

关系操作符

关系操作符用于对两个值得比较,返回时布尔值。包括:小于(<)、大于(>)、大于等于(>=)、小于等于(<=)当关系操作数使用了非数值,遵循以下规则:

  • 如果两个操作符都是字符串,则比较两个字符转对应的字符编码值;
  • 如果一个操作数是数值,将另一个操作数转换为数值,比较;
  • 如果一个操作数是对象,则调用valueOf()方法,如果没有valueOf()方法,调用toString()方法,在比较;
  • 如果一个操作数是布尔,转换为数值,在比较

相等操作符

ECMAScript提供两组操作符:相等 和 不相等----先转换再比较,全等 和 不全等----仅比较而不转换

相等和不相等

相等操作符有==两个等号表示,返回布尔值,不相等操作符由!=叹号后跟等号组成,这两个操作符先转换再比较(强制转换)转换遵循基本原则:

  • 如果有一个操作符是布尔值,比较前转换为数值0或1
  • 如果一个操作数是字符串,另一个是数值,先将字符串转化为数值再比较
  • 如果一个操作符是对象,另一个不是,则调用对象的valueOf()方法,得到的基本值用前面的规则比较;
    • 两个操作符遵循以下规则:
      • null 和 undefined 是相等的
      • 比较相等性之前,不能将null 和 undefined转换任何值
      • 如果有个操作数是NaN,相等操作符返回false,不相等返回true. NaN不等于NaN
      • 如果两个操作数都是对象,比较它们是不是同一个对象,如果都指向同一个对象,则相等操作符返回true;否则,返回false.

全等和不全等

全等操作符由===三个等于号表示,只在两个操作数未经转换就相等的情况下返回true.

var result1 = ("55" == 55) ;    //true
var result2 = ("55" === 55) ;    //false

不全等操作符由!==一个感叹号后跟两个等号表示,在两个操作数未经转换就不相等的情况下返回true

var result1 = ("55" != 55) ;    //false
var result2 = ("55" !== 55) ;    //true

记住:null == undefined会返回true,因为它们是类似的值,null === undefined会返回false,因为它们不同类型


布尔操作符

布尔操作符一共有三个:非(NOT) 与(AND) 或(OR).

逻辑非

逻辑非由一个感叹号!表示,返回布尔值,逻辑非操作先将其转化为布尔值,然后取非对其求反.

  • 如果操作数是一个对象,返回false;
  • 如果操作符是一个空字符串,返回true;
  • 如果操作符是一个非空字符串,返回false;
  • 如果操作符是数值0 ,返回true;
  • 如果操作数是任意非0数值(包括Infinity),返回false;
  • 如果操作数是null,返回true;
  • 如果操作数是NaN,返回true;
  • 如果操作数是undefined,返回true;
alert(!false);    //true
alert(!"blue");    //false
alert(!0);    //true
alert(!NaN);    //true
alert(!"");    //true
同时使用两个逻辑非(!!)操作,实际上会模拟Boolean()转型函数的行为

逻辑与

逻辑与操作符由两个和号&&表示,有两个操作数, 例:var result = true && false;

第一个操作数 第二个操作数 结果
true true true
true false false
false true false
false false false

逻辑与操作可以应用于任何类型的操作数,不仅仅布尔值,其他数值类型,遵循以下规则:

  • 如果第一个操作数是对象,返回第二个操作值;
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
  • 如果两个数都是对象,返回第二个操作数;
  • 如果第一个数null, 返回null;
  • 如果第一个操作数是NaN,则返回NaN;
  • 如果第一个操作数是undefined,则返回underfined;

逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,不会对第二个操作数求值.

var found = true ;
var result = ( found && someUndefinedVariable ) ;    //会发生错误,不能使用未定义的值
alert( result ) ;   //这一行不会执行
var found = false ;
var result = ( found && someUndefinedVariable ) ;    //不会发生错误,短路操作
alert( result ) ;   // 会执行"false"

逻辑或

逻辑或操作符由两个||两个竖线符号表示,由两个操作符,例:var result = true || false;

第一个操作数 第二个操作数 结果
true true true
true false true
false true true
false false false

与逻辑与操作相似,也遵循类似规则:

  • 如果第一个操作数是对象,返回第一个操作值;
  • 如果第一个操作数的求值结果为false,则返回第二个操作数;
  • 如果两个数都是对象,返回第一个操作数;
  • 如果两个操作数都是null, 返回null;
  • 如果两个操作数都是NaN,则返回NaN;
  • 如果两个操作数都是undefined,则返回underfined;

逻辑或操作也属于短路操作,即如果第一个操作数为true,不会对第二个操作数求值.

var found = true ;
var result = ( found || someUndefinedVariable ) ;    //不会发生错误
 alert( result ) ;   // 会执行"true"
var found = false ;
var result = ( found && someUndefinedVariable ) ;    // 会发生错误
alert( result ) ;   //  不会执行

条件操作符

语法:variable = boolean_expression ? true_value : false_value;

var max = ( num1 > num2 ) ? num1 :num2 ;
表达式意思是:如果num1>num2(表达式返回true),将num1赋值给max;如果false,将num2赋值给max.

赋值操作符

简单的赋值操作符由等于号=表示,作用是把右边的值赋给左边的量,例:var num = 10;

  • 如果等号前面再加其他操作符,可以完成复合赋值操作,例:
var num = 10;
num = num + 10;    ==>    num += 10;
x += y // 等同于 x = x + y
x -= y // 等同于 x = x - y
x *= y // 等同于 x = x * y
x /= y // 等同于 x = x / y
x %= y // 等同于 x = x % y
x >>= y // 等同于 x = x >> y
x <<= y // 等同于 x = x << y
x >>>= y // 等同于 x = x >>> y
x &= y // 等同于 x = x & y
x |= y // 等同于 x = x | y
x ^= y // 等同于 x = x ^ y

逗号操作符

逗号操作符可以在一条语句中执行多个操作,例:var num1 = 1, num2=2, num3=3;

  • 逗号操作符多用于声明多个变量,除此之外,还可以赋值.用于赋值时,逗号操作符总会返回表达式中最后一项
var num = ( 5 , 1 , 4 , 8 , 0) ;    //num值为0
虽然不常见,但是这个例子可以理解逗号的这种行为

对象操作符

  • new
    • 可以获取一个对象示例
  • delete
    • 可以删除一个对象的属性
  • .
    • 获取对象属性
  • []
    • 获取对象属性的值
  • instanceof
    • 判断某个变量是否是某个对象的实例
  • in
    • 判断某个属性是否在对象中

参考

这些都是一些常见的操作符,好好掌握,嘿嘿,还有 位操作符 还没太熟练,在研究一下,继续努力

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 表达式 表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合...
    劼哥stone阅读 553评论 0 4
  • 什么是 JavaScript 语言? JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script...
    oWSQo阅读 1,784评论 0 1
  • 本章内容 语法 数据类型 流控制语句 理解函数 3.1 语法 3.1.1 区分大小写 区分大小写 3.1.2 标识...
    闷油瓶小张阅读 706评论 0 0
  • 是嫉妒吗? 我并没有告诉他, 从事情发生到现在 一个人的时候 真的很乱 还是没有接受现实: 感情也会有保质期 给信...
    再次起飞的蒲公英阅读 226评论 0 0
  • 一、打开输入法窗口: InputMethodManager inputMethodManager = (Input...
    专属守护阅读 645评论 0 3