js操作符

一、一元操作符

1、递增递减

前置型:变量值是在语句被求值以前改变(副效应);

var age = 29;
var anotherAge = --age + 2;
alert(age)          //输出28
alert(anotherAge )  //输出30

后置型:包含它们语句被求值之后执行;

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2 ;    //等于22     num1原始值运算
var num4 = num1 + num2;      //等于21     num1递减后的值运算

递增递减遵循规则(适用于整数、字符串、布尔值、浮点数、对象):

  •  数字字符串时:先转为数字值,在执行加减1操作,字符串变量变成数值变量;
  • 不包含有效数字字符串的字符时:将变量置位NaN,字符串变量变成数值变量;
  • 布尔值时:先转为(false为0,true为1)在执行加减1操作;布尔值变量变成数值变量;
  • 浮点数值:执行加减1操作;
  • 对象时:先调用valueOf()方法,取得可供操作的值,然后对该值应用前述规则,如果结果为NaN,则调用toString()方法,在执行前述规则,对象变量变成数值变量;

2、一元加、减操作符

放在数值前,对数值不会产生影响;

var n = 25;
n = +n;         //任然是25

 对非数值时,该操作会对其值执行数据类型转换;

var n = "25";
n = +n; //字符串转换为数值

主要用于表示负数

var n = 25;
n = -n   //变成-25

 

二、位操作符

位操作符用于最基本的层次上,即按内存中表示数值的位来操作数值,ECMAScript数值以IEEE-75464(64位)位格式存储,64位转32位的整数,执行位操作后再转回64位(转换过程严重副效应,即特殊的NaN、Infinity位操作时,会当成0来处理);

32位二进制码,第32位为符号位,0表示整数,1表示负数;

正数(纯二进制码存储)

负数(二进制码存储)格式是二进制补码,计算步骤(以-18为列):

(1)求这个数值绝对值的二进制码(即18的二进制码);

0000 0000 0000 0000 0000 0000 0001 0010

(2)求二进制反码,即0为1,1为0;

1111 1111 1111 1111 1111 1111 1110 1101

(3)得到二进制反码加1;

 1111 1111 1111 1111 1111 1111 1110 1101

                                                                 1

 1111 1111 1111 1111 1111 1111 1110 1110   (-18的二进制表示,有符号整数时,不能访问第31位);

 1、按位非(NOT)

波浪线表示(~)结果返回数值的反码,按位非操作本质:得到的负值在减1;

var n1 = 25;      //二进制   00011001
var n2 = ~n1;    //二进制   11100110
console.log(n2)  //-26

 

2、按位与(AND)

和号表示(&),两数值为1则为1,任何一位为0则为0;

var result = 25 & 3;
conosle.log(result )     //输出1

//底层操作
25    =   0001 1001
 3    =   0000 0011
AND   =   0000 0001

3、按位或(OR)

 竖线表示(&),两数值为0则为0,任何一位为1则为1;

var result = 25 | 3;
conosle.log(result )     //输出27

//底层操作
25    =   0001 1001
 3    =   0000 0011
OR    =   0000 1011

4、按位异或(XOR)

 插入表示(∧),两数只有1则为1,两位都是1或0,则为0;

var result = 25 ∧ 3;
conosle.log(result )     //输出26

//底层操作
25    =   0001 1001
 3    =   0000 0011
XOR   =   0000 1010

5、左移(<<)、有符号右移(>>)、无符号右移(>>>),移动指定上的位置;

 

、布尔值操作符

 1、逻辑非(!)

  • 对象,返回false;
  • 空字符串,返回true;非空字符串,返回false;
  • 数值0,返回true;
  • 非0数值(包括Infinity),返回false;
  • null,返回true;
  • NaN,返回true;
  • undefined,返回true;

2、逻辑与(&&)

 有一个为false则为false,第一个操作符返回false,就不会对第二个操作符求值,反之第一个返回true,则继续求值第二个操作符(短路操作符)

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

 3、逻辑或(||)

 有一个为true则为true,第一个操作符返回true,就不会对第二个操作符求值,反之第一个返回false,则继续求值第二个操作符(短路操作符)

  • 第一个操作数是对象,则返回第一个操作数;
  • 第一个操作数结果是false,则返回第二个操作数;
  • 两个操作数都是对象,则返回第一个操作数;
  • 有一个操作数是null,则返回null;
  • 有一个操作数是NaN,则返回NaN;
  • 有一个操作数是undefined,则返回undefined;

 

、乘性操作符

ECMAScript定义3个乘性操作符:乘法、除法、求模;操作数为非数值的情况下执行(Number())自动类型转换,空字符被当做0,true将被当做1

