ECMA-262用于操作数据值的操作符包括:

  算术操作符

  位操作符

  关系操作符

  相等操作符

  ECMAScript操作符的不同之处在于:它能够适用于很多值,包括字符串,数字值,布尔值,甚至是对象。(在应用于对象时,相应的操作符通常会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值。)

1.一元操作符

(1)递增和递减操作符

  需要注意的是:

  eg:

    前置++age:变量的值在语句被求值之前改变。

    后置age++:变量的值在语句被求值之后改变。

  执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的(在计算机科学领域中,这种情况通常被称作复效应。)

  递增和递减操作符应用于其他数据类型遵循的规则详见高程书P37。

(2)一元加和减操作符

  当一元加和减操作符放在数值前面时,相当于正负号。

  当一元加和减操作符放在非数值类型的数据类型前时,它会依照相应的规则进行数据类型的转换。

2.位操作符

  ECMAScript中所有的数值都是以IEEE-754 64位格式存储的,但是为操作符并不是直接操作64位的值。而是先将64位的值转换成32位的整数,然后执行操作,最后在将结果转换回64位。但是这个转换过程也导致了一个严重的复效应,即在对特殊的NaN和Infinity值应用位操作时,这两个值都会被当成0来处理。

  如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),再进行位操作,最终得到一个数值。

(1)负数以二进制补码的格式存储。

计算一个数值二进制补码的过程如下:

1.求这个数值绝对值的二进制码。

2.求二进制的反码。

3.得到的二进制反码加1。

(2)ECMAScript中,当我们以二进制字符串形式输出一个负数时,我们看到的这个负数的绝对值的二进制码前面加了一个负号,它以更合乎逻辑的形式展示了出来。

eg:

 var num=-18;
alert(num.toString(2));

  注:

  默认情况下,ECMAScript中的所有整数都是有符号整数。当然,也存在无符号整数,无符号整数的值更大,因为第32位不再表示符号,可以用来表示数值。

(3)按位非(NOT):符号~

  按位非的本质是操作数的负值减1。

(4)按位与(AND):符号&

(5)按位或(OR):符号|

(6)按位异或(XOR):符号^

(7)左移:符号<<,左移操作出现的空位以0填充。左移不会影响数值的符号位。

(8)有符号的右移:符号>>,右移时保留符号位,右移出现的空位由符号位填充。

(9)无符号的右移:符号>>>,无符号的右移产生的空位以0填充。所以,正数的无符号右移和有符号右移结果一样,负数就不一样了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码,而且,由于负数以其绝对值的二进制的补码表示,因此就会导致无符号右移后的结果非常之大。

3.布尔操作符

  布尔操作符有三个:非(NOT:!),与(AND:&&),或(OR:||)

(1)逻辑非:运用该操作符时,首先会对它的操作数转换成一个布尔值,然后对其求反。详细规则见高程P44。

  注:同时使用两个逻辑非操作符,可以得到这个值真正对应的布尔值,与使用Boolean()函数的结果相同。

  eg:alert(!!123);//true

    alert(!!NaN);//false

(2)逻辑与:该操作可以应用于任何类型的操作数,在有一个操作数不是布尔值的时候,逻辑与操作就不一定返回布尔值。详细规则见高程P45。

  注:逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。

eg:

 var found=true;
var result=(found && someUndefinedVariable); //这里发生错误
alert(result);          //这一行不会执行

  上面代码出现错误的原因是,因为found的值是true,所有逻辑与会继续对第二个变量求值,但是由于第二个变量没有定义,所以导致错误。说明不能再逻辑与中使用未定义的值。

  将found的值改为false,由于逻辑与的短路特性,就不会出现错误。如下所示:

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

(3)逻辑或:与逻辑与相似,也是短路操作符,详细的规则见高程P46。

  注:

  可以利用逻辑或的俩避免为变量赋null或undefined值。

  eg: var myobject = preferredObject || backupObject;

  ECMAScript程序的赋值语句经常会使用到这种模式,如果 preferredObject不是null,那么它的值将会赋给myobject,如果是null,则将backupObject的值赋给myobject。

4.乘性操作符:乘法(*),除法(/),求模(%)

  当操作数是非数值的时候,后台会先使用Number()转型函数将其转换为数值。

(1)乘法。详细的规则见高程P47。

(2)除法。详细的规则见高程P47。

(3)求模。详细的规则见高程P48。

5.加性操作符:加法(+),减法(-)。

(1)加法

  有以下两种情况:

一. 当两个操作数都是数值时,执行常规的加法运算,详细的规则见高程P48。

二. 如果两个操作数存在字符串,当两个操作数都是字符串时,直接将两个字符串拼接起来,如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后在将两个字符串拼接起来。

注意:

  如果有一个操作数是对象,数值或是布尔值,则调用toString()方法取得相应的字符串值,然后在应用前面的关于字符串的规则。对于undefined和null,则调用String()函数并取得字符串“undefined”和“null”。

一个因为忽视加法操作符数据类型而导致的常见的错误:

eg:

  var num1=2;
var num2=8;
var text="The sum of 2 and 8 is:"+ num1 +num2;
alert(text);

结果如下:

  

要得到正确的结果,可以像下面这样使用圆括号:

 var num1=2;
var num2=8;
var text="The sum of 2 and 8 is:"+ (num1 +num2);
alert(text);

结果如下:

(2)减法。详细的规则见高程P49。

