《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
--在赋值中,逗号操作符总会返回表达式中最后一项的值