第二章

  1. ECMAScript中的一切(变量,函数名和操作符)都是区分大小写的。
  2. 标识符是指变量,函数或属性的名字,或函数的参数。命名规则是:
    • 第一个字符必须是字母,下划线(_)或美元符号($)
    • 其他字符可以是字母,下划线,美元符号或数字
    • 推荐使用驼峰大小写格式命名,即第一个单词字母小写,后面的每个单词首字母大写。如:myCar
  3. 严格模式,即"use strict"
  4. 在函数中使用var声明的变量为局部变量,当这个函数退出后,这个变量就会被销毁。
  5. 基本数据类型:undefined,null,boolean,number,string
  6. 复杂类型:object
  7. 使用typeof可以检测出变量的数据类型
    • undefined --- 值undefined
    • boolean --- 值是布尔值
    • string --- 值是字符串
    • number --- 值是数值
    • object --- 值是对象或null(null值被认为是一个空的对象引用)
    • function --- 值是函数
  8. undefined值是指有声明变量但未对其进行初始化时,这个变量的值就是undefined值。但对于未初始化的变量和未定义的变量进行typeof操作符时都会返回undefined。
  9. null值:如果定义的变量准备在将来用作保存对象,那么这个变量的值最好保存为Null值。这样直接检测Null值就可以知道相应的变量是否已经保存了一个对象的引用。
    • undefined值派生于null值--->console.log(undefined == null);//ture
    • 只要意在保存对象的变量还没真正保存对象,就应该明确的让这个变量保存为null值
  10. Boolean值:
  • true不一定等同于1,false不一定等同于0

  • true和false是区分大小写的。就是说Ture和False(以及其他混合大小写)都不是boolean值,只是标识符

  • 所有类型的值都有与这两个Boolean值等价的值。可以调用转型函数Boolean(),可以对任何类型的值使用这个。

    Boolean true false
    string 任何非空字符串 ""
    number 任何非零数值(包括无穷大) 0和NAN
    object 任何对象 Null
    undefined 不适用 undefined
  1. number值:
  • 八进制字面值的第一位必须是0,然后是八进制数字序列(0-7).如果字面值中的数值超出了范围,那么前导0将会被忽略,后面的值被当成十进制数值解析。
  • 十六进制字面值的前两位必须是0x,后面跟任何十六位进制数字(0-9以及a-f)。字母大小写都可。
  • 浮点数值的最高精度是17位小数。浮点数字在某些情况下会自动转换为整数值,是为了节省内存空间。
  1. NaN值:
  • 任何数值出一非数值会返回NaN,但并不会影响代码执行。
  • NaN与任何值都不相等,包括和它自己都不相等
  • isNaN()接受任何类型的参数,会告诉我们这个值是不是数值
  1. 数值转换
  • Number()方法
    1. Boolean值,true和false值分别转换为1和0
    2. null值返回0
    3. undefined值返回NaN
    4. 如果是字符串,则有以下规则:
      1. 如果只包含数字(包括前面带正负号),则可以将其转换为十进制数值,而“001”则会变成11
      2. 包含有效的浮点格式,如“1.1”则会将其转换成对应的浮点数值(会忽略前导0)
      3. 包含有效的十六进制格式,如“0xff”,则会将其转换为相同大小的十进制整数值
      4. 字符串是空的,则会转换为0
      5. 包含有除上述以外的字符,则都转换为NaN
  • parseInt()方法
    1. 会忽略字符串前面的空格,直至找到第一个非空字符。
    2. 如果第一个字符不是数字字符或者负号,就会返回NaN。
    3. 对空字符串也会返回NaN。
    4. 如果第一个字符是数字字符,那么会继续解析,直到解析完所有后续字符或遇到了一个非数字字符。
    5. 如果第一个字符是数字字符,那么它能识别出各种整数格式(十进制,八进制,十六进制)
    6. 还可以提供第二个参数,即转换时使用的基数(即多少进制)。当使用了第二个参数后,就可以不用带有0x或0了。
  • parseFloat()方法
    1. 只解析十进制,所以没有第二个参数。
    2. 从第一个字符开始解析,一直解析到字符串末尾或者遇见一个无效的浮点数字字符。
    3. 始终会忽略前导0,就是说十六进制格式的字符串始终会被转换成0。
  1. String类型
  • 了解几个常用的字符字面量
    1. \n 换行
    2. \t 制表
    3. \b 退格
    4. \r 回车
    5. \\ 斜杠
    6. \' 单引号
    7. \" 双引号
  • 任何字符串的长度都可以通过访问其length属性来取得。
  • 字符串是不可变的。一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先会销毁原来的字符串,再用另一个包含新值的字符串来填充该变量。
  • 转换为字符串的两种方式
    1. toString()
      1. 数值,布尔值,对象和字符串值都有这个方法
      2. null和undefined值没有这个方法
      3. 多数情况下可以不传递参数。但当调用数值的toString()方法时,可以传递一个参数:输出数值的基数。
    2. String()
      1. 可以将任何类型的值转换为字符串。
      2. 如果值有toString方法,则调用该方法(没有参数)并返回相应的结果。
      3. 如果值是null,则返回"null"。
      4. 如果值是undefined,则返回"undefined"。
  1. Object类型
    • Object类型所具有的任何属性和方法同样存在于更具体的对象中。就是说Object的每个实例都具有以下方法和属性:
      1. constructor:保存着用于创建当前对象的函数
      2. hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。作为参数的属性名必须以字符串形式指定。
      3. isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。
      4. propertyIsEnumerable(propertyName):用于检查给定的属性是否能用for-in语句来枚举。作为参数的属性名必须以字符串形式指定。
      5. toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
      6. toString():返回对象的字符串表示。
      7. valueOf():返回对象的字符串,数值或布尔值表示。
  2. 操作符
    1. 一元操作符

      • 递增和递减操作符
        1. ++a;--a; 前置递增,前置递减。执行时,变量的值都是在语句被求值之前改变的。
        2. a++;a--; 后置递增,后置递减。执行时,变量的值都是在语句被求值之后改变的。
        3. 这四个操作符对任何值都适用。就是说还可用于字符串,布尔值,浮点数值和对象。但有不同的规则:
          1. 在应用于一个包含有效数字字符的字符串时,会先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
          2. 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN,字符串变量变成数值变量。
          3. 在应用于布尔值false和true时,分别将其转换为0和1再进行操作。布尔值变成数值变量。
          4. 在应用于浮点数值时,直接执行加减1的操作。
          5. 在应用于对象时,先调用对象的valueOf()方法,取得一个可以操作的值,然后对该值应用前述规则。如果结果是NaN,那么再调用toString()方法后再应用前述规则。对象变量变成数值变量。
      • 一元加减操作符(+ -)
        1. +号放在数值前无影响。但放在非数值前,转换方法形同Number()。
        2. -号放在数值之前会变为负数。放在非数值之前,同上。
    2. 位操作符

      1. ECMAScript中所有数值都是以IEEE-754 64位格式来存储。但位操作符不直接操作64位的值,而是先将64位的值转换为32位的整数,再执行操作,最后再转换回64位。
      2. 默认情况下,ECMAScript中的所有整数都是有符号整数。
      3. 对于有符号整数,32位中的前31位用来表示整数的值。第32位用来表示数值的符号:0表示正数,1表示负数。表示符号的叫做符号位。
      4. 正数用纯二级制格式存储。负数同样以二级制码存储,但使用的格式是二进制补码。
      5. 求一个二进制补码的步骤:
        1. 求这个数值绝对值的二进制码(如要求-18的二级制补码,先求18的二级制码)。
        2. 求二进制反码,即将1替换为0,将0替换为1。
        3. 将得到的二进制反码加1
      6. 对于NaN和Infinity值都将会被当成0处理
      7. 对于非数值应用位操作符,会自动调用Number()方法将该值转换为数值再进行计算。
      8. 非(NOT ~):返回数值的反码。本质是操作数的负值减一。
      9. 与(AND &):将两个数值的每一位对齐,然后对相同位置上的数值执行以下操作:只在两个数值的对应位都是1才返回1。任何一位是0,结果都是0。
        第一个数值的位 第二个数值的位 结果
        1 1 1
        1 0 0
        0 0 0
        0 1 0
      10. 或(OR |):将两个数值的每一位对齐,然后对相同位置上的数值执行以下操作:在有一位是1的,结果就为1。只有在两个都是0的情况下结果才是0。
      第一个数值的位 第二个数值的位 结果
      1 1 1
      1 0 1
      0 1 1
      0 0 0
      1. 异或(XOR ^):将两个数值的每一位对齐,然后对相同位置上的数值执行以下操作:在两个数值对应位上只有一个1时才返回1。如果对应位两个都是1或0,则返回0。
      第一个数值的位 第二个数值的位 结果
      1 1 0
      1 0 1
      0 1 1
      0 0 0
      1. 左移(<<):将数值的所有位向左移动指定的位数。
        1. 左移操作会以0来填补这些空位,以便结果是一个完整的32位二进制数。如将数值2(二进制10)左移5位得到64(二进制1000000)。
        2. 左移不会影响操作数的符号位。如将-2左移5位得到-64。
      2. 有符号的右移(>>):将数值向右移动,但保留符号位(即正负号)。在位移过程中,原数值出现空位是用符号位的值来填充。
      3. 无符号的右移(>>>):将数值的所有32位都向右移动。在位移的过程中,原数值出现空位是用0来填充空位。
    3. 布尔操作符

      1. 逻辑非(!):可应用于任何值。使用这个操作符都会返回一个相反的布尔值。转换规则如下:

        1. 对象-->false
        2. 空字符串-->true
        3. 非空字符串-->false
        4. 数值0-->true
        5. 任意非0数值(包含Infinity)-->false
        6. null-->true
        7. undefined-->true
        8. 可同时使用两个该操作符,其作用类似于Boolean()
      2. 逻辑与(&&):可应用于任何类型的操作数。

        • 如果两个值都是布尔值,那么会返回布尔值。真值表如下:
        第一个操作数 第二个操作数 结果
        true true true
        false false false
        true false false
        false true false
        • 如果有一个操作数不是布尔值,那么就不一定会返回布尔值。规则如下:
          1. 第一个操作数是对象,则返回第二个操作数。
          2. 第二个操作数是对象,则只有在第一个操作数的求值结果为true时才会返回该对象。
          3. 两个操作数都是对象,则返回第二个操作数。
          4. 第一个操作数是null,则返回null。
          5. 第一个操作数是undefined,则返回undefined。
          6. 第一个操作数是NaN,则返回NaN。
        • 可以看出,这是类似于一个短路操作。即第一个操作数是false,那么无论第二个操作数是什么值,结果都只为false。就是说,只要第一个操作数能决定结果,就不会再对第二个操作数进行求值。
      3. 逻辑或(||):可应用于任何类型的操作数。

        • 如果两个值都是布尔值,那么会返回布尔值。真值表如下:
        第一个操作数 第二个操作数 结果
        true true true
        false false false
        true false true
        false true true
        • 如果有一个操作数不是布尔值,那么就不一定会返回布尔值。规则如下:
          1. 第一个操作数是对象,则返回第一个操作数。
          2. 第一个操作数的求值结果为false,则返回第二个操作数。
          3. 两个操作数都是对象,则返回第一个操作数。
          4. 两个操作数都是null,则返回null。
          5. 两个操作数都是undefined,则返回undefined。
          6. 两个操作数都是NaN,则返回NaN。
        • 可以看出,这是类似于一个短路操作。即第一个操作数是true,那么无论第二个操作数是什么值,结果都只为true。就是说,只要第一个操作数能决定结果,就不会再对第二个操作数进行求值。
    4. 乘性操作符

      1. 乘法(*):计算两个数的乘积。在处理特殊值的情况下,会遵循以下规则:
        1. 操作数都是数值,则按照常规的乘法计算。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity。
        2. 有一个操作数是NaN,则返回NaN。
        3. Infinity与0相乘,结果是NaN。
        4. Infinity与非0数值相乘,结果是Infinity或-Infinity,取决于操作数的符号。
        5. Infinity与Infinity相乘,结果还是Infinity。
        6. 有一个操作数不是数值,则会自动调用Number()方法转换为数值,再应用上面的方法进行计算。
      2. 除法(/):计算两个数值的除法。在处理特殊值的情况下,会遵循以下规则:
        1. 操作数都是数值,则按照常规的除法计算。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity。
        2. 有一个操作数是NaN,则返回NaN.
        3. Infinity被Infinity除,则结果是NaN。
        4. 0被0除,结果还是NaN。
        5. 非零的有限数被零除,则结果是Infinity或-Infinity。取决于操作数的符号。
        6. Infinity被任何非零数值除,则结果是Infinity或-Infinity。取决于操作数的符号。
        7. 有一个操作数不是数值,则会自动调用Number()方法转换为数值,再应用上面的方法进行计算。
      3. 求模(%):计算余数。在处理特殊值的情况下,会遵循以下规则:
        1. 被除数是无穷大值而除数是有限大的数值,则结果是NaN。
        2. 被除数是有限大的数值而除数是0,则结果是NaN。
        3. Infinity被Infinity除,结果是NaN。
        4. 被除数是有限大的数值而除数是无限大值,则结果是被除数。
        5. 被除数是0,则结果是0。
        6. 有一个操作数不是数值,则会自动调用Number()方法转换为数值,再应用上面的方法进行计算。
    5. 加性操作符

      1. 加法(+):
        • 两个操作数都是数值,则常规计算。然后根据以下规则返回结果:
          1. 有一个操作数是NaN,则结果是NaN。
          2. Infinity加Infinity,结果是Infinity。
          3. Infinity加-Infinity,结果是NaN。
          4. -Infinity加-Infinity,结果是-Infinity。
          5. +0加+0,结果是+0。
          6. +0加-0,结果是+0。
          7. -0加-0,结果是-0。
        • 有一个操作数是字符串,则有以下规则:
          1. 两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来。
          2. 如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,再进行拼接。
        • 有一个操作数是对象,数值或布尔值,则调用他们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。
        • 对于undefined和null,则调用String()函数并取得字符串"undefined"和"null",再应用前面关于字符串的规则。
      2. 减法(-):
        • 有一个操作数是NaN,则结果是NaN。
        • Infinity减Infinity,结果是NaN。
        • -Infinity减-Infinity,结果是NaN。
        • Infinity减-Infinity,结果是Infinity。
        • -Infinity减Infinity。结果是-Infinity。
        • +0减+0,结果是+0。
        • -0减+0,结果是-0。
        • -0减-0,结果是-0。
        • 有一个操作数是字符串,布尔值,null或undefined,则自动调用Number()将其转换为数值,再根据前面的规则执行减法计算。如果转换结果是NaN,则结果就是NaN。
        • 有一个操作符是对象,则调用对象地valueOf()方法取得该对象地数值。如果得到的值是NaN,则结果就是NaN。如果没有valueOf()方法,则调用其toString()方法将得到的字符串转换为数值进行计算。
    6. 关系操作符

      • 两个操作数都是字符串,则比较两个字符串对应地字符编码值。
      • 一个操作数是数值,则将另一个操作数也转换为数值进行比较。
      • 一个操作数是对象,则先调用valueOf将得到的结果按照前面地规则进行比较。如果没有valueOf再调用toString,将得到的结果按照前面地规则进行比较。
      • 一个操作数是布尔值,先将其转换为数值再进行比较。
      • 任何操作数与NaN进行比较是结果都是false。
    7. 相等操作符

      1. 相等和不相等(== 和 !=):进行比较时都会先转换操作数。
        • 转换规则如下:
          1. 有一个操作数是布尔值,则先将false转换为0,true转换为1,再进行比较。
          2. 一个操作数是字符串,另一个是数值,则先将字符串转换为数值再进行比较。
          3. 一个操作数是对象,则先调用valueOf(),没有再调用toString()方法,将得到的基本类型值按照前面的规则进行比较。
        • 比较规则如下:
          1. null和undefined相等。
          2. 要比较相等性之前,不能将null和undefined转换成其他任何值
          3. 有一个操作数是NaN,则相等操作符返回true,不相等操作符返回false。
          4. 两个操作数都是对象,则比较他们是不是同一个对象。
      2. 全等和不全等(=== 和 !==):进行比较时不会转换操作数。
        • 只在不转换操作数就相等的情况下才返回true。
        • null===undefined返回false。
    8. 条件操作符(Boolean_expression?value1:value2):问号前面的Boolean_expression为真,则取value1;为假则取第二个值。

    9. 赋值操作符:+=,-=,*=,/=,%=,<<=,>>=,>>>=

    10. 逗号操作符(,):可以在一条语句中执行多个操作。比如声明语句,可同时声明多个。

  3. 语句
    1. if语句
    //condition为真,执行statement1;为假,执行statement2
    if(condition){
        statement1
    }else {
        statement2
    }
    
    1. do-while语句:在对条件表达式求值之前,循环体内的代码至少会执行一次。
    do{
        statement
    }while(expression)
    
    1. while语句:在循环体内的代码被执行之前,就会对出口条件求值。为真才会执行循环内的代码。
    while (expression){
       statement
    }
    
    1. for语句:当expression为真的时候就会执行statement
    for (initialization; expression ; post-loop-expression) {
        statement
    }
    
    1. for-in语句:用来枚举对象的属性。但输出的属性名顺序是不确定的。
    for(property in expression){
        statement
    }
    
    1. label语句:在代码中添加标签,以便break和continue语句引用。
    2. break语句:直接跳出本层循环,不再执行。
    3. continue语句:直接跳出本次循环,回到顶部循环继续执行。
    4. switch语句:
       /* 每一种情形的含义:如果expression等于value这个值,那么就会执行后面的
       语句(statement)。而break关键字会导致代码执行跳出switch语句。如果省略了
       break,就会继续执行下一个case语句。最后的default关键字则是用在表达式都不
       匹配当前任何value值,再执行该代码。
       */
       switch (expression){
        case value:statement
            break;
        default:
            break;
        }
    
    • switch语句中可以使用任何数据类型,无论是字符串还是对象都行。
    • 每一个case的值不一定是常量,还可以是变量,甚至是表达式。
    • switch语句在比较值时使用的是全等操作符。即不会发生类型转换。
    • case中的值为表达式时会进行类型转换操作。
  4. 函数
    function functionName(arg01,arg02,...argN){
        statements
    }
    
    • 函数中return可以返回一个值,也可以不带返回值。
    • 函数中return后的代码都不会被执行。
    • 函数中return可以有多个。
    • 执行函数要用函数名后面加上()和参数(如果有)。
    • 函数没有重载,即相同函数名的调用下,只有后定义的函数可以使用。
  5. 参数
    • ECMAScript中的参数在内部是用一个数组来表示的。
    • 没有传递值的命名参数将自动被赋值为undefined。
    • 函数中的参数可以通过argument来获取。
    • 通过访问argument.length来获知有多少参数传入。
    • argument对象的长度是由传入的参数个数决定的,而不是由定义函数时的命名参数的个数决定的。
    • argument对象的值永远与对应命名参数的值保持同步。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354