关于javascript:JavaScript高级程序设计笔记05-基本引用类型

28次阅读

共计 7627 个字符,预计需要花费 20 分钟才能阅读完成。

根本援用类型

援用值(对象)是某个特定 援用类型 的实例。援用类型是把数据和性能组织到一起的构造。

援用类型有时也被称为 对象定义,因为它们形容了本人的对象应有的属性和办法。

Date

参考了 Java 晚期版本中的 java.util.Date。因而,Date 类型将日期保留为自协调世界时(UTC,Universal Time Coordinated)工夫 1970 年 1 月 1 日午夜(零时)至今所通过的毫秒数。

Date 类型能够准确示意 1970 年 1 月 1 日之前及之后 285 616 年的日期。

要基于其余日期和工夫创立日期对象,必须传入其毫秒示意。ECMAScript 为此提供了两个辅助办法:Date.parse()和 Date.UTC()。

  • Date.parse()。接管一个示意日期的字符串参数,尝试将这个字符串转换为示意该日期的毫秒数。

    ES5 定义了反对的日期格局:

    1. “月 / 日 / 年”
    2. “月名 日, 年 ”
    3. “ 周几 月名 日 年 时: 分: 秒 时区 ”
    4. ISO 8601 扩大格局“YYYY-MM-DDTHH:mm:ss.sssZ”

    如果传入的字符串不示意日期,则返回 NaN。如果把示意日期的字符串传给 Date 构造函数,会在后盾主动调用 Date.parse()。对越界的日期,不同的浏览器有不同的解决。

  • Date.UTC()。也返回日期的毫秒示意。

    应用的参数为年、零起点月数(0-11)、日(1-31),时(0-23)、分、秒和毫秒。只有年和月是必须的。也会被 Date 构造函数隐式调用。

    创立的是本地日期,非 GMT 日期(参数是 GMT 时区下的工夫)。

  • Date.now()。返回示意办法执行时日期和工夫的毫秒数。可用于代码剖析。

继承的办法:

  • toLocaleString():返回与浏览器运行的本地环境统一的日期和工夫。(蕴含 AM/PM,不蕴含时区信息)
  • toString():返回带时区信息的日期和工夫。(工夫为 24 小时制)
  • valueOf():返回的是日期的毫秒示意。操作符(如小于号和大于号)能够间接应用它返回的值。(能够确保日期先后的一种简略形式)

日期格式化办法:返回字符串(与具体实现无关,因浏览器而异)

  • toDateString():显式日期中的周几、月、日、年;
  • toTimeString():显式日期中的时、分、秒和时区;
  • toLocaleDateString():显式日期中的周几、月、日、年(与地区无关)
  • toLocakeTimeString():显式日期中的时、分、秒;
  • toUTCString():显示残缺的 UTC 日期。

