ECMAScript运算符_一元运算符&位运算符&逻辑运算符&乘性运算符&加性运算符

一元运算符

delete

delete 运算符删除对以前定义的对象属性或方法的引用。例如:

var o = new Object;
o.name = "David";
alert(o.name);  // 输出 "David"
delete o.name;
alert(o.name);  // 输出 "undefined"

delete运算符不能删除开发者未定义的属性和方法(删除方法引发错误)。例如,下面的代码将引发错误:

delete o.toString;

<br />

void

void 运算符对任何值返回 undefined。该运算符通常用于避免输出不应该输出的值,例如,从HTML 的<a>元素调用JavaScript函数时。要正确做到这一点,函数不能返回有效值,否则浏览器将清空页面,只显示函数的结果。例如:

<a href="javascript:window.open('about:blank')">Click me</a>

如果把这行代码放入HTML页面,点击其中的链接,即可看到屏幕上显示"[object]"。
这是因为window.open()方法返回了新打开的窗口的引用。然后该对象将被转换成要显示的字符串。
要避免这种效果,可以用void运算符调用window.open()函数:

<a href="javascript:void(window.open('about:blank'))">Click me</a>

这使window.open()调用返回undefined,它不是有效值,不会显示在浏览器窗口中。
<br />

一元加法和一元减法

一元加法本质上对数字无任何影响:

var iNum = 20;
iNum = +iNum;
alert(iNum);    // 输出 "20"

尽管一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字。

var sNum = "20";
alert(typeof sNum); // 输出 "string"
var iNum = +sNum;
alert(typeof iNum); // 输出 "number"

这段代码把字符串"20"转换成真正的数字。当一元加法运算符对字符串进行操作时,它计算字符串的方式与parseInt()相似,主要的不同是可解析十六进制数,但不能解析八进制数。因此,用一元加法转换"010",得到的总是10,而"0xB"将被转换成11。
另一方面,一元减法就是对数值求负(例如把 20 转换成 -20):

var iNum = 20;
iNum = -iNum;
alert(iNum);    // 输出 "-20"

与一元加法运算符相似,一元减法运算符也会把字符串转换成近似的数字,此外还会对该值求负。例如:

var sNum = "20";
alert(typeof sNum); // 输出 "string"
var iNum = -sNum;
alert(iNum);        // 输出 "-20"
alert(typeof iNum); // 输出 "number"

在上面的代码中,一元减法运算符将把字符串"-20"转换成-20(一元减法运算符对十六进制和十进制的处理方式与一元加法运算符相似,只是它还会对该值求负)。
<br />

位运算符

ECMAScript整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在ECMAScript中,所有整数字面量默认都是有符号整数

NOT(~)

位运算 NOT 是三步的处理过程:
1.把运算数转换成32位数字
2.把二进制数转换成它的二进制反码
3.把二进制数转换成浮点数
例如:

var iNum1 = 25;     // 25 等于 00000000000000000000000000011001
var iNum2 = ~iNum1; // 转换为  11111111111111111111111111100110
alert(iNum2);       // 输出 "-26"

位运算NOT实质上是对数字求负,然后减 1,因此25变-26。用下面的方法也可以得到同样的方法:

var iNum1 = 25;
var iNum2 = -iNum1 -1;
alert(iNum2);       // 输出 -26

<br />

AND(&)

位运算AND由和号(&)表示,直接对数字的二进制形式进行运算。它把每个数字中的数位对齐,然后用下面的规则对同一位置上的两个数位进行AND运算。
<br />

OR(|)

位运算 OR 由符号(|)表示,也是直接对数字的二进制形式进行运算。
<br />

XOR(^)

位运算 XOR 由符号(^)表示,当然,也是直接对二进制形式进行运算。
<br />

有符号左移(<<)

它把数字中的所有数位(不包含符号位)向左移动指定的数量。
例如,如果把-2左移5位,得到的是-64,而不是64。
<br />

有符号右移(>>)

它把数字中的所有数位(不包含符号位)向右移动指定的数量。
例如,如果把-64左移5位,得到的是-2,而不是134217726。
<br />

无符号右称(>>>)

它把数字中的所有数位(包含符号位)向右移动指定的数量。
例如,如果把-64左移5位,得到的是134217726,而不是-2。
<br />

逻辑运算符

Boolean 运算符有三种:NOT、AND 和 OR。

ToBoolean操作

参数类型 结果
Undefined false
Null false
Boolean 结果等于输入的参数(不转换)
Number 如果参数为 +0, -0 或 NaN,则结果为 false;否则为 true。
String 如果参数为空字符串,则结果为 false;否则为 true。
Object true

<br />

NOT(!)

逻辑NOT运算符返回的一定是Boolean值。
逻辑 NOT 运算符的行为如下:

  • 如果运算数是对象,返回 false
  • 如果运算数是数字 0,返回 true
  • 如果运算数是 0 以外的任何数字,返回 false
  • 如果运算数是 null,返回 true
  • 如果运算数是 NaN,返回 true
  • 如果运算数是undefined,发生错误
    <br />

AND(&&)

逻辑AND运算不一定返回Boolean值。

  • 如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
  • 如果两个运算数都是对象,返回第二个对象(true时计算到最后一个并返回最后一个运算数)。
  • 如果某个运算数是 null,返回 null。
  • 如果某个运算数是 NaN,返回 NaN。
  • 如果运算数是undefined,发生错误

与Java中的逻辑AND运算相似,ECMAScript中的逻辑AND运算也是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数。
考虑下面的例子:

