重学js之JavaScript基本概念(下)=> 运算符

注意: 本文章为 《重学js之JavaScript高级程序设计》系列第三章第三部分【运算符】。

关于《重学js之JavaScript高级程序设计》是从新回顾js基础的学习。

1. 布尔操做符

布尔操做符的重要性堪比相等操做符。布尔操做符一个有3个,非(NOT)、与(AND)、或(OR)前端

1.1 逻辑非

逻辑非操做符由一个叹号(!)表示,能够应用于ES中的任何值。不管这个值是什么数据类型,这个操做符都会返回一个布尔值。逻辑非操做符首先会将它的操做数转换为一个布尔值,而后在对其求反,它遵循如下规则:segmentfault

1. 操做数是一个对象,返回false
2. 操做数是一个空字符串,返回true
3. 操做数是一个非空字符串,返回false
4. 操做数是数值0,返回true
5. 操做数是任意非0数值,返回false
6. 操做数是null,返回true
7. 操做数是NaN,返回true
8. 操做数是undefined,返回true
复制代码

注意:逻辑非也能够用于将一个值转化为与其对应的布尔值。而同时使用两个逻辑非操做符,实际上会模拟Boolean()转型函数的行为。其中,第一个逻辑非操做符会基于不管什么操做数返回一个布尔值,而第二个逻辑非操做则对该布尔值进行求反,因而就获得这个值真正对应的布尔值。数组

!!'blue'    // true
!!0     //  false
!!NaN   //  false
!!''    //  false
!!123   //  true
复制代码

1.2 逻辑与

逻辑与操做符由两个和号(&&)表示,有两个操做数,只有两个操做符都为true的时候,结果才为true,其余都为 false 。以下:函数

操做数 1 操做数 2 结果
true true true
true false false
false true false
false false false

一样,逻辑与操做能够用于任何类型的操做数,而不只仅是布尔值。在有一个操做不是布尔值的状况下,逻辑与操做就不必定返回布尔值,此时遵循以下规则:post

1. 第一个操做数是对象,则返回第二个操做数
2. 第二个操做数是对象,则只有在第一个操做数
的求值结果为true的状况下才会返回该对象
3. 两个操做数都是对象,则返回第二个操做数
4. 有一个操做数是null,则返回null
5. 有一个操做数是NaN,  则返回NaN
6. 有一个操做数是undefined,则返回undefined
复制代码

**注意:**逻辑与属于短路操做,即若是第一个操做数可以决定结果,那么就不会在对第二个操做数求值,对于逻辑与操做来讲。若是第一个操做数是false,那么不管第二个操做数是什么值,结果也不多是true了。另外重要的一点:不能在逻辑与操做中使用未定义的变量,会形成报错。性能

1.3 逻辑或

逻辑或操做符由两个竖线符号(||)表示,有两个操做数,与逻辑与相反,两个操做数只要有个为ture,结果就为true,以下:学习

操做数 1 操做数 2 结果
true true true
true false true
false true true
false false false

与逻辑与类似,若是有一个操做数不是布尔值,逻辑或也不必定返回布尔值,遵循以下下规则测试

1. 第一个操做数是对象,则返回第一个操做数
2. 第一个操做数的求值结果为false,则返回第二个操做数
3. 两个操做数都是对象,则返回第一个操做数
4. 两个操做数都是null,则返回null
5. 两个操做数都是NaN,则返回NaN
6. 两个操做数都是undefined,则返回undefined
复制代码

**注意:**与逻辑与操做符类似,逻辑非操做符也是短路操做符,也就是说,若是第一个操做符的求值结果为 true,那么就不会在区对第二个操做数求值,结果就为 true。编码

2. 乘性操做符

ES 定义了3个乘性操做符:乘法、除法、求模。在操做符为非数值的状况下会自动执行类型转换。若是参与乘法计算的某个操做数不是数值,后台会使用 Number() 转型函数将其转换为数值,空字符会被当作 0,布尔值 true会被当作1.spa

2.1 乘法

乘法操做符(*)表示,用于计算两个数值的乘积。 以下:

var result = 43 * 22
复制代码

**注意:**处理特殊值的状况下,乘法操做遵循如下规则:

1. 操做数都是数值,按照常规执行,若是两个正数或负数
结果仍是正数,若是一正一负则是负数。若是值超过ES的表
示范围,则用 Infinity 或 - Infinity
2. 一个操做数为NaN,结果为NaN
3. Infinity 与 0 相乘,结果为NaN
4. Infinity 与 非0相乘,结果为Infinity 或 - Infinity
5. Infinity * Infinity,结果为Infinity
6. 若是有一个操做符不是数值,则调用Number()进行转换
复制代码

2.2 除法

除法操做符由一个斜线符号(/)表示,执行第二个操做数除第一个操做数的计算。以下:

var result 44 / 33
复制代码

注意: 和乘法相似,处理特殊值的状况以下:

