美文网首页
JavaScript高级程序设计读书总结(二)

JavaScript高级程序设计读书总结(二)

作者: Pumpkincc | 来源:发表于2020-10-28 15:18 被阅读0次

1. JavaScript 没有块级作用域

if 语句中的变量声明会将变量添加到当前的执行环境;for 循环执行结束后,在for循环中声明的变量也依旧会存在于循环外部的执行环境中.

1.1 声明变量

初始化变量时如果没有使用 var 声明,该变量会被自动添加到全局环境;在函数中定义变量如果没有使用 var ,那这个变量也将变为全局变量;

1.2 查询标识符

在查询的过程中,如果局部环境中存在同名标识符,就不会使用全局环境中的标识符;

2 垃圾收集

2.1 标记清除

当变量进入环境(函数中声明一个变量)时,就将这个变量标记为"进入环境",当变量离开环境时,将这个变量标记为"离开环境",垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量标记,而在此之后被标记的变量将被视为准备删除的变量,最后垃圾收集器完成内存清除工作,销毁那些带标记的值并回收他们所占的内存空间;

2.2 引用计数

含义是跟踪记录每个值被引用的次数,当声明了一个变量并将一个引用类型值赋给该变量时,该值的引用次数就是1,如果同一个值被赋给另一个变量,该值的引用次数+1,如果包含对该值进行引用的变量又引用了其他值,则该值的引用次数-1

3. 基本类型和引用类型值特点

  1. 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
  2. 从一个变量向另一个变量复制引用类型的值,会创建这个值的一个副本;
  3. 引用类型的值是对象,保存在堆内存中;
  4. 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
  5. 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都能指向同一个对象;
  6. 确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符;

4. 执行环境

  1. 执行环境有全局执行环境和函数执行环境之分;
  2. 每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
  3. 函数的局部环境不仅有权访问函数作用域链中的变量,而且有权访问其包含父环境,乃至全局环境;
  4. 全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;
  5. 变量的执行环境有助于确定应该何时释放内存.

5. 引用类型

5.1 Object 类型
  1. 创建Object实例: 使用new操作符,后跟object构造函数;使用对象字面量表示法,在对象字面量表示法中,属性名也可以使用字符串
5.2 Array 类型
  1. 创建Array: 使用Array构造函数;使用数组字面量表示法;

  2. 检测数组: es5新增Array.isArray(value)方法;

  3. 转换方法: 调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的以逗号分割的字符串;

  4. 栈方法:
    (1) push(),可以接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度;
    (2) pop(),从数组末尾移除最后一项,减少数组的length值,并返回移除的项;

  5. 队列方法:
    (1) shift(),移除数组中的第一个项并返回该项,同时数组的长度减1;
    (2) unshift(),在数组前端添加任意个项并返回新数组的长度;

  6. 重排序方法:
    (1) reverse(),反转数组项的顺序;
    (2) sort()按照升序排列数组项,为了实现排序,sort()会调用每个数组项的toString()的转型方法,然后比较得到的字符串,即使数组中的每一项都是数值,sort()方法比较的也是字符串;

  7. 操作方法:
    (1) concat(),基于当前数组中的所有项创建一个新数组,首先创造一个当前数组的副本,将接受到的参数添加到这个副本的末尾,返回构建的新数组,当没有传递参数的时候,只复制当前数组并返回,如果是一个或多个数组,则将这些数组中的每一项都添加到结果数组中,如果被传递的值不是数组,则这些值会被简单地添加到结果数组的末尾;
    (2) slice(),基于当前数组创建一个或多个项创建新数组,slice()可以接受一个或多个参数,即要返回项的起始和结束位置,只有一个参数的情况下,则返回该参数指定位置到数组末尾的所有项,如果有两个参数,则返回起始位置到结束位置的项,但是不包括结束位置的项,slice不会影响原数组;
    (3) splice(),删除:需指定两个参数,删除的起始位置和要删除的项数,插入:需要提供三个参数,起始位置,删除的项数(0),插入的项(要插入多个项,可以再传入第四第五以至任意多的项);替换:可以向指定位置插入任意数量的项,同时删除任意数量的项,只需指定三个参数,起始位置,要删除的项数,要插入的项数,插入的项数不必与删除的项数相等,该方法会返回一个包含从原始数组中删除的项(如果没有删除任何项,则返回空数组),该方法会改变原数组.

  8. 位置方法:
    indexOf() 和 lastIndexOf() : 这两个方法都接收两个参数: 要查找的项和表示查找起点位置的索引, indexOf() 从数组的开始向后查找, lastIndexOf() 方法则从数组的末尾开始向前查找, 这两个方法都返回要查找的项在数组中的位置, 或者在没找到的情况下返回-1,进行比较时,会进行严格比较(===).

  9. 迭代方法:
    每个方法都接收两个参数, 要在每一项上运行的函数和运行该函数的作用域对象, 传入这些方法中的函数会接收三个参数: 数组项的值, 该项在数组中的位置和数组对象本身:
    (1) every() : 对数组中的每一项运行给定函数, 如果该函数对于每一项都返回true, 则该方法返回true;
    (2) filter(): 对数组中的每一项运行给定函数, 返回该函数会返回true的项组成的数组;
    (3) forEach(): 对数组中的每一项运行给定函数(没有返回值);
    (4) map(): 对数组中的每一项运行给定函数, 返回每次函数调用的结果组成的数组;
    (5) some(): 对数组中的每一项运行给定函数, 如果该函数对任一项返回true, 则该方法返回true.

  10. 缩小方法:
    reduce() 和 reduceRight() 都会迭代数组的所有项, 然后构建一个最终返回的值, 这两个方法都接收两个参数, 一个在每一项上调用的函数和作为缩小基础的初始值, 传给 reduce() 和 reduceRight() 的函数接收四个参数: 前一个值、当前值、项的索引和数组对象, 这个函数返回的任何值都会作为第一个参数自动传给下一项, 第一次迭代发生在数组的第二项上, 因此第一个参数是数组的第一项,第二个参数是数组的第二项.

  11. RegExp()
    (1) g : 表示全局模式, 可以应用所有字符串;
    (2) i : 不区分大小写模式;
    (3) m : 表示多行模式, 即到达一行文本末尾还会继续查找下一行是否存在与模式匹配的项
    模式中使用的元字符要进行转义, 元字符包括: ( ) { } [ ] \ ^ $ | ? * + .
    (4) 实例方法: exec()接收一个参数, 即要应用模式的字符串, 然后返回包含第一个匹配项信息的数组, 没有匹配项的情况下返回null, 返回的数组虽然是array实例, 但包含额外两个属性: index和input, index表示匹配项在字符串中的位置, input表示应用正则表达式的字符串.

相关文章

网友评论

      本文标题:JavaScript高级程序设计读书总结(二)

      本文链接:https://www.haomeiwen.com/subject/uyniyktx.html