表达式,运算符是程序的基础,最简单的
var myName="zhuanbang";
这个就是一个表达式,把等号右边的字符串,赋值到左边myName这个变量名上;表达式在各个类型里会介绍,这里主要总结运算符;
大多数的运算符是有+-==这种标点符号来表现,但是也有一些运算符是由关键字表示的,比如delete和instanceof,不过无论标点符号表示的运算符还是关键字表示的运算符,都是合法的运算符;
类似生活中的,加减乘除,是对程序的操作;但是需要注意的是,数学里面的加减乘数等都是对数字而言的,但是在JS里这些都是可以对不同的数据进行操作的,当然这些也是包括数字类型的;
ECMAScript里用于操作数据值的运算符也叫操作符,只是叫法不同,包括算术运算符,位运算,关系运算,相等运算;这些都是可以针对不同类型的值的(比如字符串,数值,布尔,对象)
需要牢记一点:应用对象的时候,运算符通常会调用对象上的valueOf或者toString方法,转成字符串后再次进行操作;
需要注意一点:NaN和任何数操作,结果都返回NaN;
算术运算符包括:+-*/%;
复合赋值运算符:+=、-=、*=、/=、%=
-
-
功能: - 1、对数字进行代数求和 - 2、对字符串进行连接操作 - 3、将一个数值转换成字符串
-
字符串拼接 - 字符串+字符串---两者直接拼接 - 字符串+数值---数值转为字符串再拼接 - 如果有一个操作数是对象、数值或布尔值,则调用它们的 toString() 方法取得相应的字符串值,然后再应用前面关于字符串的规则。
var strEmpty=""; var testNum=222; var targetData=strEmpty+testNum; console.log(typeof testNum);//number console.log(typeof targetData);//string //多次运算 var testOne="字符串"; console.log(testOne+2+5);//字符串25 console.log(testOne+(2+5));//字符串7
-
如果数值和字符串一起混,数值类型的用()包裹,提高优先级;否则是字符串+2;计算的结果再+5;
-
- 功能:
- 对操作数进行”取反”操作
- 对数字进行减法操作
- 将字符串转换成数值--数值型字符串-0;
- 功能:
-
- 功能:对两个运算数进行乘法(除法)运算;
- 符号问题:同号得正,异号得负;
- 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。
- 如果有一个操作数是 NaN ,则结果是 NaN ;
-
-
功能:返回两个除数的余数
-
符号问题:和第一个运算数的符号相同;
-
如果被除数是零,则结果是零;
-
如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。
var times=123453;//求多少分,多少秒; var targetTime=parseInt(times/60)+"分"+times%60+"秒"; console.log(targetTime); //思考:等于多少天,多少小时,多少分,多少秒
-
运算符通常会根据需要对操作数进行类型转换;比如【*】【/】的时候,可以把字符串转为数值;
console.log("5"+"3");//53
console.log("5"-"3");//2
console.log("5"*"3");//15
console.log("15"/"3");//5
=:赋值
var a=10;
+=:加赋值
x+=y // x=x+y;
-=:减赋值
x-=y // x=x-y;
*=:乘赋值
x*=y // x=x*y;
/=:除赋值
x/=y // x=x/y;
%=:取余赋值
x%=y // x=x%y;
注意:++i和i++是完全两回事;(递增和递减操作符直接借鉴自 C,而且各有两个版本:前置型和后置型。)
- 功能相反
- ++ 对唯一的运算数进行递增操作(每次加1)
- -- 对唯一的运算数进行递减操作(每次减1)
- 规则相同
- 运算数必须是一个变量,数组的一个元素或者对象的属性
- 如果运算数是非数值的则运算符将它转成数值;(可用于字符串,布尔值,浮点数值和对象)
- 转换规则是,调用用Number,根据转后的值,再次进行运算;
- 符号位置决定运算结果
-
运算数之前,先进行递增(递减)操作,再进行求值;
-
运算数之后,先求值,再进行递增(递减操作;)
var num1=20, num2= 2, num3=30; var num4=num1--+num2, num5=num1+num2, num6=--num3+num2, num7=num3+num2; console.log(num4 ,num5);//22,21 console.log(num6 ,num7);//31,31 var num=0; num=num+2; num=num*3; num=num/2; num++; num--; num+=1; num-=2; num*=3; num/=2; num%3; console.log(num);
-
###大小关系检测
- <
- 如果A小于B,则返回true,否则返回值为false;
- <=
- 如果A小于等于B,则返回值为true,否则返回false
- >=
- 如果A大于等于B,返回true,否则返回值为false
- >
-
如果A大于B,则返回true,否则返回值为false
//关系操作符 var testNum=3; console.log("下面是关系操作符"); console.log(testNum>1); console.log(testNum>=1); console.log(testNum<1); console.log(testNum<=1);
-
-
数值与数值的比较,比较他们的代数值;
-
仅一个运算数是数值,将另一个运算数转换成数值,并比较他们的代数值;
-
字符串间的比较,逐字符比较他们的Unicode数值;//""
-
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;(只要有一个是数值,另外一个无论什么值,都会最终转为数值后再比较)
-
运算数既非数字也非字符串,返回值为fals e;
-
与NaN比较,返回值是false;
console.log("20">"100000");//true console.log(null>2);//false console.log(NaN>2);//false
注意:做关系比较的时候,一定要把值全部转为数值,这是一个很好的习惯;一定要避免2个字符串在一起比较大小;
#####相等比较
- 操作符
- == 比较两个运算数的返回值看是否相等;(和正常生活中的=一定要区分开;)
- != 比较两个运算数的返回值看是否不想等;
- 类型转换
- 布尔值
- True 1;
- False 0;
- 对象,调用valueOf() 基本类型
- 字符串与数值的比较,字符串转换为数值;
- 布尔值
- 比较原则
- Null与undefined;相等,比较前不做任何转换;
- NaN,与任何数值都不想等,包括其自身;
- 对象,是否属于同一个对象
-
是 ==
-
否 !=
var testNum=3; console.log("下面是关系操作符"); console.log(testNum==1); console.log(testNum===1); console.log(testNum!=1);
-
//转换分析1
console.log("zhuanbang"?true:false);//true,因为非空的字符串是一个真值;
//转换分析2
console.log("zhuanbang"==true);//这个时候输出什么呢?在分析一里非空字符串是一个true,那么非空字符串==true吗?
//转换分析3
console.log("zhuanbang"==false);//如果上面的的返回不是true,那么这个会返回true吗?
//下面的分析的步骤;
/*转换分析2-解析
* 1、右边的布尔值会转为数字,true->1;"zhuanbang"==1
* 2、左边的字符串会转为数字,"zhuanbang"因为里面有字母,所以转换为NaN;NaN==1
* 3、NaN和任何数据都不想等,包括自己,所以结果是false,并不是true;
* */
/*
* 1、右边的布尔值会转为数字,false->0;"zhuanbang"==0
* 2、左边的字符串会转为数字,"zhuanbang"因为里面有字母,所以转换为NaN;NaN==0
* 3、NaN和任何数据都不想等,包括自己,所以结果是false,结果也不是true
* */
- 运算符
- === 比较两个运算数的返回值以及数据类型是否相同;
- !== 比较两个运算数的返回值以及数据类型是否不相同
- 比较原则
- 值类型间比较,只有数据类型相同,且数值相等时才能够相同;
- 值类型与引用类型比较,肯定不相同,
- 引用类型间的比较,比较他们的引用值(内存地址)
简单的说,就是x和y比较,如果两者的类型不同,那就没有比较的意义了,直接返回false;
//相同的小分析
console.log("zhuanbang"===true);
console.log("1"===1);
console.log("zhuanbang"==="zhuanbang");
var person1={name:"zhuanbang"};
var person2={name:"zhuanbang"};
console.log(person1===person2);//false, 是不同的引用地址;在堆内存中储存是不一样的;
-
In 判断左侧运算数是否为右侧运算数的成员;
-
Instancesof 判断对相爱呢个实例是否属于某个类或构造函数
-
New 根据构造函数创建一个新的对象,并初始化该对象
-
Delete 删除指定对象的属性,数组元素或变量
-
可以删除对象里的属性:
var myObj = {name: 'aaaa', age: 21}; delete myObj.age; console.log(myObj); // 输出对象{name: "aaaa"}
-
-
.及[] 存取对象和数组元素
-
() 函数调用,改变运算运算符优先级等;
在JavaScript中,true和false有些复杂。在大多数编程语言中,布尔值true和false仅仅表示true/false。在JavaScript中,如"ssss"这样的字符串值,也可以看作true。
- 返回值
-
True(表达式或值计算为false的,都可以转为true)
- 空字符串
- 0
- -0;
- NaN
- Null
- Undefined
- False
-
False(表达式或值计算为true的,都可以转为false)
- 对象
- 非空字符串
- 非0数值(Infinity)
-
- 特性;
-
如果运算数的值为false则返回true,否则返回false;
-
连续使用两次,可将任意类型转为布尔类型值;(!!相当于Boolean)
console.log(!true);//false console.log(true && false);//false console.log(true || false);//true
-
- 只有第一个值是true的时候,才会返回第二个值;第一个值为false,则返回第一个值;意是根据原理来返回的;&&是必须两个都为true才为true的;看取决于哪个值的
- 第一个操作数的对象,返回第二个操作数(第一个为true了,关键取决于第二个值,所以返回第二个)
- 第二个操作数是对象,如果想返回第二个对象,第一个必须为true;
- 如果两个操作数都是对象,第一个是true,则返回第二个操作数;
- 第一个操作数是null,返回null(第一个null已经是false了,后面第二个值无论是true-还是false已经不重要了,所以返回的是第一个值)
- 第一个操作数是NaN,返回NaN(原理同上)
- 第一个操作数是undefined,返回undefined(原理同上)
- 当且进档两个运算数的值都是true时,才返回true,否则返回false(做if判断的时候)
- 短路操作,当第一个操作数的值是false,则不再对第二个操作数进行求值(做变量赋值的时候)
- 规则:
- 两个操作数都是false的时候才为false;第一个操作数是true,则返回第一个数;无需对第二个值判断了,已经可以确定为true;如果第一个值为false的时候,返回第二个数;因为第一个已经是false了,值取决于第二个值,所以返回第二个值;
- 第一个操作数是对象,返回第一个操作数
- 第一个操作数值为false,返回第二个操作数
- 两个操作数都是对象,返回第一个操作数
- 两个操作数都是null,返回null;
- 两个操作数都是NaN,返回NaN;
- 两个操作数都是undefined,返回undefined
- 特性:
-
当且进档两个运算数的值都是false时,才会烦false,否则返回true;
-
如果第一个操作数值为true,则不会对第二个操作数进行求值;
var a="", b="B有值"; var result=a||"A的值是假的", result2=b||"B的值是假的"; console.log(result); console.log(result2);
-
(仅作了解,可以忽略不看,项目中很少用到);
- 基础知识;
- 类型;
- 有符号;
- 数值位,前31位;
- 符号位,第32位;
- 0,整数
- 1,负数
- 无符号;
- 只能是正数
- 第32位表示数值
- 数值范围可以加大
- 有符号;
- 数值范围;-2147483648~2147483647
- 存储方式
- 正数
- 纯2进制存储
- 31位表示数值
- 数值范围可以加大
- 负数
- 2进制补码存储
- 补码的计算步骤
- 1、确定该数字的非负版本的二进制表示
- 2、求得二进制反码,既要把0替换为1,把1替换为0;
- 3、在二进制反码上加1;
- 正数
- 当作0来处理的特殊值
- NaN
- Infinity
- 类型;
- 逻辑位运算
- 返回值为1,
- 按位非~ 0
- 按位与& 对应值全为1
- 按位或| 任何一位是1
- 按位异或^ 既不同时为0,也不同时为1;
- 返回值为0;
- 按位非~ 1
- 按位与& 任何一位是0
- 按位或| 对应位全0;
- 按位异或^ 对应位全0或全1
- 返回值为1,
- 位移操作
- 左移<<
- 将数值的所有位左移指定的位数
- 所有空位用0补充
- 左移1位对其X2,左移2位对其X4;依次类推;
- 有符号右移>>
- 将数值的所有位右移指定的位数
- 一处的位被舍弃
- 保留符号位
- 右移一位对齐除2,右移两位对齐除4,依次类推
- 无符号右移>>>
- 正数,与有符号右移结果相同
- 负数,会出现无限大的数值;
- 左移<<
- 复合赋值运算符:位操作符与等号结合,复合赋值不会有性能方面的提升;
& 按位与
| 按位或
~ 按位非
^ 按位异或
<< 按位左移
按位右移
- ?: 条件运算符,简介的if else;也叫三元运算符/三目运算符;
-
基本格式为:条件表达式?表达式一:表达式二;
-
其中问号之前的表示判断的条件,如果这个条件为真,则执行问号后面的语句,如果判断条件不成立,则执行冒号后面的语句;
-
简单的条件可以用三目运算符写;
function trueOrFalse(val) { return val?console.log(val+" is true"):console.log(val+" is false") } trueOrFalse(null); trueOrFalse(undefined); trueOrFalse(0); trueOrFalse(NaN); trueOrFalse(-0);//0===-0 trueOrFalse(false); trueOrFalse(""); trueOrFalse(" "); trueOrFalse({}); trueOrFalse([]); trueOrFalse(1);
-
三元/三目是根据操作数的个数来分的,比如 a-b,计算2个数属于二元元算数,而-b就是一元运算符(将操作数b求负数,只操作b这个一个数);而?:是计算三个数的,所以叫三元运算符;
而三目是三元的另外一种叫法
上面的利用三元运算符来判断值的真假;
-
typeof,类型判定运算符
console.log('typeof num:', typeof num); console.log('typeof Packt:', typeof 'aaaaaa'); console.log('typeof true:', typeof true); console.log('typeof [1,2,3]:', typeof [1,2,3]); console.log('typeof {name:John}:', typeof {name:'sssss'});
-
,逗号,在一行语句中执行多个不同的操作 ,一般用于声明多个变量;
-
忽略第一个操作符,返回第二个操作符;
var a=, b=4, c=5; var test=1,2,3,4,5,6,7;//结果test的值是7;
-
-
void,舍弃运算数的值,返回undefined作为表达式的值;
千万不要把"=="当做"="来使用,
千万不要把"=="当做"="来使用,
千万不要把"=="当做"="来使用,尤其是写if语句的时候一定要注意;
- =、一个等号是赋值运算,把等号右边的值付给左边的变量,是从右想做计算,并且运算优先级最低;
- ==。两个等号是比较运算,会得到一个真/假的逻辑只,遇到左右两边是不同的数据类型,默认会进行数据类型转换;
- ===、三个等号是绝对的相等,只有数据类型一样才有可比性,遇到左右两边数据类型不同,并不会像==一样进行数据类型转换;
- !是取反的意思;先将其它的数据类型转换为布尔类型;然后在取反;
- !!是将其他的数据类型转换为不二类型,相当于Boolean;
记住前面说的哪些数据是真,哪些是假就可以了;
0 NaN "" null undefined这些用都是flase
- 如果操作数是一个对象,返回 false ;
- 如果操作数是一个空字符串,返回 true ;
- 如果操作数是一个非空字符串,返回 false ;
- 如果操作数是数值 0,返回 true ;
- 如果操作数是任意非 0 数值(包括 Infinity ),返回 false ;
- 如果操作数是 null ,返回 true ;
- 如果操作数是 NaN ,返回 true ;
- 如果操作数是 undefined ,返回 true 。
- 写一个计算器案例;
- 表格排序案例;
下面图片是截自权威指南,体现运算符的优先级;
- 123567秒转X分X秒;
- if(a=2){console.log(“””)}; ==不要混淆成=;
- var timers=213123123;是多少分,多少秒;