js高级程序设计 笔记 --- 引用类型

一,变量和作用域

  1, js变量可以保存两种类型,基本类型、引用类型和symbol类型,基本类型有5种:undefined、null、boolean、number、string,它们都有以下的特征

    • 基本类型在内存中占据固定大小的空间,因此被保存在栈内存中
    • 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
    • 引用类型的值是对象,保存在堆内存中
    • 包含引用类型的变量只是一个指向该对象的指针
    • 复制引用类型,只是复制了指针,其实两个变量都指向同一个对象。
    • 确定基本类型的种类可以使用typeof操作符,确定是哪种引用类型可以使用instanceof操作符,也可以使用Object.prototype.toString.call()来进行处理 

  2,所有变量都存在一个执行环境,这个执行环境决定了变量的生命周期和访问区间

    • 执行环境分为全局和函数执行环境
    • 每次进去一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链
    • 变量的执行环境有助于确定何时释放内存   

二,引用类型

  1,Object类型

    创建Object实例的方法有三种,

      Object.create

      new Object()

      对象字面量

    一般用点表示法来访问对象属性,不过也可以用方括号来访问,方括号的优点是可以通过变量来访问属性。

  2,Array类型

    创建Array实例有两种方法

      new Array()  或者 省略new   Array(),如果只有一个参数并且为数值,则创建一个数值长度的数组,每一项为undefined,如果为其他类型,则创建一个只有那个值的一项的数组。

      数组字面量方式  [1,2,3]

    数组的length属性是可以设置的,通过设置length可以从数组的末尾移除项或者向数组中添加新项,添加的新项都为undefined

    检测数组:  value instanceof Array : 使用instanceof的问题在于,它假定的只有一个全局执行环境,如果页面中包含多个框架,那实际上就有两个以上不同的全局执行环境,从而存在两个以上的Array构造函数,如果从一个框架传数组到另一个框架,那么这两个数组分别有不同的构造函数。这里可以使用Array.isArray()来进行检测。

    转换方法:

      toString():返回数组每个值的字符串拼接成的以逗号分隔的字符串。

      valueof(): 返回的还是数组本身

      toLocalString() :和toString返回的一样。

      join() :  默认也是返回数组每个值的字符串拼接的以逗号分隔的字符串,可以自定义分隔符。

    栈方法和队列方法:

      push: 后进   , 修改原数组,返回新数组的长度。

      pop: 后出,  修改原数组,返回移除的项

      unshift: 先进 , 修改原数组,返回新数组的长度

      shift : 先出,修改原数组,返回移除的项

    重排序:

      reverse() : 反转数组,改变原数组    返回值为排序之后的数组

      sort() :  调用数组每一项的toString 方法,然后比较得到的字符串。  返回值为排序之后的数组。会改变原数组。

    操作方法:

      concat() : 合并数组, 返回值为合并之后的数组,不改变原数组,

      slice() : 参数为起始的位置和  结束位置,结束位置不包含在内。  返回起始位置到不包含结束位置的数组,  不改变原数组。

      splice() :  用做删除的话:   第一个参数为起始位置,第二个参数为删除的项数。

             用做插入和替换的话: 第一个参数为起始位置,第二个参数为删除的项数, 剩余的参数为插入的项数。

    位置方法:

      indexOf() :  接受两个参数, 要查找的项和开始查找的位置,从数组的头部开始查找 

      lastIndexOf() : 和indexof一样, 不同的是从数组的尾部开始查找

    迭代方法: (every,filter, forEach, some,map    :传入的函数都接受三个参数,item index 和 该数组)

      every() : 对数组的每一项都运行函数,如果都为true,则返回true

      some() : 对数组的每一项都运行函数,如果其中一项为true,则返回true

      filter() : 对数组的每一项都运行函数,返回 运行函数为true的 项组成的数组。

      forEach () : 对数组的每一项运行函数,没有返回值。

      map() : 对数组的每一项运行函数, 返回值为  运行函数结果所组成的数组。

      forEach和map的区别是, forEach没有返回值,map有返回值,可以链式调用, forEach一旦运行了不能跳出循环。

    归并方法:

      reduce() :  接收的函数有四个参数,前一个值,当前的值,项的索引和数组对象。

      reduceRight() :  和reduce相同,这个是从后到前执行。

  3,Date类型

    创建一个日期对象:  new Date()

      方法:

        getTime() :  获取日期的毫秒数

        getFullYear() : 获取四位数的年份

        getMonth() :  返回月份,从0开始

        getDate() : 返回天数,1-31

        getDay() : 返回星期几,0表示星期天,6为星期六

        getHours()   getMinutes()   getSeconds()  getMilliseconds()

  4,RegExp类型

    1,字面量创建:var reg = /pattern/ flags

      flags:

        g:表示全局模式,

        i:表示不区分大小写

        m:表示多行模式  

    2,构造函数创建:(接收两个参数,一个是要匹配的字符串,另一个是标志字符串) 两个参数必须都是字符串

    3,实例方法

      exec() : 返回包含第一个匹配项信息的数组,包含index和input,还包含了其他捕获组匹配的字符串。如果设置 了全局标志g,则每次调用exec都会从上一次的位置查找,如果没有全局的标志,则始终返回第一个匹配项的信息。

      test() :  参数为字符串,如果该字符串与该正则模式匹配,则返回true,否则返回false

      toString() toLocaleString(): 返回该正则的字面量

      valueOf() : 返回该正则表达式本身

    4,RegExp构造函数属性

      从构造函数可以得到当前作用域中所有exec()和test()执行的更多信息。

      有9个用于存储捕获组的构造函数属性。  $1 - $9

  5,Function类型

    函数实际上是对象,每个函数都是Function类型的实例,都有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

    因为函数名为指针,所以函数没有重载,后面的函数会覆盖前面的函数。

    函数声明会声明提前,函数表达式不会,其他的两个是等价的。

    函数的内部属性:

      1,agruments

      2,this  

    函数属性和方法:

      length 和 prototype:  length表示希望接收的参数的个数。  prototype是函数的原型对象。

      apply 和 call : 设置函数中this的指向。 第一个参数为指向的作用域, 其余的参数,apply为数组,call为展开的参数。

      bind : 创建一个函数的实例,this值会绑定到传给bind()函数的值。

  6,基本包装类型

    在读取基本类型的时候,后台会创建一个相应的基本包装类型的对象,从而能让我们能调用方法来操作这些数据。

       var str = 'hello world'; var s = str.substring(2);

       var str = new String('hello world');  var s = str.substring(2);  str = null;

      1, Boolean类型 (不建议使用)

      2,Number类型 :  var n = new Number(10)    ;

        重写了valueOf,返回对象表示的基本类型的数值, 也重写了toString和toLocaleString,返回字符串形式的数值。

          toString() :传递一个表示基数的参数,返回对应进制的字符串形式。  var n = 10;   n.toString(2)  //1010 ......

          toFixed() :  按照参数指定的小数位,返回带有小数点的数值字符串

          toExponential() :  返回以指数表示法表示的数值的字符串形式。

        toPrecision() :  会根据处理的数值,看是调用toFixed 还是调用toExponential

      3,String类型 :

         length属性返回实例的字符数量。

        1,字符方法:

          charAt():  返回指定位置的字符      <-->     还可以用方括号[index] 来返回指定位置的字符

          charCodeAt() : 返回指定位置的字符编码

             concat() :  拼接字符串, 返回拼接得到的字符串,不改变原字符串。 还可以使用“+”操作符来进行多个字符串拼接。

          slice () :  接收两个参数,start开始和end结束,截取的字符串不包括end,支持负数

          substring () :  和slice一样, 只是end 如果为负数的话,会被自动转换为0,  如果end比start小, 则转换start和end

          substr() : 两个参数, start开始位置和 length要截取的长度

          indexOf () :  从字符串中搜索指定的字符串,如果没有找到则返回-1,找到的话就返回下标位置, 第二个参数为从哪个位置开始搜索。

          lastIndexOf() : 和indexOf 类似, 不同的是从字符串的尾部开始查找。

          trim() :   返回删除了前置和后置空格的新字符串, 不改变原来的字符串。

          toLowerCase(), toUpperCase() , toLocaleLowerCase(), toLocaleUpperCase()  ,  通用方法和针对地区的方法。

         匹配方法:

          match() : 本质上和正则的exec() 方法相同,接收一个正则的参数。 返回值为一个数组,包含着匹配项的信息。

          search() : 参数为一个正则。 返回字符串中第一个匹配项的索引,如果没有匹配项,则返回-1,

          replace():  接收两个参数, 第一个参数为一个正则或一个字符串,第二个参数为一个字符串或一个函数,如果第一个参数为字符串,则只能替换第一个子字符串, 如果想匹配所有的子字符串,则必须为一二正则,而且要指定全局g标志。如果第二个参数为一个字符串,则可以使用一些特殊的字符序列,比如$1......,获取到正则表达式操作得到的值。 第二个参数也可以是一个函数。在只有一个匹配项的情况下,该函数有3个参数。模式的匹配项、模式匹配项在字符串中的位置和原始字符串。

          split() : 基于指定的分隔符将字符串分割为多个子字符串的数组, 可以有第二个参数,用于指定数组的大小,确保返回的数组不会超过指定的大小。

          localCompare(): 比较两个字符串,如果字符串在字母表中排在字符串参数的前面,则返回负数,相等则返回0,后面则返回正数。

          fromCharCode()  : 将字符编码转换成一个字符串。

  7,单体内置对象 (Global 和 Math)  在浏览器中 window ==== global

    Global:

      1,url编码方法

        encodeURI()  encodeURIComponent()   decodeURI() decodeURIComponent()  :   encodeURIComponent会对所有的非标准字符进行编码

      2,eval方法

        当解析器发现代码中的eval方法时,会将传入的参数当做js语句来解析,将执行结果插入到原位置。

      3,window对象的属性

        undefined  NaN  Infinity   Object  Array   Function   Boolean   String  Number  Date   RegExp  Error  EvalError  RangeError   ReferenceError  SyntaxError  TypeError   URIError

    Math对象

      1,属性

        Math.E .......

      2,方法

        min() 和 max()  :  取最小值和最大值,  如果想找到数组中的最小最大值的话,可以使用  Math.min.apply(Math, Arr)

        Math.ceil()  :   向上取整  ;   Math.floor() :  向下取整;  Math.round() :  四舍五入 

        Math.random() :   返回一个大于0 小于1 的随机数

小结:    对象在js中被称为引用类型。

      因为有了基本的包装类型,所以js中的基本类型也可以被当做对象来访问, 

      在所有的代码执行之前,作用域中就存在了两个内置的对象: window和Math对象。

原文地址:https://www.cnblogs.com/wjyz/p/10255509.html