1、乘法(*)

  • 常规乘法计算,如乘积超过ECMAScript数值范围,则返回Infinity或-Infinity;
  • 有一个操作数是NaN,则结果是NaN;
  • Infinity * 0,则结果是NaN;
  • Infinity * 非0,则结果Infinity或-Infinity;
  • Infinity  *  Infinity,则结果Infinity;
  • 非数值,则自动转为数值在计算;  

2、除法(/)第二个操作数除以第一个操作数

  • 常规乘法计算,如乘积超过ECMAScript数值范围,则返回Infinity或-Infinity;
  • 有一个操作数是NaN,则结果是NaN;
  • Infinity  /  Infinity,则结果NaN;
  • 0 / 0,则结果NaN;
  • 0 / 非0有限数,则结果Infinity或-Infinity;
  • 非0数  /  Infinity,则结果Infinity或-Infinity;  
  • 非数值,则自动转为数值再计算;

3、求模(%)

  • 常规除法计算,返回除得的余数;
  •  无穷大  /  有限大,返回NaN;
  •  有限大  /  0,返回NaN;
  • Infinity   /   Infinity,返回NaN;
  • 有限大 / 无穷大,返回被除数(有限大);
  • 被除数是0,返回0;
  • 非数值,则自动转为数值再计算;

 

、加性操作符

1、加法(+)

两个操作符是数值

  • 有一个操作数是NaN;返回NaN;
  • Infinity   +  Infinity,返回Infinity;
  • (-Infinity  )+ ( -Infinity),返回-Infinity;
  • Infinity + (-Infinity),返回NaN;

有一个操作符是字符串

  • 两个操作符都是字符串,则拼接连个字符串;
var a = '2' +'3';
console.log(a)   //输出'23';

 

  • 有一个是字符串,则将另一个操作数转为字符串,在拼接;
var a = '2' +3;   //执行中将数值3转为字符串'3'
console.log(a)   //输出'23';

 

 有一个操作符对象、数值、布尔值,则调用toString()取得相应的字符串;对于undefined和null,则分别调用String()函数分别取得“undefined”和“null”

 ECMAScript编程中常见的错误

var n1 = 5;
var n2 = 10;
var n3 = 'ssss' + n1 + n2;
consoel.log(n3)   //输出"ssss510"

var n3 = 'ssss' +( n1 + n2);
consoel.log(n3)   //输出"ssss15"

 

 2、减法(-)

  • 两数值,返回常规结果;
  • 有一个为NaN,返回NaN;
  • Infinity   -   Infinity,返回NaN;
  • Infinity - (-Infinity),返回Infinity ;
  • (-Infinity)- Infinity ,返回-Infinity ;
  • 有一个为字符串、布尔值、null或nudefined,则调用Number()转为数值,进行常规操作,如转换为NaN,返回NaN;
  • 有一个为对象,则调用valueOf()取得对象数值,如得到NaN,返回NaN;如没有valueOf()方法,则调用toString()得到的字符串在转为数值;

 

、关系操作符

 < 、>  、<=  、 >=  操作结果返回一个布尔值

非数值,数据类型转换规则:

  • 两个都是数值,直接比较;
  • 两个都是字符串,比较两个字符串的字符编码值;
  • 一个是数值,则将另一个转为数值;
  • 一个是对象,则调用valueOf()取得数值,如没有valueOf()方法,则调用toString()方法比较字符编码;
  • 一个是布尔值,将其转为数值;

 

、相等操作符

 1、相等(==)和不相等(!=),先转换在比较;

数据转换规则:

  • 一个为布尔值,先将其转换为数值0或1;
  • 字符串与数值,先将字符串转为数值;
  • 一个为对象,调用valueOf();

null和undefined比较规则:

  • null和undefined相等;
  • 比较之前,不能讲null和undefined转换为任何值;
  • 一个为NaN,相等返回false,不相等返回true,两个都为NaN,相等返回NaN,NaN不等于NaN;
  • 两个为对象,比较是不是同一个对象(是否指向同一个对象),相等返回true,反之false;

2、全等(===)和不全等(!==),直接比较;

null == undefined   //true       行为相似,都表示无效值    
null === undefined   //false    不会主动转换分项的数据类型

 

 

、条件操作符

var max = (n1 > n2) ? n1 : n2

 

、赋值操作符

(=)右侧值赋给左侧变量,复合赋值操作:

var n = 10;
n = n + 10;  //可改为 n += 10; 这就叫复合赋值

 

、逗号操作符

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

//多个变量声明
var n1 = 1, n2 = 2;
//赋值,返回表达式最后一项 var n = (5,3,2,6,0); //结果为0

 

posted @ 2017-05-17 17:13  唐新  阅读(185)  评论(0编辑  收藏  举报