您的位置:首页 > Web前端 > JavaScript

javascript中不常见的运算符

2017-12-07 17:52 253 查看
ECMAScript 一元运算符

一元运算符只有一个参数,即要操作的对象或值。

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

*说明:delete运算符并不是什么时候都成效的,从ie9开始,定义了这样一个方法

var obj={};
Object.defineProperty(obj,'x',{
configuable:true,
value:1
});
delete obj.x;//true
obj.x;           //undefined


如果将对象的defineProperty()方法中的configuable属性设置为false的话,执行delete obj.x;为false..

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


2 .void 运算符对任何值返回 undefined。该运算符通常用于避免输出不应该输出的值.

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


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

3.前增量/前减量运算符

var iNum = 10;
++iNum;


这样,(++iNum)为11,iNum的值也为11

4.后增量和后减量运算符

var iNum = 10;
iNum--;


这样,(iNum–)的值还是10, 但是iNum变成了9

5.一元加法和一元减法

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


ECMAScript 位运算符

位运算符是在数字底层进行操作的。本节深入讲解了有关整数的知识,并介绍了 ECMAScript 的各种位运算符。

1.整数

var iNum = 18;
alert(iNum.toString(2));    //输出 "10010"


2.位运算符not

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


3.位运算符and

var iResult = 25 & 3;
alert(iResult); //输出 "1"
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
AND = 0000 0000 0000 0000 0000 0000 0000 0001
可以看出,在 25 和 3 中,只有一个数位(位 0)存放的都是 1,因此,其他数位生成的都是 0,所以结果为 1。


4.位运算符or

var iResult = 25 | 3;
alert(iResult); //输出 "27"
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
OR = 0000 0000 0000 0000 0000 0000 0001 1011
可以看出,在两个数字中,共有 4 个数位存放的是 1,这些数位被传递给结果。二进制代码 11011 等于 27。


5.位运算符XOR

var iResult = 25 ^ 3;
alert(iResult); //输出 "26"
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
可以看出,在两个数字中,共有 4 个数位存放的是 1,这些数位被传递给结果。二进制代码 11010 等于 26。


6.左移运算符

左移运算由两个小于号表示(<<)。它把数字中的所有数位向左移动指定的数量。例如,把数字 2(等于二进制中的 10)左移 5 位,结果为 64(等于二进制中的 1000000):
var iOld = 2;       //等于二进制 10
var iNew = iOld << 5;   //等于二进制 1000000 十进制 64


7.右移运算符

有符号右移运算符由两个大于号表示(>>)。它把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算相反。例如,把 64 右移 5 位,将变为 2:
var iOld = 64;      //等于二进制 1000000
var iNew = iOld >> 5;   //等于二进制 10 十进制 2


ECMAScript Boolean 运算符

Boolean 运算符非常重要。深入讲解三种 Boolean 运算符:NOT、AND 和 OR。

1.逻辑NOT运算符

在 ECMAScript 中,逻辑 NOT 运算符与 C 和 Java 中的逻辑 NOT 运算符相同,都由感叹号(!)表示。

与逻辑 OR 和逻辑 AND 运算符不同的是,逻辑 NOT 运算符返回的一定是 Boolean 值。

逻辑 NOT 运算符的行为如下:

如果运算数是对象,返回 false

如果运算数是数字 0,返回 true

如果运算数是 0 以外的任何数字,返回 false

如果运算数是 null,返回 true

如果运算数是 NaN,返回 true

如果运算数是 undefined,发生错误

2.逻辑OR运算符



对于逻辑 OR 运算符来说,如果第一个运算数值为 true,就不再计算第二个运算数。

3.逻辑AND运算符

在 ECMAScript 中,逻辑 AND 运算符用双和号(&&)表示:

var bTrue = true;

var bFalse = false;

var bResult = bTrue && bFalse;

测试实例:



ECMAScript 中的逻辑 AND 运算也是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数。对于逻辑 AND 运算来说,如果第一个运算数是 false,那么无论第二个运算数的值是什么,结果都不可能等于 true。如果第一个运算数的结果为TRUE,会接着计算第二个运算数,计算的结果为第二个运算数的结果。。

ECMAScript 乘性运算符

讲解 ECMAScript 的乘性运算符:乘法、除法、取模运算符,以及它们的特殊行为

1.乘法运算符

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

如果结果太大或太小,那么生成的结果是 Infinity 或 -Infinity。

如果某个运算数是 NaN,结果为 NaN。

Infinity 乘以 0,结果为 NaN。

Infinity 乘以 0 以外的任何数字,结果为 Infinity 或 -Infinity。

Infinity 乘以 Infinity,结果为 Infinity。



2.除法运算符

与乘法运算符相似,在处理特殊值时,除法运算符也有一些特殊行为:

如果结果太大或太小,那么生成的结果是 Infinity 或 -Infinity。

如果某个运算数是 NaN,结果为 NaN。

Infinity 被 Infinity 除,结果为 NaN。

Infinity 被任何数字除,结果为 Infinity。

0 除一个任何非无穷大的数字,结果为 NaN。

Infinity 被 0 以外的任何数字除,结果为 Infinity 或 -Infinity。

3.取模运算符

与其他乘性运算符相似,对于特殊值,取模运算符也有特殊的行为:

如果被除数是 Infinity,或除数是 0,结果为 NaN。

Infinity 被 Infinity 除,结果为 NaN。

如果除数是无穷大的数,结果为被除数。