1. 操做数都是数值,按照常规执行,若是两个正数或负数
结果仍是正数,若是一正一负则是负数。若是值超过ES的表
示范围,则用 Infinity 或 - Infinity
2. 一个操做数为NaN,结果为NaN
3. 0 / 0 ,结果为NaN
4. Infinity 被任意值除,结果为Infinity
5. Infinity / Infinity,结果为 NaN
6. 若是有一个操做符不是数值,则调用Number()进行转换
7. 若是是 非0 的有限数被0除,结果是Infinity 或 - Infinity
8. 若是是 Infinity被任何 非0值除,结果是Infinity 或 - Infinity
复制代码

2.3 求模

求模(余数)操做符由一个百分号(%)表示,以下:

var result = 33 % 2
复制代码

**注意:**规则以下:

1. 操做数都是数值,执行常规的除法计算,返回除的余数
2. 被除数无穷大值,结果NaN
3. 被除数是有限大的数值而除数是0,则结果是NaN
4. Infinity 被 Infinity 除,结果NaN
5. 被除数是有限大的数值而除数是无穷大的数值,结果是被除数
6. 被除数是0,结果0
7. 有一个操做数不是数值,则调用Number()转换。
复制代码

3. 加性操做符

加法和减法是最简单的算术操做符。

3.1 加法

var result = 1 + 2

**注意:**规则以下:

1. 有一个操做数是NaN,结果为 NaN
2. Infinity + Infinity, 结果是 Infinity
3. -Infinity + -Infinity, 结果 -Infinity
4. Infinity + -Infinity, 结果为 NaN
5. 0 + 0 = 0
6. -0 + -0 = -0
7.+0 + -0 = +0
8. 若是是两个字符串,则将字符串进行拼接
9. 若是两个有个不是字符串,则将非字符串转换成字符串在拼接。
复制代码

3.2 减法

var result = 1 - 2

**注意:**规则以下:

1. 有一个操做数是NaN,结果为 NaN
2. Infinity - Infinity, 结果是 NaN
3. -Infinity - -Infinity, 结果 NaN
4. Infinity - -Infinity, 结果为 Infinity
5. -Infinity - Infinity, 结果为 -Infinity
6. 0 - 0 = 0
7. -0 - -0 = +0
8. +0 - -0 = -0
9. 若是有一个操做数是字符串、布尔值等则调用number()
进行转换为数值,在操做。
10. 若是一个操做数是对象,则调用valueOf()取得该对象
的值,在计算。若是没有valueOf()方法则调用toString()在计算。
复制代码

4. 关系操做符

小于(<),大于(>),小于等于(<=),大于等于(>=)这几个关系操做符用于对两个值进行比较,比较规则和数学上同样。都返回布尔值。若是使用非数值,会进行数值转换,规则以下:

1. 两个操做数都是数值,则执行数值比较
2. 两个操做数都是字符串, 则比较两个字符串对应的字符编码
3. 一个操做数是数值,则将另一个操做数转换为数值,在比较
4. 一个操做数是对象,则调用这个对象的valueOf()方法,在执行
以前的操做,若是没有这个方法在调用toString()方法。
5. 若是一个操做数是布尔值,则先将其转换为数值,在执行比较
复制代码

**注意:**在比较两个字符串的时候,不是比较字符串中字母在字母表的位置,而是比较当前字母的ASCII码的大小。

5. 相等操做符

肯定两个变量是否相等的关键操做。若是涉及到对象的比较,则先将对象转换成类似的类型。有两种方案 一 相等和不相等,先转换在比较,全等和不全等,仅比较不转换。

5.1 相等和不相等

由符号 (==)表示,若是两个操做数相等,则返回true,不等由符号(!=)表示,不相等的时候返回 true。这两个操做符都回转转换操做数在比较。是强制转换。规则以下:

1. 一个操做数是布尔值,比较以前先将其转换
成数值,false为0,true为1
2. 一个操做数是字符串,另外一个不是,则调用
对象的valueOf()方法,在进行比较
3. 一个操做数是字符串,另外一个操做数是数值,
则将字符串转换为数值在比较
4. null == undefined
5. 比较以前不能将null和undefined转换成其余值。
6. 一个操做数是NaN,则相等返回false,不相等
返回true。若是两个操做数都是NaN, 也是返回false,
由于 NaN != NaN
7. 两个操做数都是对象,则比较是否是同一个对象,
若是是则返回true不然false
复制代码
表达式 表达式
null == undefined true true == 1 true
'NaN' == NaN false true == 2 false
5 == NaN false undefined == 0 false
NaN == NaN false null == 0 false
NaN != NaN false '5' == 5 true
false == 0 true

5.2 全等和不全等

和相等不相等的区别就是比较以前不转换操做数,符号(===)它只有在两个操做数未经转换就相等的状况下返回 true,而(!==)不等于则是两个操做数在未经转换就不相等的状况下返回ture

// 全等
var result1 = ('55' == 55)  // true
var result2 = ('55' === 55) // false

