分类
精读JS高级程序设计

第三章基本概念

基本概念

语法

  • 区分大小写。
  • 标识符:就是指变量、函数、属性的名字。
    • 第一个字符必须是一个字母、下划线(_)或者一个美元符号($)
    • 其他字符可以是字母、下划线、美元符号或数字
    • 不能把关键字、保留字、true、false和null用作标识符
  • 注释
    • 单行注释://
    • 块级注释:/* xxx */
  • 严格模式:ES5引入了严格模式,严格模式是为JS定义了一种不同的解析与执行模型。
    • 要在整个脚本启用严格模式,可以在顶部添加如下代码:"use strict"
    • 在函数内部的上方包含这条语句,也可以指定函数在严格模式下执行:
    function doSome(){
      "use strict"
      // 函数体
    }
    
  • 语句
    • 语句以一个分号结尾;如果省略分号,则由解析器确定其结尾。
    • 代码块以左花括号({)开头,以右花括号(})结尾。

关键字和保留字

(以下是严格模式下的)

  • 关键字:breakdoinstanceoftypeofcaseelsenewvarcatchfinallyreturnvoidwhilecontinueforswitchdebuggerfunctionthiswithdefaultifthrowdeleteintryexportextendimportsuperclassconstletstaticyieldasyncawait
  • 保留字:interfacepackageprivateimplementsprotectedpublicenum
  • 其他:evalarguments

变量

ES的变量是松散类型的,可以用来保存任何类型的数据,定义变量要使用var、let或const,省略关键字会定义全局变量,在严格模式下会导致抛出referenceError错误。

“`javascript
function test(){
message = "h1";//全局变量
}
“`

数据类型

ES有7种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol和BigInt,还有一种复杂数据类型:Object。Object本质上是有一组无序的名值对组成的。

  • typeof 操作符
    • “undefined”——如果这个值未定义
    • “boolean”——如果这个值是布尔值
    • “string”——如果这个值是字符串
    • “number”——如果这个值是数值
    • “object”——如果这个值是对象或null
    • “function”——如果这个值是函数
    • “bigint”——如果这个值是BigInt类型值
    • “symbol”——如果这个值是Symbol类型值
  • Null 类型

    在 JS 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null 也因此返回 “object”。

  • Boolean 类型

    ES中所有类型的值都有与两个Boolean值(true、false)等价的值。要将一个值转换为对应的Boolean值,可以使用转型函数Boolean()。转换为false值的各类型值分别是:空字符串''、0和NaN、null、undefined。

  • Number 类型

    • 浮点数值的最高精度是17位小数,进行算术运算时会有舍入误差,例如:0.1+0.2的结果不是0.3,而是0.300000000000000004,所以不要测试某个特定的浮点数值。
    • NaN:任何涉及NaN的操作都会返回NaN;NaN与任何值都不相等,包括自身。isNaN()在接收到一个值时,会尝试将这个值转换为数值。不能转换为数值的值都会导致这个函数返回true。
    • 数值转换:Number()、parseInt()、parseFloat。
    • Number()函数转换规则:
      1. 如果是Boolean值,true->1 false->0
      2. 如果是数值,只是简单的传入和返回。
      3. 如果是null->0。
      4. 如果是undefined->NaN。
      5. 如果是字符串:'0011'->11'1.1'->1.1'0xf'->15''->0'以上其它'->NaN
      6. 如果是对象,则调用对象的valueOf()方法,然后根据前面的规则转换返回的值,如果转换的结果是NaN,则调用对象的toString()方法,然后再依照前面的规则转换返回的值。
      var obj={
        valueOf(){
          return '22'
        },
        toString(){
          return '33'
        }
      }
      Number('hello') // NaN
      Number('') // 0
      Number('000011') // 11
      Number('true') // 1
      Number(obj) // 22
      obj.valueOf=function(){
        return []
      }
      Number(obj) // 33
      
    • parseInt()函数转换规则:

      由于Number()转换字符串时比较复杂而且不够合理,所以在处理整数的时候更常用的是parseInt()函数,parseInt()在转换字符串时,会看其是否符合数值模式,它会忽略字符串前面的空格,直到找到第一个非空格字符,如果第一个字符不是数值字符或者正负号,parseInst()会返回NaN。

      parseInt('1234blue') // 1234
      parseInt('') // NaN
      parseInt('0xf') // 15
      parseInt('22.5') // 22
      parseInt('070') // 70 ES5后不会在认为是8进制  
      

      parseInt()可以传入第二个参数,转换使用的基数(即多少进制),传入[-Infinity,-1] U [37,Infinity] U [1,2)直接返回NaN,传入(-1,1)将按照10进制转换,传入[2,37)返回对应进制相等的十进制数。(开闭区间来表示的😂)

      tips:为什么只到37呢?数一下键盘数值和字母有多少个就知道了,我在Chrome和Safari上测试了是这样的。

      parseInt('11',-0.3) // 11
      parseInt('11',0.3) // 11
      parseInt('11',-1) // NaN
      parseInt('11',37) // NaN
      parseInt('z',36.2) // 35
      

      !注意一道面试题

      [0,1,2,3].map(parseInt) // [0, NaN, NaN, NaN]
      
    • parseFloat()函数转换规则:

      只解析十进制数,因此没有第二个参数,如果字符串包含的是一个可解析为整数的数,那会返回整数。

  • String类型

    • 字符串中包含双字节支付,那么length属性可能不会精确返回字符串中的字符数目。
    • Object.create(null)、null、undefined没有toString方法,其他都有。
  • Object类型

    Object的每个实例中都存在系列属性和方法:

    • constructor:保存着用于创建当前对象的函数。
    • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在对象原型中)是否存在。
    • isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。
    • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句。
    • toString():返回对象的字符串表示。
    • valueOf():返回对象的字符串、数值或者布尔值表示,通常与toString()方法的返回值相同。
    • toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应。