GMT = UTC+0(https://www.zhihu.com/questio…)

RegExp

相似 Perl 的简洁语法创立:

let expression = /pattern/flags;

可带 0 个或多个 flags(标记):

  1. g:全局模式
  2. i:不辨别大小写
  3. m:多行模式
  4. y:粘附模式,示意只查找从 lastIndex 开始及之后的字符串
  5. u:Unicode 模式,启用 Unicode 匹配
  6. s:dotAll 模式,示意元字符. 匹配任何字符(包含 \n 或 \r)

所有元字符在 pattern 中必须本义,包含:

([ { \ ^ $ |} ] ) ? * + .

也能够应用 RegExp 构造函数来创立,接管两个参数:模式字符串和(可选的)标记字符串。因为 RegExp 的模式参数是字符串,所以在某些状况下须要二次本义。

应用 RegExp 也能够基于已有的正则表达式实例,并可选择性地批改它们的标记。

  • 构造函数属性:

    会依据最初执行的正则表达式操作而变动,能够通过两种不同的形式拜访它们,一个全名和一个简写。

    能够提取出与 exec()和 test()执行的操作相干的信息。

    • input($_)最初搜寻的字符串
    • leftContext($`)、rightContext($’)

      $` input 字符串中呈现在 lastMatch 后面的文本

      $’ input 字符串中呈现在 lastMatch 前面的文本

    • lastParen($+)、lastMatch($&)

      $+ 最初匹配的捕捉组

      $& 最初匹配的文本

    • 还能够存储最多 9 个捕捉组的匹配项,通过 RegExp.$1~RegExp.$9 来拜访。
  • 原型属性

    • global
    • ignoreCase
    • unicode
    • sticky
    • multiline
    • dotAll
    • lastIndex:整数,示意在源字符串中下一次搜寻的开始地位,始终从 0 开始
    • source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有结尾和结尾的斜杆
    • flags:正则表达式的标记字符串

    source 和 flags 属性返回的是规范化之后能够在字面量中应用的模式

    lastIndex 在非全局模式下始终不变

  • 原型办法

    • exec

      次要用于配合捕捉组应用。只接管一个参数,即要利用模式的字符串。

      如果找到,则返回蕴含第一个匹配信息的数组(蕴含两个额定的属性:index 和 input);如果没有找到,就返回 null。

      index:字符串中匹配模式的起始地位;input:要查找的字符串。

      数组的第一个元素是匹配整个模式的字符串,其余元素是与表达式中的捕捉组匹配的字符串。

      如果没有捕捉组,数组就只蕴含一个元素。

      如果设置了全局标记:则每次调用 exec()办法会返回一个匹配的信息,直到搜寻到字符串开端。如果没有设,每次调用只会返回第一个匹配的信息。

      如果设置了粘附标记 y:则每次调用只会在 lastIndex 的地位上寻找匹配项。粘附标记笼罩全局标记。

      let text = "mom and dad and baby";
      let pattern = /mom(and dad( and baby)?)?/gi;
      
      let matches = pattern.exec(text);
      console.log(matches);
      console.log(matches.index); // 0
      console.log(matches.input); // mom and dad and baby
      console.log(matches[0] ); // mom and dad and baby
      console.log(matches[1] ); //  and dad and baby
      console.log(matches[2] ); //  and baby
      console.log(pattern.lastIndex); // 20
      
      let text2 = "mom";
      // pattern.lastIndex = 0;
      let matches2 = pattern.exec(text2);
      console.log(matches2); // null
      console.log(pattern.lastIndex); // 0
      
      let text3 = "mom and dad";
      let matches3 = pattern.exec(text3);
      console.log(matches3.input); // mom and dad
      console.log(pattern.lastIndex); // 11
    • test

      接管一个字符串参数。输出的文本与模式是否匹配

  • 继承的办法

    toLocaleString()和 toString()都返回正则表达式的字面量示意。valueOf()也是。

  • 存在局限

原始值包装类型

以读模式拜访原始值时:

  1. 长期创立一个包装对象
  2. 借助这个对象操作相应的数据
  3. 销毁长期对象

不举荐显式应用,但对于操作原始值的性能很重要

  • Number

    valueOf():返回 Number 对象示意的原始数值

    toString():可抉择接管一个示意基数的参数,并返回相应基数模式的数值字符串

    将数值格式化为字符串的办法

    1. toFixed():返回蕴含指定小数点位数的数值字符串。接管一个参数,示意后果字符串中小数的位数。超过就四舍五入到最靠近的小数位。通常能够示意有 0~20 个小数位的数值。
    2. toExponential():返回以迷信计数法示意的数值字符串。也接管一个参数,示意后果中小数的位数
    3. toPrecision():会依据状况返回最正当的输入后果,可能是固定长度,也可能是迷信计数法模式。接管一个参数,示意后果中数字的总位数(不蕴含指数)。

      实质上是依据数值和精度来决定调用 toFixed()还是 toExponential()。

    以上 3 者都会向上或向下舍入。(为了以正确的小数位准确示意数值)

    与 number 原始值的 typeof 和 instanceof 操作后果不统一。(一个是原始值,一个是援用值)

    isInteger()办法与平安整数:

    1. isInteger():ES6 新增,用于分别一个数值是否保留为整数
    2. 平安整数:所有整数都有惟一的浮点数示意。

      范畴是 Number.MIN_SAFE_INTEGER(-2^53+1)到 Number.MAX_SAFE_INTEGER(2^53-1)。

  • Boolean:不倡议用
  • String

    由 16 位码元(code unit)组成。对少数字符来说,每 16 位码元对应一个字符。

    JavaScript 字符串应用了两种 Unicode 编码混合的策略:UCS- 2 和 UTF-16。对于能够采纳 16 位编码的字符(U+0000~U+FFFF),这两种编码实际上是一样的,在扩大到 Unicode 增补字符立体时就不成立了。16 位只能惟一示意 65 536(2^17-1)个字符。

    每个字符应用两个 16 位码元的策略称为 代理对

    • 继承的办法

      valueOf()、toLocaleString()、toString()都返回对象的原始字符串值。

    • 正则相干办法(模式匹配办法)p125

      • match、search

        match:可接管一个参数,正则表达式字符串或是一个 RegExp 对象。(非 global 状况下),该办法返回的数组与 RegExp 对象的 exec()办法返回的数组是一样的。

        search:接管一个参数,正则表达式字符串或是一个 RegExp 对象。返回模式第一个匹配的地位索引,没找到就返回 -1。始终从前向后匹配模式。

      • replace、split

        replace:第一个参数能够是一个 RegExp 对象或者一个字符串(不会转为正则表达式),第二个参数能够是一个字符串或一个函数

        第二个参数是字符串的状况下,有几个非凡的字符序列,能够用来插入正则表达式操作的值。

        字符序列 替换文本
        $$ $
        $& 匹配整个模式的子字符串。与 RegExp.lastMatch 雷同
        $’ 匹配的子字符串之前的字符串。与 RegExp.rightContext 雷同
        $` 匹配的子字符串之后的字符串。与 RegExp.leftContext 雷同
        $n 匹配第 n 个捕捉组的字符串,n 为 0 -9。如果没有捕捉组,则值为空串
        $nn 匹配第 nn 个捕捉组的字符串,nn 为 01-99。如果没有捕捉组,则值为空串
        let text = "cat, bat, sat, fat";
        let result = text.replace(/(.at)/g, "word($1)");
        console.log(result);
        
        function htmlEscape (text) {return text.replace(/[<>"&]/g, function(match, pos, originalText) {switch(match) {
                    case "<": return "&lt;";
                    case ">": return "&gt;";
                    case "&": return "&amp;";
                    case "\"": return "&quot;";
                }
            });
        }
        console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>") );
        // &lt;p class=&quot;greeting&quot;&gt;Hello world!&lt;/p&gt;

        第二个参数是函数时,函数应该返回一个字符串,示意应该把匹配项替换成什么。(能够更粗疏地管制替换过程)

        split:第一个参数能够是一个 RegExp 对象或者一个字符串(不会转为正则表达式),第二个参数可选,指定返回的数组不会超过的大小。

        依据传入的分隔符将字符串拆分成数组。

    • 字串:

      • charAt():返回给定索引地位的字符
      • charCodeAt(),codePointAt()

        charCodeAt():返回指定索引地位的码元值

        codePointAt():返回指定索引地位上的码点(Unicode 中一个字符的残缺标识)。正确解析既蕴含单码元字符又蕴含代理对字符的字符串。接管 16 位码元的索引(如果传入的索引并非代理对的结尾,就会返回谬误的码点)。

        迭代字符串(扩大运算)能够智能地辨认代理对的码点。

      • fromCharCode()、fromCodePoint()

        fromCharCode():依据给定的 UTF-16 码元创立字符串中的字符。实际上是基于提供的二进制示意间接组合成字符串

        fromCodePoint():接管任意数量的码点,返回对应字符拼接起来的字符串

    • 规范化模式:normalize() 编码方式

      比拟操作符不在乎字符看起来是什么样。

      4 种规范化模式:NFD、NFC、NFKD、NFKC

      抉择同一种规范化模式能够让比拟操作符返回正确的后果。

    • 操作字符串

      • padStart、padEnd、repeat

        repeat:接管一个整数参数,示意要将字符串复制多少次,而后返回拼接所有正本的后果。

        padStart、padEnd:接管一个参数为长度(填充后整个字符串的长度),第二个可选参数为填充的字符串,默认为空格(U+0020)。如果长度小于或等于字符串长度,则会返回原始字符串。

      • concat 追加多个字符串(日常应用 + 号更多)
      • 截取字串:slice、substring、substr

        —— arg1(正值) arg2(正值) 参数(负值)
        slice 子串开始地位 完结地位(不蕴含) 字符串长度 +(负值)
        substring 同上 同上 转换为 0,会将较小的参数作为终点
        substr 同上 子串长度 1:字符串长度 +(负值);2:0
    • 查找字符串

      • indexOf、lastIndexOf——> number

        搜寻传入的字符串,并返回地位,没找到就返回 -1。

        定位子字符串(从前往后、从后往前),可选第二个参数,示意开始搜寻的地位。

      • startWith、endWith、includes——>boolean

        includes,查看整个字符串。

        startWith 和 includes,可选第二个参数,示意开始搜寻的地位。

        endWith,可选第二个参数,示意应该当作字符串开端的地位。

    • trim:创立字符串的一个正本,删除前、后所有空格,再返回后果。
    • 迭代、解构

      字符串原型上裸露了一个 @@iterator 办法。能够应用 for-of 和 … 解构操作符

    • 大小写:toLowerCase、toUpperCase
    • 比拟两个字符串:localeCompare(字母表程序,辨别大小写,如在美国:大写字母排在小写字母前头)

      所在的地区决定了这个办法如何比拟字符串。

      1. 字符串应该在参数前头,返回负值;
      2. 字符串与参数相等,返回 0;
      3. 字符串应该在参数后头,返回正值(通常为 1)

单例内置对象

内置对象:由 ECMAScript 实现提供、与宿主环境无关,并在 ECMAScript 程序开始执行时就存在的对象。

  • Global——浏览器 window

    ECMA-262 规定 Global 对象为一种兜底对象,它所针对的是不属于任何对象的属性和办法。在大多数 ECMAScript 实现中无奈间接拜访。

    • URL 编码方法:用于编码对立资源标识符(URI),以便传给浏览器。

      encodeURI \ encodeURIComponent:

      encodeURI——对整个 URI 进行编码,不会编码属于 URL 组件的特殊字符,如冒号、斜杆、问号、井号;

      encodeURIComponent——编码 URI 中独自的组件,会编码所有非标准字符。编码查问字符串参数比编码基准 URI 的次数更多。

      decodeURI \ decodeURIComponent

      取代了 escape()和 unescape()办法,只能正确编码 ASCII 字符,URI 办法能够对所有 Unicode 字符进行编码。

      // URL encode function
      let uri = "http:// www.wrox.com/illegal value.js#start";
      console.log(encodeURI(uri) ); // http://%20www.wrox.com/illegal%20value.js#start
      console.log(encodeURIComponent(uri) ); // http%3A%2F%2F%20www.wrox.com%2Fillegal%20value.js%23start
      console.log(decodeURI(encodeURIComponent(uri)) ); // http%3A%2F%2F www.wrox.com%2Fillegal value.js%23start
      console.log(decodeURIComponent(encodeURIComponent(uri)) ); // http:// www.wrox.com/illegal value.js#start
    • eval()办法:一个残缺的 ECMAScript 解释器,接管一个参数,即一个要执行的 ECMAScript 字符串。被执行的代码与该调用上下文领有雷同的作用域链。通过 eval()定义的任何变量和函数都不会被晋升。

      严格模式下,才 eval()外部创立的变量和函数无奈被内部拜访。

    • Global 对象属性、window 对象

      window 对象:浏览器将 window 对象实现为 Global 对象的代理。

  • Math:保留数学公式、信息和计算的中央。蕴含辅助实现简单计算的属性和办法。

    Math 的计算精度会因浏览器、操作系统、指令集和硬件而异。

    • 对象属性:次要用于保留数学中的一些非凡值
    • min、max:用于确定一组数值中的最小值和最大值。接管任意个参数。
    • ceil、floor、round、fround

      ceil:向上舍入为最靠近的整数

      floor:向下舍入为最靠近的整数

      round:四舍五入

      fround:返回数值最靠近的单精度(32 位)浮点值 示意。

    • random

      [0,1)

      // lowerValue, upperValue 随机返回的最小值和最大值
      function selectFrom(lowerValue, upperValue) {
        let choices = upperValue - lowerValue + 1;
        return Math.floor(Math.random()*choices + lowerValue);
        // Math.random()*choices => [0, choices)
        // Math.random()*choices + lowerValue => [lowerValue, choices+lowerValue)
      }
      selectFrom(2, 10);

      如果为了加密而须要生成随机数,倡议应用window.crypto.getRandomValues()

    • 其余简略或高阶数运算的办法

正文完
 0