// 不全等
var result1 = ('55 != 55)  // false
var result2 = ('55' !== 55) // true
复制代码

建议:因为相等和不相等操做符存在类型转换问题,因此为了保证代码数据类型的完整,推荐使用全等和不全等。

6. 条件操做符

a = b ? c : d

// 若是b的值是true 那么 a = c 不然 a = d
复制代码

7. 赋值操做符

简单的赋值操做符就是由(=)表示,做用就是把右侧的值赋给左侧的变量

var a = 10

// 若是在 = 的前面加上其余操做符就变成复合赋值操做

var a = 10
a = a + 10 === a += 10

// 复合赋值

(*=)乘
(/=)除
(%=)取模
(+=)加
(-=)减
(<<=)左移赋值
(>>=)有符号右移赋值
(>>>=)无符号右移赋值
复制代码

8. 逗号操做符

var num = 1, a = 2, c =3;
复制代码

9. 语句

语句就是使用一或多个关键字来完成给定任务。

9.1 if 语句

给定执行条件,若是条件符合则执行 if 内的代码块,不然执行 else 中的代码块。

var i = 10
if (i > 9) {
    // i > 9 执行这里
} else {
    // 不然执行这里
}
复制代码

9.2 do-while 语句

一种后测试循环语句,即只有在循环体中的代码执行后,才会测试出口条件,也就是说条件表达式求值以前循环体的代码至少会被执行一次。

var i = 0;
do{
    i += 2
} while(i < 10)
复制代码

9.3 while 语句

属于前测试循环语句,循环内的代码被执行以前,就会对出口条件求值。所以循环体的代码可能永远不会被执行;

var i = 0;
while (i < 10) {
    i += 2
}
复制代码

9.4 for语句

也是一种前测试循环语句,但它具备在执行循环以前初始化变量和定义循环后要执行代码的能力。

var count = 10
for (var i = 0; i< count; i++) {
    alert(i)
}
复制代码

9.5 for-in 语句

是一种精准的迭代语句,能够用来枚举对象的属性,以下:

for (var a in b) {
    alert(a)
}

// 由于ES对象的属性没有顺序,因此经过
for-in输出的属性名顺序也是不可预测的
复制代码

9.6 label语句

使用label语句能够在代码中添加标签

label : a

s: for (var i = 0; i < c; i++) {
    alert(i)
}
复制代码

9.7 break 和 countinue

用于程序在循环中精确地控制代码执行,break会当即推出循环,强制执行循环后面的语句,而countinue虽然也是当即退出循环,可是会从循环的顶部继续执行。

9.8 with语句

将代码的做用域设置到一个特定的对象中,大量使用with语句会致使性能降低,致使调试困难。

var b = a.c
var d = a.d
var u = a.t

with(a){
    var b = c
    var d = d
    var u = t
}
复制代码

9.9 switch语句

流式控制语句,避免写过多的if else 判断。

var i = 2
switch (i) {
    case 2:
        alert(i)
        break;
}
复制代码

10. 函数

经过函数能够封装任意多条语句,并且能够任何地方调用执行。 经过 function来声明,后面跟一组参数以及函数体

function a (b,c){
    alert(b + c)
}

a(2,4)
复制代码

注意: 函数要么始终都返回一个值,要么始终都不返回。

11. 参数

ES中函数不介意传递多少个参数,也不在乎参数的类型。由于在ES的参数在内部是用一个数组来表示,它不会关心这个数组包含什么参数。这个数组也能够为空。在函数体内能够经过 arguments对象来访问这个参数数组。从而得到传递给函数的每个参数。

ES 中 全部的参数传递的都是值,不可能经过引用传递参数。

12. 没有重载

ES 函数不能像传统意义上那样实现重载,由于ES函数没用签名,其餐宿是由包含零或多个值的数组来表示的,没用函数签名,则真正的重载是不可能作到的。

13. 小结

  1. ES的基本数据类型包括 Undefined 、 Null 、Boolean、Number、String
  2. ES中没用为整数和浮点数分别定义不一样的数据类型,Number类型可用于表示全部数值。
  3. ES也有复杂的数据类型,Object类型,该类型是全部对象的基础类型。
  4. ES提供了 算术操做符、布尔操做符、关系操做符、相等操做符、赋值操做符等
  5. ES提供了流控制语句,如 if语句 for语句 switch语句等。
  6. 无须指定函数的返回值,由于任何ES函数均可以在任什么时候候返回任何返回值
  7. 未指定返回值的函数返回的是一个特殊的undefined值,ES中没用函数签名的概念,由于函数参数是以一个包含零或多个值的数组的形式传递的。
  8. 能够向函数传递任意数量的参数,而且能够经过 argument 对象来访问这些参数
  9. 函数不能重载

欢迎关注 公众号【小夭同窗】

重学js系列

重学js之JavaScript简介

重学 JS 之在 HTML 中使用 JavaScript

重学js之JavaScript基本概念(上)=> 数据类型

重学js之JavaScript基本概念(中)=> 操做符

ES6入门系列

ES6入门之let、cont

ES6入门之变量的解构赋值

ES6入门之字符串的扩展

ES6入门之正则的扩展

ES6入门之数值的扩展

ES6入门之函数的扩展

ES6入门之数组的扩展

ES6入门之对象的扩展

ES6入门之Symbol

Git教程

前端Git基础教程

相关文章
相关标签/搜索