第三章 基本概念 下(操作符、语句、函数)

  ·   JS高设(第三版)   ·   JavaScript     浏览量:

本章内容太长,一分为三(本来一分为二,觉得不吉利,分成了三)本文包括数据类型

3.5 操作符

操作符用于操作数据,包括算数操作符(加减)、位操作符、关系操作符和相等操作符等。

一元操作符

一元操作符就是他每次都要投币一元钱才能操作,而且每次只能操作一个值,就像抓娃娃一样,投一颗币,每次只能抓一个娃娃,hiahiahia。
1.递增递减操作符(--、++)

var num = 666;
//前置
--num;//等同于 num = num - 1,以此类推
++num;
//后置
num--;
num++;

分为前置和后置,区别,看图:
1

前置:先进行递增/减,在执行包含他的语句
后置:先执行包含他的语句之后,再进行递增/减
递增/减操作符还可用于字符串、布尔值、浮点数和对象,规则如下:
  1.包含数字的字符串,转换成数字进行操作
  2.不包含数字的字符串=》NaN
  3.true/false转化成1/0进行操作
  4.浮点数,直接操作
  5.对象,先valueOf()得到数字后进行操作,如果返回NaN,再调用toString()=>返回字符串,参考1,2
22


位操作符

  • 针对二进制的操作,很少用到,暂不详细了解
    1. 按位非(~)
    2. 按位与(&)
    3. 按位或(|)
    4. 按位异或(^)
    5. 按位左移(<<)
    6. 按位右移(>>)

布尔操作符

共三个,或、与、非

  • 逻辑非(!)
    两次非操作相当于Boolean(),任何数据类型,规则如下
    1.对象 => false
    2.空字符串 => true
    3.非空字符串 => false
    4.0 => true
    5.非零(Infinity)=> true
    6.null => true
    7.NaN => true
    8.undefined => false

  • 逻辑与(&&)
    布尔值:true && true => true,其他全为false
    非布尔值:
    1.第一个操作数是对象,返回第二个操作数
    2.第二个操作数为对象,第一个操作数结果为true才返回该第一个对象
    3.两个对象,返回第二个
    4.有一个null/NaN/undefined,返回null/NaN/undefined
    1

  • 逻辑或(||)
    布尔值:false && false => false,其他全为true,也就是有一个为true就为true
    非布尔值:
    1.第一个操作数是对象,返回第个操作数(与是返回第二个)
    2.第一个操作数结果为false,返回第二个操作数
    3.第二个操作数为对象,第一个操作数结果为true才返回该第一个对象
    4.两个对象,返回第个(与是返回第二个)
    5.两个操作数都为null/NaN/undefined,返回null/NaN/undefined

利用逻辑或为变量赋初值,避免出现null或undefined
11


乘性操作符

包括:乘法、除法、求模
若操作数不是数值,会先自动调用Number(),再进行操作

  • 乘法(*)
    1.数值时,和乘法规则一样,超过ECMAScript表示范围时返回(-)Infinity
    2.有一个操作数时NaN,返回NaN
    3.Infinity * 0 = NaN
    4.Infinity * (-)非0 = (-)Infinity
    5.Infinity * Infinity = Infinity
    6.若有一个操作数不是数字,先调用Number(),再看1、2、3、4
    2

  • 除法(/)
    1.数值时,和除法规则一样,超过ECMAScript表示范围时返回(-)Infinity
    2.有一个操作数时NaN,返回NaN
    4.0 / 0 = NaN
    5.Infinity / (-)非0 = (-)Infinity
    6.Infinity / Infinity = Infinity
    7.(-)任何非零有限数 / 0 = (-)Infinity
    8.若有一个操作数不是数字,先调用Number(),再看1~7

22

  • 求模(%)
    就是求余数,var result = 26 % 5结果为1
    1.数字正常求余数
    2.无穷大 % 有限大 => NaN
    3.有限大 % 0 => NaN
    4.Infinity % Infinity => NaN
    5.有限大 % 无穷大 => 被除数
    6.被除数0 => 0
    7.非数字 => Number => 1~6点

加性操作符

包括:加法、减法

  • 加法
    1.数字正常操作
    2.有一个是NaN => NaN
    3.Infinity + Infinity => Infinity
    4.-Infinity + -Infinity => -Infinity
    5.Infinity + -Infinity => NaN
    6.+0 + +0 => +0
    7.-0 + -0 => -0
    8.+0 + -0 => +0
    9.字符串1 + 字符串2 => 字符串1字符串2(直接拼接)
    10.字符串 + 9 => 字符串9(数字变字符串,再拼接)
    11.有一个操作数是对象、数值(为什么还有数值,书上这么写的)或布尔值,调用toString(),再应用1~10
    12.undefined和null也调用toString(),再应用1~10(书上为什么要分开写,直接合并到11不就行了吗,哎,搞不懂)
    13.恕我直言,以上这些规则简直就是,书中JS数百行,皆若智障无所依🙂

  • 减法
    1.数字正常操作
    2.有一个是NaN => NaN
    3.Infinity - Infinity => NaN
    4.-Infinity - -Infinity => NaN
    5.Infinity - -Infinity => Infinity
    6.-Infinity - Infinity => Infinity
    7.+0 - +0 => +0
    8.+0 - -0 => -0
    9.-0 - -0 => +0
    10.字符串、布尔值、null、undefined => Number() => 1~9
    11.对象 => valueOf(),如果得到NaN,就得出结果NaN,若没有valueOf(),调用toString(),再处理字符串进行计算