var bTrue   = true;
var bResult = (bTrue && bUnknown);  // 发生错误
alert(bResult);                     // 这一行不会执行

这段代码在进行逻辑AND运算时将引发错误,因为变量bUnknown是未定义的。变量bTrue的值为true,因为逻辑AND运算将继续计算变量bUnknown。这样做就会引发错误。
如果修改这个例子,把第一个数设为 false,那么就不会发生错误:

var bFalse  = false;
var bResult = (bFalse && bUnknown);
alert(bResult);                     // 输出 "false"

<br />

OR(||)

逻辑OR运算不一定返回Boolean值。

  • 如果一个运算数是对象,并且该对象左边的运算数值均为 false,则返回该对象(false时计算到最后一个并返回最后一个运算数)。
  • 如果两个运算数都是对象,返回第一个对象(第一个为true并返回相应运算数)。
  • 如果最后一个运算数是 null,并且其他运算数值均为 false,则返回 null(false时计算到最后一个并返回最后一个运算数)。
  • 如果最后一个运算数是 NaN,并且其他运算数值均为 false,则返回 NaN(false时计算到最后一个并返回最后一个运算数)。
  • 如果运算数是undefined,发生错误

与逻辑 AND 运算符一样,逻辑 OR 运算也是简便运算。对于逻辑 OR 运算符来说,如果第一个运算数值为 true,就不再计算第二个运算数。
<br />

乘性运算符

乘法运算符(*)

在处理特殊值时,ECMAScript 中的乘法还有一些特殊行为:

  • 如果结果太大或太小,那么生成的结果是 Infinity 或 -Infinity。
  • 如果某个运算数是 NaN,结果为 NaN。
  • Infinity 乘以 0,结果为 NaN。
  • Infinity 乘以 0 以外的任何数字,结果为 Infinity 或 -Infinity。
  • Infinity 乘以 Infinity,结果为 Infinity。
    <br />

除法运算符(/)

  • 如果结果太大或太小,那么生成的结果是 Infinity 或 -Infinity。
  • 如果某个运算数是 NaN,结果为 NaN。
  • Infinity 被 Infinity 除,结果为 NaN。
  • Infinity 被任何数字除,结果为 Infinity。
  • 0 除一个任何非无穷大的数字,结果为 NaN。
  • Infinity 被 0 以外的任何数字除,结果为 Infinity 或 -Infinity。
    <br />

取模运算符(%)

对于特殊值,取模运算符也有特殊的行为:

  • 如果被除数是 Infinity,或除数是 0,结果为 NaN。
  • Infinity 被 Infinity 除,结果为 NaN。
  • 如果除数是无穷大的数,结果为被除数。
  • 如果被除数为 0,结果为 0。
    <br />

加性运算符

加法运算符(+)

在处理特殊值时,ECMAScript 中的加法也有一些特殊行为:

  • 某个运算数是 NaN,那么结果为 NaN。
  • -Infinity 加 -Infinity,结果为 -Infinity。
  • Infinity 加 -Infinity,结果为 NaN。
  • +0 加 +0,结果为 +0。
  • -0 加 +0,结果为 +0。
  • -0 加 -0,结果为 -0。
    不过,如果某个运算数是字符串,那么采用下列规则:
  • 如果两个运算数都是字符串,把第二个字符串连接到第一个上。
  • 如果只有一个运算数是字符串,把另一个运算数转换成字符串,结果是两个字符串连接成的字符串。
    例如:
var result = 5 + 5;     // 两个数字
alert(result);          // 输出 "10"
var result2 = 5 + "5";  // 一个数字和一个字符串
alert(result);          // 输出 "55"

<br />

减法运算符(-)

在处理特殊值时,减法运算符也有一些特殊行为:

  • 某个运算数是 NaN,那么结果为 NaN。
  • Infinity 减 Infinity,结果为 NaN(+Infinity与-Infinity相加,结果为NaN)。
  • -Infinity 减 -Infinity,结果为 NaN(+Infinity与-Infinity相加,结果为NaN)。
  • Infinity 减 -Infinity,结果为 Infinity(+Infinity与+Infinity相加,结果为Infinity)。
  • -Infinity 减 Infinity,结果为 -Infinity(-Infinity与-Infinity相加,结果为-Infinity)。
  • +0 减 +0,结果为 +0(结果为左边运算符)。
  • -0 减 -0,结果为 -0(结果为左边运算符)。
  • +0 减 -0,结果为 +0(结果为左边运算符)。
  • 某个运算符不是数字,那么结果为 NaN。
    <br />

更多请参考:W3School

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

推荐阅读更多精彩内容

  • 表达式 表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合...
    劼哥stone阅读 557评论 0 4
  • 什么是 JavaScript 语言? JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script...
    oWSQo阅读 1,785评论 0 1
  • 操作符 一元操作符 只能操作一个值的操作符叫做一元操作符。 有递增(++)和递减(--)操作符,有两个版本: 前置...
    YM雨蒙阅读 810评论 3 8
  • 今天是来到简书的第二十一天。话说一个习惯的形成过程需要二十一天,这二十一天来每天打开简书,已经成为了一种习惯。 在...
    天上夏阅读 197评论 1 0
  • 第一次接触冥想是在瑜伽课上,伴随着老师的指导语,进入了一个平和宁静的世界,不需要烦恼人际关系的处理/课程的学习/金...
    小落墨smile阅读 210评论 0 1