操作符

  • 位操作符

    ES中的所有数值都是以IEEE-754 64位存储的,但位操作符并不直接操作数值,而是现将64位的值转换成32位的整数,然后执行操作,最后再将结果转回64位。
    对于有符号的整数,32位中前31位用于表示整数的值,第32位用于表示数值的符号,0表示正数1表示负数。
    负数同样以二进制码存储,但使用的格式是二进制补码。计算一个数值的二进制补码,需要经过下列3个步骤:

    1. 求这个数值绝对值的二进制码。
    2. 求二进制码的反码,即将0替换为1,1替换为0。
    3. 得到的反码加1。
  • 逻辑操作符
    • 逻辑与的规则:
    1. 如果第一个操作数是对象,则返回第二个操作数;
    2. 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
    3. 如果两个操作数都是对象,则返回第二个操作数;
    4. 如果第一个操作数是null,则返回null;
    5. 如果第一个操作数是NaN,则返回NaN;
    6. 如果第一个操作数是undefined,则返回undefined;

    逻辑与操作符要始终记住是一个短路操作符

    • 逻辑或的规则:
    1. 如果第一个操作数是对象,则返回第一个操作数;
    2. 如果第一个操作数的求值结果为false,则返回第二个操作数;
    3. 如果两个操作数都是对象,这返回第一个操作数;
    4. 如果两个操作数都是null,则返回null;
    5. 如果两个操作数都是NaN,则返回NaN;
    6. 如果两个操作数都是undefined,则返回undefined;

    逻辑或操作符始终记住是一个短路操作符

  • 加性操作符
    • 数值+数值:直接相加

    • 字符串+其它:

    1. 其它如果是基本类型就调用toString()方法(null,undefined使用String()
    2. 如果是对象那调用valueOf()方法返回的是基本类型则应用前面1的规则,如果是对象,则再调用toString()方法。
    • 非字符串非数值+数值:
    1. 如果是null,则null转为0,如果为undefined,则结果为NaN。
    2. 如果是对象,则先调用valueOf(),如果返回的是字符串,则应用字符串+数值规则。如果返回Boolean,则true转为1,false转为0,如果是null或undefined则应用规则1,如果返回是对象,则再调用toString()方法。
    • 对象+对象:

    先调用valueOf()方法,返回是否返回基本类型,如果不是则调用toString(),是基本类型则应用前面的规则。

  • 相等操作符

    相等和不相等(==,!=):先转换再比较
    全等和不全等(===,!==):仅比较不转换

    • 相等何不相等的基本规则:
    1. 如果有一个操作数是布尔值,则在比较前先转换为数值——false转为0,true转为1。
    2. 如果一个操作数是字符串,则在比较前先将字符串转为数值。
    3. 如果一个操作数是对象,另一个不是,则先调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较。
    • 比较时遵循下列规则:
    1. null和undefined相等;
    2. NaN和所有的都不相等;
    3. 如果两个都是对象,如果两个都指向同一个对象,则相等,否则不等。

for-in语句

只遍历可枚举属性,包括原型上的属性。

函数

函数的length属性可获得函数接受几个命名参数,函数内的arguments对象的length可获得有多少个参数传给了函数。

在非严格模式下,arguments对象中的值永远与命名参数的值保持同步。

发表评论

电子邮件地址不会被公开。 必填项已用*标注