JavaScript操作符

一元操作符

只能操作一个值的操作符。

递增和递减操作符

  1. 前置型:位于要操作的变量之前;
  2. 后置型:位于要操作的变量之后。

如:

    var age = 24;
    ++ age;
    //等同于
    var age = 24;
    age = age + 1;

    var age = 24;
    -- age;
    //等同于
    var age = 24;
    age = age - 1;

副效应:执行前置递增和递减操作时,变量的值都在语句被求值前改变。

  var age = 24;
  var newage = --age + 2;
  console.log(age);         //值为23
  console.log(newage);      //值为25
  console.log(age + newage);         //值为48

后置型递增和递减操作是在包含她们的语句被求值之后才执行。

  var age = 24;
  var newage = age-- + 2;
  console.log(age);         //值为23
  console.log(newage);      //值为26
  console.log(age + newage);         //值为49

递增和递减操作符遵循下列规则:

  • 如果字符串包含有效数字字符,先将其转换为数字值,在执行递增和递减操作,字符串变量变成数值变量;
  • 如果字符串不包含有效数字字符,将变量的值设置为NaN,字符串变量变成数值变量;
  • 布尔值true 或者false,将转换为1或者0,再执行递增和递减操作,布尔值变量变成数值变量;
  • 如果应用于浮点数值,执行递增和递减操作;
  • 如果应用于对象,先调用对象的valueOf()方法,取得可供操作的值再应用上述规则。
  var a = 24;
  var b = "a";
  var c = true;
  var d = 1.1;
  var e = {
    valueOf: function() {
      return -1;
    }
  };
  a++;
  b++;
  c++;
  d--;
  e++;
  console.log(a);   //值为25
  console.log(b);   //值为NaN
  console.log(c);   //值为2
  console.log(d);   //值为0.10000000000000009
  console.log(e);   //值为0

一元加和减操作符

一元加操作符以一个(+)表示,但是放在数值前面不会产生影响。

再对非数值应用一元操作符时,会先对值进行转换。

一元操作符还能用于表示负数,也就是将正数转换为负数,但对非数值时,也会先对它进行转换。

位操作符

这部分内容来自于developer.mozilla.org/

有符号32位整数

位操作符用于在最基本的层次上,即按照内存中表示数值的位来操作数值。

