《JavaScript高级程序设计》读书笔记(三)基本概念第四小节 操作符

内容
---语法 上一小节
---数据类型 本小节 操作符
---流程控制语句
---理解函数


操作符
--操作数据值的操作符
--算术(如加减)、位操作符、关系、相等
--ECMAScript操作符可以适用于很多类型的值
--在用于对象时,会先调用对象的valueOf()和(或)toString()方法,以便取得可操作的值


一元操作符
--只能操作一个值

--递增操作符 ++
--递减操作符 --
--都有前置和后置

var age = 11;
++age; //12
age++; //12
age; //13
--age; //12
age--; //12
age; //11


一元加减操作符(+-)
--(-)不变,(-)取负
--不仅仅适用于整数,字符串,布尔值,浮点数,对象都适用于
--(+)等同于Number()方法的效果,(-)再取负数
--对于对象先调用valueOf()和(或)toString方法,再转换值

1 +"0.1"; //0.1
2 -"0.1"; //-0.1
3 +"z"; //NaN
4 var o = {
5     valueOf:function() {
6         return 2;
7     }
8 }
9 +o; //2    

位操作符
--按照内存中表示数值的位来操作值
--ECMAScript中数值都是以IEEE754 64位格式存储
--不直接操作64位的值,而是先转换成32位整数,操作完转回64

--有符号整数,前31位 表示值,第32位表示符号,0为正,1为负
--二进制存储
--负数使用二进制补码存储

--正数的原码=反码=补码


--负数
--反码,符号位不变,其余各位取反
--补码,符号位不变,其余各位取反,再加一
--补码,符号位不变,从前面按位取反,最后一个1即后面的0不变

--ECMAScript会尽力向我们隐藏这些信息,
--当我们想要二进制表示负数时
--我们看到的只是这个负数决定之的二进制码前面加了负号

var num = -18;
num.toString(); //-10010,而不是-01110

--ECMAScript所有整数默认有符号位

--对NaN,Infinity值位操作,会被当成0处理
--对非数值位操作,会使用Number()方法


按位非(NOT)(~)
--(~)波浪线表示
--按位取反,包括符号位
--浮点数,小数点后会被忽略

var num1 = 25; //0 0*26 11001 二进制
var num2 = ~num1; //1 1*26 00110 二进制负数的补码(负数的存储形式)
mun2; //-26 转化为负数可见形式
~1; //-2
~1.9; //-2

--本质 操作数的负值减1


按位与(AND)
-- num & num
--两个操作数每一位对其,进行与操作
25 & 25 //25
25 & ~25 //0
25 & -26 //0


按位或(OR)
-- num | num
--两个操作数每一位对其,进行或操作

25 | 25 //25
25 | -26 //-1 每一位全是-1
25 | ~25 //-1 每一位全是-1


按位异或(XOR)
-- num ^ num
-- 不同为真1,相同为假0

 

左移
-- num << index
-- 左移不影响符号位
-- 除符号位其余位向左移动index个位数,用0填补空位

4 << 1 //8 100 -> 1000
2 << 5 //64 10 -> 1000000


有符号右移
-- num >> index
-- 右移不影响符号位
-- 除符号位其余位向右移动index个位数,用符号位填补空位

8 >> 1 //4 1000 -> 100
64 >> 5 //2 1000000 -> 10
-5 >> 1 //-3


无符号右移
-- num >>> index
-- 影响符号位
-- 所有位向右移动index个位数,用0填补空位

64 >>> 5; //2
-64 >>> 5; //134217726



布尔操作符
--非(NOT)、与(AND)、或(OR)

逻辑非
-- !x
-- 可用于所有类型,都会返回一个布尔值,逻辑非对其求反

规则
--对象 false
--空字符串 true
--非空字符串 false
-- 0 true
-- 非0(包括Infinity)false
-- null true
-- NaN true
-- undefined true

--两个非操作等同于Boolean()函数


逻辑与
-- && 正常的布尔与操作

当有一个操作数不是布尔值时
--如果第一个是对象,则返回第二个操作数
--如果第二个是对象,当第一个是true时,返回
--如果都是对象,则返回第二个
--有一个null 返回null
--有一个NaN 返回NaN
--有一个undefined 返回undefined

--短路操作,如果第一个能决定结果,就不再对第二个操作符求值
--即如果第一个为false,则无论第二个取任何值都是false


逻辑或
-- || 正常的布尔与操作

