JS高程3.基本概念(4)操作符
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)操作符的更多相关文章
- JS高程3.基本概念(3)
1.ECMAScript数值的范围 由于内存的限制,在大多数浏览器中,ECMAScript能够拿保存的数据的范围是 5e-324 ~ 1.7976931348623157e+308,其中最小的数值保存 ...
- JS高程3.基本概念(2)
1.ECMAScript数据类型 5种简单数据类型,分别是: Undefined Null Boolean Number String 1种复杂数据类型: Object (1)typeof操作符--检 ...
- JS高程3.基本概念(1)
1.语法 (1)ECMAScript中的一切(变量,函数名和操作符)都是区分大小写的. (2)标识符 标识符的第一个字符必须是字母,下划线或是美元符号. 其他字符可以是字母,下划线,美元符号和数字. ...
- JS高程3.基本概念(5)语句
1.if语句 2.do-while语句:后测循环语句,循环体内的代码至少执行一次. 3.while语句:前测循环语句. 4.for语句:前测循环语句. 注意:在ECMAScript中不存在块级作用域, ...
- JS高程3.基本概念(6)函数
1.ECMAScript中的函数使用function关键字来声明. eg: function sum (num1,num2){ alert(num1+num2); } sum(3,7); 注意: 在有 ...
- 吃透Javascript数组操作的正确姿势—再读《Js高程》
Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起<Javascript高级程序设计>来读,把它们一一总结梳理了一下: 方法类别 方法名称 方法描述 参数 返回值 备 ...
- 《JS高程》创建对象的7种方式(完整版)
一.理解对象 ECMA-262定义对象:无序属性的集合,其属性可以包含基本值.对象或者属性. 我们可以把 ECMAScript 的对象想象成 散列表:无非就是一组 名值对,其中值可以是数据或函数. 创 ...
- js 高程 函数节流 throttle() 分析与优化
在 js 高程 22.3.3章节 里看到了 函数节流 的概念,觉得给出的代码可以优化,并且概念理解可以清晰些,所以总结如下: 先看 函数节流 的定义,书上原话(斜体表示): 产生原因/适用场景: 浏览 ...
- 《JS高程》事件学习笔记
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
随机推荐
- salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)
此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...
- bootstrap与Select2使用小结
这个select2组件的功能确实很强大,可以将图片放入到select里面随着文字一起显示. 组件的下载地址以及API说明地址: 1.Select2使用示例地址:https://select2.gith ...
- python中configparser模块
python中的configparse模块的使用 主要用来解析一些常用的配置,比如数据配置等. 例如:有一个dbconfig.ini的文件 [section_db1] db = test_db1 ho ...
- 使用hexo搭建github.io博客(一)
使用github.io可以搭建一个自己的博客,把静态文件项目托管到github上,可以写博客,可以使用markdown语法,也可以展示作品.灵活性高.但是有较大的难度. node,git版本变化日新月 ...
- C#设计模式系列:原型模式(Prototype)
1.原型模式简介 1.1>.定义 原型模式(Prototype)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 1.2>.使用频率 中 1.3>.原型模式应用 首先 ...
- 【Win 10 应用开发】打印UI元素
Windows App支持将UI界面进行打印的功能,这与浏览器中的打印网页的用途相近,其好处就是“所见即所得”,直接把界面上呈现的内容打印下来,比重新创建打印图像方便得多. 要在通用App中实现打印, ...
- bootstrap走动的进度条
1.页面效果: 起始位置:
- lintcode 最长上升连续子序列 II(二维最长上升连续序列)
题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 I ...
- C# 打印PDF文件之使用不同打印机打印所有页面或部分页面
C# 打印PDF文件之使用不同打印机打印所有页面或部分页面 最近在逛国外各大编程社区论坛的时候,发现很多人都在问一个关于PDF文件打印的问题:打印时如何选择非默认打印机并设置打印页面的范围.而一般情况 ...
- C++ 连接数据库的入口和获取列数、数据
这里不具体放出完整的程序,分享两个核心函数: 由于这里用到的函数是编译器自己的库所没有的,需要自己下载mysql.h库或者本地有数据库,可以去bin找到,放进去. 前提,我自己的测试数据库是WampS ...