所有的按位操作符的操作数都会被转成补码(two's complement)形式的有符号32位整数。补码形式是指一个数的负对应值(negative counterpart)为数值的所有比特位反转后,再加1。反转比特位即该数值进行’非‘位运算,也即该数值的反码。例如下面为整数314的二进制编码:

00000000000000000000000100111010

下面编码 ~314,即 314 的反码:

11111111111111111111111011000101

最后,下面编码 -314,即 314 的补码:

11111111111111111111111011000110

补码保证了当一个数是正数时,其最左的比特位是0,当一个数是负数时,其最左的比特位是1。因此,最左边的比特位被称为符号位(sign bit)。

0 是所有比特数字0组成的整数。

0 (base 10) = 00000000000000000000000000000000 (base 2)

-1 是所有比特数字1组成的整数。

-1 (base 10) = 11111111111111111111111111111111 (base 2)

-2147483648(十六进制形式:-0x80000000)是除了最左边为1外,其他比特位都为0的整数。

-2147483648 (base 10) = 10000000000000000000000000000000 (base 2)

2147483647(十六进制形式:0x7fffffff)是除了最左边为0外,其他比特位都为1的整数。

2147483647 (base 10) = 01111111111111111111111111111111 (base 2)

数字-2147483648 和 2147483647 是32位有符号数字所能表示的最小和最大整数。

按位逻辑操作符

从概念上讲,按位逻辑操作符按遵守下面规则:

  • 操作数被转换成32位整数,用比特序列(0和1组成)表示。
  • 第一个操作数的每个比特位与第二个操作数的相应比特位匹配:第一位对应第一位,第二位对应第二位,以此类推。
  • 位运算符应用到每对比特位,结果是新的比特值。

按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。

下面的表格总结了JavaScript中的按位操作符:

运算符 用法 描述
按位与( AND) a & b 对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。
按位或(OR) a | b 对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。
按位异或(XOR) a ^ b 对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。
按位非(NOT) ~ a 反转操作数的比特位,即0变成1,1变成0。
左移(Left shift) a << b a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。
有符号右移 a >> b 将 a 的二进制表示向右移b(< 32) 位,保留符号位(即正负号标记)。
无符号右移 a >>> b 将 a 的二进制表示向右移b(< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。

布尔操作符

布尔操作符一共有以下3个:

  1. 逻辑非(not)(!)
  2. 与(and)(&&)
  3. 或(or)(||)

逻辑非(!)

逻辑非操作符由一个叹号(!)表示,可以用于任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。

逻辑非操作符遵循下列规则:

  • 如果操作数是一个对象,返回false;
  • 如果操作数是一个空字符串,返回true;
  • 如果操作数是一个非空字符串,返回false;
  • 如果操作数是数值0,返回true;
  • 如果操作时是任意非0数值,(包括infinity),返回false;
  • 如果操作数是null,返回true;
  • 如果操作数是NaN,返回true;
  • 如果操作数是underfined,返回true。

例如:


  var a = {
    function(){
      return 1;
    }
  };
  console.log(!a);              //false
  console.log(!"");             //true
  console.log(!"hello world"); //false
  console.log(!0);             //true
  console.log(!2017);          //false
  console.log(!null);          //true
  console.log(!NaN);                   //true

如果同时使用两个逻辑非操作符,可以得到这个值对应的布尔值。

逻辑与(&&)

逻辑与操作符由 && 表示,有两个操作数,如:

var result = true && false;

其值表为:

第一个操作符 第二个操作符 结果
true true true
true flase false
false true false
false flase false

逻辑与操作符可以应用于任何类型的操作数。

逻辑与操作符遵循下列规则:

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

如果第一个操作数是false,无论第二个操作数是什么值,结果都为false。

逻辑或(||)

逻辑或操作符由 || 表示,有两个操作数,如:

var result = true || false;

其值表为:

第一个操作符 第二个操作符 结果
true true true
true flase true
false true true
false flase false

逻辑与操作符遵循下列规则:

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

如果第一个操作数是true,无论第二个操作数是什么值,结果都为true。

乘性操作符

3个乘性操作符:

  1. 乘法;
  2. 除法;
  3. 求模。

如果参与乘性计算的某个操作符不是数值,后台会先使用number()转型函数将其转换为数值。

乘法

乘法操作符由一个 * 表示,用于计算两个数值的乘积。

乘法操作符遵循下列规则:

  1. 数值 * 数值,执行常规乘法计算;
  2. x * NaN,结果为NaN;
  3. Infinity * 0,结果为NaN;
  4. Infinity * y(y不等于0),结果为+-Infinity;
  5. Infinity * Infinity,结果为Infinity。

除法

除法操作符由一个 / 表示,执行两个数值的除法运算。

除法操作符遵循下列规则:

  1. 数值 / 数值,执行常规除法计算;
  2. x / NaN,结果为NaN;
  3. 0 / 0,结果为NaN;
  4. 非零有限数 / 0,结果为+-Infinity;
  5. Infinity / Infinity,结果为结果为NaN;
  6. Infinity / 任何非零数,结果为+-Infinity。

求模

求模(余数)操作符由一个 % 表示。

求模操作符遵循下列规则:

  1. 数值 % 数值,执行常规求模计算;
  2. 无穷大值 % 有限大值,结果为NaN;
  3. 有限大值 % 0,结果为NaN;
  4. Infinity % Infinity,结果为NaN;
  5. 有限大值 % 无穷大值,结果为有限大值;
  6. 0 % 任何数,结果为0。

加性运算符

加法

加法操作符由一个 + 表示。

加法操作符遵循下列规则:

  • 在两个操作数都是数字的时候,会做加法运算
  • 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
  • 在参数有对象的情况下会调用其valueOf或toString
  • 在只有一个字符串参数的时候会尝试将其转换为数字
  • 在只有一个数字参数的时候返回其正数值
  var a = 5;
  var b = 10;
  console.log("5加10的值为:" + a + b);   //5加10的值为:510
  console.log("5加10的值为:" + (a + b));         //5加10的值为:15

减法

加法操作符由一个 - 表示。

加法操作符遵循下列规则:

  1. x - NaN,结果为NaN;
  2. Infinity - Infinity,结果为NaN;
  3. -Infinity - -Infinity,结果为NaN;
  4. Infinity - -Infinity,结果为Infinity;
  5. -Infinity - Infinity,结果为-Infinity;
  6. +0 - +0 = +0;
  7. +0 - -0 = -0;
  8. -0 - -0 = +0.

关系操作符

关系操作符一共有4个:

  1. 小于(<);
  2. 大于(>);
  3. 小于等于(>=);
  4. 大于等于(>=)。

关系操作符遵循下列规则:

  1. 如果两个操作数都是数值,执行数值比较;
  2. 如果两个操作符都是字符串,执行两个字符串对应的字符编码值比较;
  3. 如果两个操作符其中一个是数值,将另一个转换为数值再进行比较;
  4. 如果两个操作符其中一个是布尔值,将其转换为数值再进行比较。
  var a = "Brick";
  var b = "alphabet";
  console.log(a < b);                                 //true
  console.log(a.toLowerCase() < b.toLowerCase());    //false

相等操作符

相等和不相等

先转换再比较

相等操作符由 == 表示;

不相等操作符由 != 表示。

相等操作符遵循下列规则:

  1. 如果包含布尔值:将false转换为0,true转换为1;
  2. 如果包含字符串和数值,将字符串转换为数值;
  3. 如果一个操作符石对象,另一个不是则遵循:
  • null == underfined;
  • 比较之前,不能将null和underfined转换为其他任何值;
  • 如果有一个操作数是NaN,相等操作符返回false,不相等操作符返回true;
  • NaN == NaN,相等操作符返回false,不相等操作符返回true;
  • 如果两个操作数都是对象,则比较她们是不是同一个对象。

全等和不全等

仅比较不转换

全等操作符由 === 表示;

不全等操作符由 !== 表示。

null == underfined,返回true;

null === underfined,返回false,因为它们是不同类型的值。

条件操作符

语法

condition ? expr1 : expr2

参数

condition:计算结果为true或false的表达式。

expr1, expr2:值可以是任何类型的表达式。

描述
如果条件值为真值(true),运算符就会返回 expr1 的值;否则, 就会返回 expr2 的值。

  var a = 13;
  var b = 16;
  var max = (a > b) ? a : b;
  console.log(max);          //返回值为16

赋值操作符

赋值操作符由 = 表示。

简单赋值操作:

  var age = 18;

复合赋值(在 = 前面添加其他操作符)操作:

  var age = 18;
      age += 10;
      //等同于
      age = age + 10;

逗号操作符

使用逗号操作符可以在一条语句中执行多个操作,如:

//逗号操作符用于声明多个变量
  var a = 1, b = 2, c = 3;
//逗号操作符用于赋值
  var a = (1,2,3,4);
//由于4是表达式中的最后一项,因此a的值就是4

运算符优先级汇总表

Operator precedence

练习

// Number + Number -> 数字相加
console.log(1+1);       //2

// String + String -> 字符串连接
console.log("2"+"4");   //"24"

// Number + String -> 字符串连接
console.log(2+"4");     //"24"

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

推荐阅读更多精彩内容

  • 表达式 表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合...
    劼哥stone阅读 560评论 0 4
  • 1、标识符 标识符是指变量、函数、属性的名字,或函数的参数。 格式规则: 第一个字符必须是一个字母、下划线(_)或...
    霜天晓阅读 699评论 0 0
  • 小时候 我不记得父亲是什么样子 只知道 家里有个与母亲熟识的男人 男人来去匆匆 我短手短脚追不上 后来啊 我独自走...
    夏光草木阅读 68评论 0 6
  • 进程 什么是进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空...
    为自己丶拼个未来阅读 249评论 0 1