如果有一个不是布尔值时,
--如果第一个是对象 返回之
--如果第一个为false 返回第二个
--两个都是对象,返回第一个
--两个都是null 返回null
--都是NaN 返回NaN
--都是undefined 返回之

--也是短路操作 如果第一个为true 则不会对第二个求值

var res = a1 || a2 || a2;

--返回一个有值的结果,经常使用


乘性操作符
--乘法,除法,求模
--非数值会自动Number()

乘法
-- *
-- 超过范围返回 Infinity或者-Infinity
-- 有一个为NaN 返回NaN
-- Infinity * 0 = NaN
-- Infinity * 非0 = Infinity或者-Infinity 取决于有符号数
-- Infinity * Infinity = Infinity


除法
-- /
-- 超过范围返回 Infinity或者-Infinity
-- 有一个为NaN 返回NaN
-- Infinity / Infinity = NaN
-- 0 / 0 = NaN
-- 非零 / 0 = Infinity或者-Infinity 取决于有符号数
-- Infinity / 非0 = Infinity或者-Infinity 取决于有符号数


求模
-- %
-- Infinity % num = NaN
-- num % 0 = NaN
-- Infinity % Infinity = NaN
-- num % Infinity = num
-- 0 % Infinity = 0


加性操作符
--也会转换不同的数据类型,但是比乘性要复杂

加法
-- +

当为数值类型时
-- 有一个是NaN 返回NaN
-- Infinity + Infinity = Infinity
-- -Infinity + -Infinity = -Infinity
-- Infinity + -Infinity = NaN
-- +0 + -0 = +0
-- -0 + +0 = +0
-- +0 + +0 = +0
-- -0 + -0 = -0

如果有一个是字符串
--都是字符串 则拼接
--只有一个是字符串,则把另一个转化为字符串再拼接
--转型按照String() 转型函数(所以有:把某个值 + "" ,等同于String())


减法
-- (-)
-- 有一个NaN 返回NaN
-- Infinity - Infinity = NaN
-- -Infinity - -Infinity = NaN
-- Infinity - -Infinity = Infinity
-- -Infinity - Infinity = -Infinity
-- +0 - +0 = +0
-- -0 - -0 = +0
-- +0 - -0 = +0
-- -0 - +0 = -0
--如果不是数值,会调用Number()转换


关系操作符
-- 小于(<)、大于(>)、小于等于(<=)、大于等于(>=)
--返回布尔值
--都是数值则数值比较
--都是字符串则比较字符串对应的字符编码
--如果一个是数值,则将另一个转换为数值参照Number()方法
--如果是布尔值,也转换

--字符串比较时,比较对应位置的每个字符串字符编码
--大写字母(65~90[A-Z])小于小写字母(97~122[a-z])

奇怪的情况

"23" < "3" //true
"23" < 3 //false
"a" < 3 //false
NaN < 3 //false
NaN >= 3 //false

--有一个NaN,则不管怎么比较结果都是false
-- +(null) = 0, +(undefined) = NaN


相等操作符
--相等不相等(==、!=)、全等不全等(===、!==)

相等不相等(==、!=)
-- 会被强制转换,再比较相等性

--如果有一个是布尔值,则先转换为数值 true-1,false-0
--有一个字符串,另一个数值,则字符串转换为数值
--一个对象,另一个不是则调用对象的valueOf()方法 用得到的基本类型比较

--null == undefined true(undefined派生自null)
--在比较相等性之前不能将null,undefined转化为其他值
--有一个为NaN,==false , != true,两个都为NaN也是
--对象比较,判断是不是同一对象


全等和不全等(===、!==)(推荐使用)
--不提前转化类型
--类型不同返回false
--null===undefined false
--对象比较,同相等不相等


条件操作符(三目运算)
variable = boolean_expression ? true_value : false_value;


赋值操作符(=)
--右边赋值给左边

复合赋值操作
--简化赋值操作,但是不会带来性能提升
-- +=
-- -=
-- *=
-- /=
-- <<=
-- >>=
-- >>>=

var num = 10;
num = num + 5;
//同
num += 5;


逗号操作符
--在一条语句中执行多个操作

vat num1=1, num2=2,num3, num4=4;
--通常用于声明多个变量,可赋值

var num = (3, 2, 3, 5, 6); //num=6
--在赋值中,逗号操作符总会返回表达式中最后一项的值

原文地址:https://www.cnblogs.com/loveluking/p/9430839.html