6.关系操作符: < , > , <= , >= ,这几个操作都返回布尔值。详细的规则见高程P50。

 需要注意的是:当两个操作数都是字符串是,则比较两个字符串对应的字符编码值。

eg:

  

 var result="23"<"3";
alert(result);

结果:

出现这样结果的原因是:两个操作数都是字符串,,所以比较的是字符编码,(“2”的字符编码是50,而“3”的字符编码是51。)

可以将其中一个操作数改为数值,这样的比较时,后台会自动将另一个操作数也转换为数值类型,这样就可以得到正确的结果,如下所示:

  

  var result="23"<3;
alert(result);

7.相等操作符

  (1)相等和不相等(== or  !=):先转换再比较。(强制转型)详细的规则见高程P51。

    注:

    null和undefined是相等的,且在比较相等性之前不能将null和undefined转换为其它任何值。

    如果两个操作数书对象,则比较它们是否是同一对象。

  (2)全等和不全等(=== or !===):仅比较而不转换。详细的规则见高程P52。

    eg:

  var result1=("55"==55);
var result2=("55"===55);
alert(result1);
alert(result2);

结果依次如下:

  var result1=(null==undefined);
var result2=(null===undefined);
alert(result1);
alert(result2);

结果依次如下:

8.条件操作符

eg:

 var max=(5>10)?5:10;
alert(max);

9.赋值操作符(=):把右侧的值赋给左侧的变量。复合赋值操作符详见高程P53。

  注:复合赋值操作符可以简化赋值操作,但是它们不会带来任何性能上的提升。

10.逗号操作符

  (1)声明多个变量

  eg:var num1=1,num2=4,num3=9;

  (2)赋值,逗号操作符总是会返回表达中的最后一项。

  eg:var num=(4,5,6,0);

    alert(num);

结果:

  

JS高程3.基本概念(4)操作符的更多相关文章

  1. JS高程3.基本概念(3)

    1.ECMAScript数值的范围 由于内存的限制,在大多数浏览器中,ECMAScript能够拿保存的数据的范围是 5e-324 ~ 1.7976931348623157e+308,其中最小的数值保存 ...

  2. JS高程3.基本概念(2)

    1.ECMAScript数据类型 5种简单数据类型,分别是: Undefined Null Boolean Number String 1种复杂数据类型: Object (1)typeof操作符--检 ...

  3. JS高程3.基本概念(1)

    1.语法 (1)ECMAScript中的一切(变量,函数名和操作符)都是区分大小写的. (2)标识符 标识符的第一个字符必须是字母,下划线或是美元符号. 其他字符可以是字母,下划线,美元符号和数字. ...

  4. JS高程3.基本概念(5)语句

    1.if语句 2.do-while语句:后测循环语句,循环体内的代码至少执行一次. 3.while语句:前测循环语句. 4.for语句:前测循环语句. 注意:在ECMAScript中不存在块级作用域, ...

  5. JS高程3.基本概念(6)函数

    1.ECMAScript中的函数使用function关键字来声明. eg: function sum (num1,num2){ alert(num1+num2); } sum(3,7); 注意: 在有 ...

  6. 吃透Javascript数组操作的正确姿势—再读《Js高程》

    Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起<Javascript高级程序设计>来读,把它们一一总结梳理了一下: 方法类别 方法名称 方法描述 参数 返回值 备 ...

  7. 《JS高程》创建对象的7种方式(完整版)

    一.理解对象 ECMA-262定义对象:无序属性的集合,其属性可以包含基本值.对象或者属性. 我们可以把 ECMAScript 的对象想象成 散列表:无非就是一组 名值对,其中值可以是数据或函数. 创 ...

  8. js 高程 函数节流 throttle() 分析与优化

    在 js 高程 22.3.3章节 里看到了 函数节流 的概念,觉得给出的代码可以优化,并且概念理解可以清晰些,所以总结如下: 先看 函数节流 的定义,书上原话(斜体表示): 产生原因/适用场景: 浏览 ...

  9. 《JS高程》事件学习笔记

    事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...

随机推荐

  1. Utility1:Overview

    Utility 是利用,使用的意思,utilization是指使用效率,利用率的意思. SQL Sever 内置 Utility Feature,便于集中监控Server关键资源(CPU和Disk)的 ...

  2. Ado.Net Destination 用法

    Ado Net Destination Component 使用Ado net Connection manager,其Data Access Mode 只有一种, table or view,组件的 ...

  3. 这台计算机上缺少此项目引用的 NuGet 程序包-缺少的文件是 ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 协助开发里面总有几个是极简爱好者,但是呢删了不该删的就会影响项目开发,下面看下完 ...

  4. Razor视图出现重复的解决方法

  5. Qt Undo Framework Demo

    Qt Undo Framework Demo eryar@163.com Abstract. Qt’s Undo Framework is an implementation of the Comma ...

  6. JDBC常用API小结

    建立数据库链接的三种方式: package com.victor_01; import java.sql.Connection; import java.sql.Driver; import java ...

  7. 深入理解 OWIN 中的 Host 和 Server

    The Open Web Interface for .NET (OWIN),注意单词为大写,之前好像都写成了 Owin,但用于项目的时候,可以写成:Microsoft.Owin.*. OWIN 体系 ...

  8. js 对cookie 的操作

    <!DOCTYPE html> <html> <head> <script> function setCookie(cname,cvalue,exday ...

  9. 如何在ios中集成微信登录功能

    在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所 ...

  10. 用CSS制作带图标的按钮

    先上一张效果图