关系操作符

包括:>、 >=、<、<=
1.数字直接比较
2.两个都是字符串,比较字符编码值
3.有一个是数字,另一个转化为数值进行比较
4.对象调用valueOf(),没有valueOf就调用toString(),进行比较
5.一个是布尔值,转化成数字进行比较


相等操作符

  • 相等(==)、不相等(!=)
    1.布尔值转化为0、1再进行判断
    2.字符串和数值,字符串转数值
    3.有一个是对象,则调用valueOf()
    4.null == undefined
    5.NaN == NaN => false
    6.两个对象,比较是不是同一个对象,两个操作数指向同一个对象才返回true

22


全等(=)、不全等(!

1.他和相等的区别在于,不会再比较之前转换类型
2.为了保持代码数据类型完整,推荐使用全等和不全等

33333


条件操作符

语法和Java相同
4444444444
格式,如上图所示
括号内为条件,条件成立max=num1,不成立等于num2


赋值操作符(=)

=右边的值赋给左边的变量
复合形式:+=、-+、*=、/=、%=、<<=、>>=、>>>=
设计这些操作符主要是为了简化赋值操作,并没有性能的提升


逗号操作符

  • var num1 = 1, num2 = 2, num3 = 3;,声明三个变量
  • var num = (5, 4, 3, 2, 1, 0),声明一个变量,值为0

3.6语句

if语句

if(条件){ 语句1 }else{ 语句2 }
条件自动调用Boolean(),结果为true执行语句1false执行语句2

do while语句

do-while是后测试语句,在循环体执行一次之后,才进行条件判断
do { 语句 } while ( 条件 )
333

while

前测试循环语句,先判断在执行,所以循环可能永远不会被执行
3333333333


for

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

44444

timjie-tu-20180910160711


for-in

for-in是一种精准的迭代语句,可以用来枚举 对象
在循环之前,先检测对象是不是null或者undefined
11


label语句

label可以在代码中添加标签,以便将来使用
label: statment

start: for (var i = 0; i < count; i++){
    alert(i);
}

这个例子中定义的start标签可以在将来由break或continue引用,加标签的语句一般都要与for等循环语句配合使用


break和continue语句

  • break:立刻退出循环
  • continue:退出当次循环

区别如图

22

33

  • 和label一起使用

7

8

如上图,使用break的for循环,在i、j等于5的时候,首先遇到break推出内部循环,然后跳到outermost,让外部循环也停止,此时外部循环了5次加内部循环的5次,所以为55。而使用continue的循环,到i、j等于5的时候,跳到到外层循环,继续下一次循环,所以少了i=5,j=5(5,6,7,8,9)之后的5个循环,因此得出95


with 语句

将代码的作用于设置到一个特定的对象中
格式witdh (expression) statment
实例

    //width使用前
    var  qs = location.search.substring(1);
    var hostName = location.hostname;
    var url = location.href;
    
    //width使用后
    with(location){
        var  qs = search.substring(1);
        var hostName = hostname;
        var url = href;
    }

66
严格模式不能使用此语句,且大量使用width会导致性能下降,同时给调试代码造成困难,因此开发大型应用时,不建议使用


switch语句

如下

    switch (i) {
      case 15:
      /*两个条件合并情况*/
      case 25:
        console.log('15或者25');
        break;
      case 35:
        console.log('35');
        break;
      case 45:
        console.log('45');
        break;
      default:
        console.log('其他');
        break;
    }

通常,每个case都要添加break,避免出现同时执行多个擦色代码的情况,上面已经给出了需要同时判断多个的代码,他等同于

if (i == 15 || i == 25){
  console.log('15或者25');
} else if (i == 35){
  console.log('35');
} else if (i == 45){
  console.log('45');
} else {
  console.log('其他');
}

js的switch语句虽然是借鉴其他语言,但他也有自己的想法,能使用任何数据类型,还可以是变量,甚至表达式
9

10

switch比较值使用全等,因此10和'10',是没有结果的


3.7 函数(function)

  • 语法
function functionName(arg0, arg1,...,argn){
    statment
}

1

如上图,函数调用方式是直接用函数名加圆括号里面的参数,用逗号隔开,return 后是函数的返回值,但他不知必须的,return之后的语句将不会被执行。只写return会返回undefined,一般用来提前停止函数又不需要返回值。
严格模式的一些限制
 1.函数和参数名不能为evaluate、arguments;
 2.不能出项两个相同的参数名

  • 理解参数
    1.ECMAScript不介意传参数个数,也就是说,你定义了两个,但是可以传任意个
    2.参数可以是任意类型
    3.函数内可用通过arguments对象访问参数数组
    4.arguments的值永远与命名参数保持同步
    5.函数参数命名只是提供便利,但不是必须的

2

上图中,函数未定义参数,在内部根据arguments的长度获取参数个数,分别执行不同代码,返回不同结果,也算得上是重载了

3

上图中的arguments[1]被赋值为10,然后将arguments[0]+num2结果为16,而不是12,说明arguments[1]和num2是保持同步的


没有重载

ECMAScript不能像传统意义上那样实现重载,,在其它语言(如Java)中,可以为一个函数编写两个定义,只要定义的签名(参数类型和数量)不同即可
如果在ECMAScript中定义了两个同名函数,前面的将会失效,如下图所示
4

但是可以像之前所说的,通过检查传入参数的类型和数量做出不同的反应,模拟方法重载


--- 第三章 完 ---





收起 >>
第三章 基本概念 下(操作符、语句、函数)