如果被除数为 0,结果为 0。

ECMAScript 加性运算符

ECMAScript 的加性运算符:加法、减法运算符,以及它们的特殊行为。

1.加法运算符

与乘性运算符一样,在处理特殊值时,ECMAScript 中的加法也有一些特殊行为:

某个运算数是 NaN,那么结果为 NaN。

-Infinity 加 -Infinity,结果为 -Infinity。

Infinity 加 -Infinity,结果为 NaN。

+0 加 +0,结果为 +0。

-0 加 +0,结果为 +0。

-0 加 -0,结果为 -0。

2.减法运算符

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

某个运算数是 NaN,那么结果为 NaN。

Infinity 减 Infinity,结果为 NaN。

-Infinity 减 -Infinity,结果为 NaN。

Infinity 减 -Infinity,结果为 Infinity。

-Infinity 减 Infinity,结果为 -Infinity。

+0 减 +0,结果为 +0。

-0 减 -0,结果为 -0。

+0 减 -0,结果为 +0。

某个运算符不是数字,那么结果为 NaN。

ECMAScript 关系运算符

关系运算符执行的是比较运算。介绍关系运算符的常规比较方式,以及如何比较字符串与数字。

1.常规比较方式 –每个关系运算符都返回一个布尔值

var bResult1 = 2 > 1    //true
var bResult2 = 2 < 1    //false


不过,对两个字符串应用关系运算符,它们的行为则不同。许多人认为小于表示“在字母顺序上靠前”,大于表示“在字母顺序上靠后”,但事实并非如此。对于字符串,第一个字符串中每个字符的代码都与会第二个字符串中对应位置的字符的代码进行数值比较。完成这种比较操作后,返回一个 Boolean 值。问题在于大写字母的代码都小于小写字母的代码,这意味这着可能会遇到下列情况:

var bResult = "Blue" < "alpha";
alert(bResult); //输出 true


在上面的例子中,字符串 “Blue” 小于 “alpha”,因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。要强制性得到按照真正的字母顺序比较的结果,必须把两个数转换成相同的大小写形式(全大写或全小写的),然后再进行比较:

var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();
alert(bResult); //输出 false


2.比较数字和字符串

另一种棘手的状况发生在比较两个字符串形式的数字时,比如:

var bResult = "25" < "3";
alert(bResult); //输出 "true"


上面这段代码比较的是字符串 “25” 和 “3”。两个运算数都是字符串,所以比较的是它们的字符代码(”2” 的字符代码是 50,”3” 的字符代码是 51)。

不过,如果把某个运算数该为数字,那么结果就有趣了:

var bResult = "25" < 3;
alert(bResult); //输出 "false"


这里,字符串 “25” 将被转换成数字 25,然后与数字 3 进行比较,结果不出所料。

无论何时比较一个数字和一个字符串,ECMAScript 都会把字符串转换成数字,然后按照数字顺序比较它们。

不过,如果字符串不能转换成数字又该如何呢?考虑下面的例子:

var bResult = "a" < 3;
alert(bResult);


你能预料到这段代码输出什么吗?字母 “a” 不能转换成有意义的数字。不过,如果对它调用 parseInt() 方法,返回的是 NaN。根据规则,任何包含 NaN 的关系运算符都要返回 false,因此这段代码也输出 false

ECMAScript 等性运算符

等性运算符用于判断变量是否相等。ECMAScript 提供两套等性运算符:等号和非等号,以及全等号和非全等号。

1.等号和非等号

在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。

执行类型转换的规则如下:

如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。

如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。

如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。

如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

在比较时,该运算符还遵守下列规则:

值 null 和 undefined 相等。

在检查相等性时,不能把 null 和 undefined 转换成其他值。

如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。

如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

2.全等号和非全等号

等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。

全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);    //输出 "true"
alert(sNum === iNum);   //输出 "false"


在这段代码中,第一个 alert 使用等号来比较字符串 “66” 和数字 66,输出 “true”。如前所述,这是因为字符串 “66” 将被转换成数字 66,,然后才与另一个数字 66 进行比较。第二个 alert 使用全等号在没有类型转换的情况下比较字符串和数字,当然,字符串不等于数字,所以输出 “false”。

ECMAScript 条件运算符

variable = boolean_expression ? true_value : false_value;


该表达式主要是根据 boolean_expression 的计算结果有条件地为变量赋值。如果 Boolean_expression 为 true,就把 true_value 赋给变量;如果它是 false,就把 false_value 赋给变量。

ECMAScript 赋值运算符

简单的赋值运算符由等号(=)实现,只是把等号右边的值赋予等号左边的变量。

复合赋值运算是由乘性运算符、加性运算符或位移运算符加等号(=)实现的。这些赋值运算符是下列这些常见情况的缩写形式:

var iNum = 10;
iNum += 10;


ECMAScript 逗号运算符符

用逗号运算符可以在一条语句中执行多个运算。

var iNum1 = 1, iNum = 2, iNum3 = 3;


var number1=(1,2,3);

此时的number1的值为3,往往取的值是最后一个。。会从左到右依次计算表达式的值,拿到最后一表达式的值作为计算结果。。

此外,还有一些别的运算符,如:

new运算符

function Foo();

Foo.prototype.x=1;

var obj=new Foo();

obj.x; //1

obj.hasOwnProperty(“x”); //false

obj.proto.hasOwnProperty(“x”); //true

可以通过hasOwnProperty()判断这个属性是对象上的还是对象的原型链上的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript