3、标准库

114 阅读7分钟

包装对象

三种原始类型的值(数值、字符串、布尔值),在一定条件下自动转换为对象(包装对象:Number、String、Boolean)。

备注:

  • 使对象这种类型可以覆盖js所有值,整门语言通用数据模型
  • 使原始类型也有办法调用自己的方法

使用

  1. 调用时候不加new,而作为普通函数使用(用于将任意类型转换为(原始类型的值)数值、字符串、布尔值) 例如
// 字符串转为数值
Number('123') // 123

// 数值转为字符串
String(123) // "123"

// 数值转为布尔值
Boolean(123) // true
  1. 调用时候加new,做构造函数使用,可以将原始类型转换为对象。

实例方法

三种包装对象都继承了Object的 valueOf()和toString() 方法 valueOf()返回包装实例对应的原始类型的值 toString()返回对应的字符串形式

原始类型与实例对象的自动转换

某些时候,原始类型会自动做包装对象使用,并在使用完后立即销毁。 自动转换的包装对象是只读的,无法修改

自定义方法

包装对象还可以自定义方法和属性,供原始类型的值直接调用

String.prototype.newFunction = function() {
    return 1213;
};

console.log('abc'.newFunction())
    // 1212

String对象

构造函数用来生成字符串对象,不用构造方法可以用作工具将任意类型转换为字符串

静态方法(定义在对象本身的方法)

String.fromCharCode

返回码点组成的字符串

String.fromCharCode(104, 101, 108, 108, 111)
// "hello"

实例属性

String.prototype.length 返回字符串长度

'abc'.length // 3

实例方法

String.prototype.charAt()

返回指定位置的字符,参数从0开始,如果为负数,返回空串。

String.prototype.concat()

连接两个字符串,返回新字符串(如果参数哦不是字符串,会先转为字符串,再连接)

String.prototype.slice()

原字符串中取出子串,第一个参数是子串开始位置,第二个参数是结束位置(不包括该位置) 如果是负数则从结尾计数开始(负数+字符串长度为实际值) 如果第二个参数小于第一个参数,返回空串

'JavaScript'.slice(0, 4) // "Java"

String.prototype.substring() (不怎么建议使用,违反视觉)

用法同slice(),但有些许不同

  1. 第一个参数大于第二个参数的时候,自动更换两个参数的位置
  2. 如果是负数会自动转换为0,然后在调换两个参数的位置

String.prototype.substr()

第一个参数是子字符串开始位置,第二个参数是子字符串长度

  1. 如果第一个参数为负数,倒数计算字符位置
  2. 如果第二个参数是负数,自动转为0,并返回空串。

String.prototype.indexOf()

子串在另一个字符串中第一次出现的位置,返回结果是匹配开始的位置,返回-1表示不匹配。

var str = "good work";

console.log(str.lastOf("or"))
//6

String.prototype.lastIndexOf()

从尾部开始匹配(位置返回从0开始)

var str = "good work";

console.log(str.lastIndexOf("or"))
//6

String.prototype.trim()

去除字符串两端空格,返回新的字符串

String.prototype.toLowerCase(),String.prototype.toUpperCase()

将字符串转为大写或者小写

String.prototype.match()

匹配返回匹配项,不匹配返回null,也可以通过属性获取index,和输入内容。 注意:可以填写正则表达式

String.prototype.search()

匹配返回匹配项,不匹配返回-1 注意:可以填写正则表达式

String.prototype.replace()

替换匹配的子串,一般只替换第一个(除非带g)

String.prototype.split()

分割字符串返回数组 注意:参数哦可以用正则表达式

RegExp 对象

新建正则表达式

  • 使用字面量
var reg= /abc/;
  • 使用构造函数
var reg = new RegExp("abc");

实例属性

  • RegExp.prototype.ignoreCase:返回一个布尔值,表示是否设置了i修饰符。
  • RegExp.prototype.global:返回一个布尔值,表示是否设置了g修饰符。
  • RegExp.prototype.multiline:返回一个布尔值,表示是否设置了m修饰符。
  • RegExp.prototype.flags:返回一个字符串,包含了已经设置的所有修饰符,按字母排序。
  • RegExp.prototype.lastIndex:返回一个整数,表示下一次开始搜索的位置。该属性可读写,但是只在进行连续搜索时有意义。
  • RegExp.prototype.source:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。

实例方法

RegExp.prototype.test()

返回一个布尔值,表示当前模式是否能匹配参数字符串 注意,带有g修饰符时,正则表达式内部会记住上一次的lastIndex属性,这时不应该更换所要匹配的字符串,否则会有一些难以察觉的错误。(可以修改lastIndex的属性值从新从头匹配,但是注意必须为同一个对象,否则会每次创建新对象无限循环)

RegExp.prototype.exec()

如果匹配成功就返回一个成功的字符串,否则是null 如果正则表示式包含圆括号(即含有“组匹配”),则返回的数组会包括多个成员。第一个成员是整个匹配成功的结果,后面的成员就是圆括号对应的匹配成功的组。也就是说,第二个成员对应第一个括号,第三个成员对应第二个括号,以此类推。整个数组的length属性等于组匹配的数量再加1。

var s = '_s_w';
var r = /_(w)/;

var arr = r.exec(s) // ["_w", "w"]
console.log(arr.valueOf() )

运行结果:

[ '_w', 'w', index: 2, input: '_s_w' ]

字符串的实例方法

  • String.prototype.match():返回一个数组,成员是所有匹配的子字符串。

如果表达式带有g,会一次性返回所有匹配结果。设置lastIndex无效,匹配总是从第一个字符开始,其他同exec

  • String.prototype.search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。没有匹配返回-1
  • String.prototype.replace():按照给定的正则表达式进行替换,返回替换后的字符串。

如果加g表示替换所有匹配成功的值

第二个参数为字符串包含$:

  • $&:匹配的子字符串。
  • $`:匹配结果前面的文本。
  • $':匹配结果后面的文本。
  • $n:匹配成功的第n组内容,n是从1开始的自然数。
  • $$:指代美元符号$

第二个参数为函数:将每一个匹配内容替换为函数返回值

  • String.prototype.split()

返回由分割后各部分组成的数组

特别注意:贪婪匹配的情况

// 例一
'aaa*a*'.split(/a*/)
// [ '', '*', '*' ]

// 例二
'aaa**a*'.split(/a*/)
// ["", "*", "*", "*"]

如果正则表达式带有括号 ,则括号匹配的部分也会作为数组成员返回。

'aaa*a*'.split(/(a*)/)
// [ '', 'aaa', '*', 'a', '*' ]

匹配规则

字面量字符(某个字符只表示它字面的含义)和元字符(一部分字符有特殊含义)

  • 如.字符 匹配除了(\r,\n,行分割符,段分隔符以外的所有字符)
  • 位置字符 ^和$(表开始和结束)
  • 选择符 | (或)

转义字符

特殊意义元字符匹配本身,如果Regexp对象需要两个转义字符因为字符串本身需要一次转义

特殊字符

\n,\r,\t等

字符类

[]号内字符任选一个

  • 脱字符 ^(在方括号中是除了字符类中的都可以匹配)(如果方括号内只有这个字符为匹配一切字符)

注意,脱字符只有在字符类的第一个位置才有特殊含义,否则就是字面含义。

  • 连字符 -

表示字符的连续范围

预定义模式

  • \d 匹配0-9之间的任一数字,相当于[0-9]
  • \D 匹配所有0-9以外的字符,相当于[^0-9]
  • \w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]
  • \W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]
  • \s 匹配空格(包括换行符、制表符、空格符等),相等于[ \t\r\n\v\f]
  • \S 匹配非空格的字符,相当于[^ \t\r\n\v\f]
  • \b 匹配词的边界。
  • \B 匹配非词边界,即在词的内部。

注意:

正则表达式遇到换行符(\n)就会停止匹配。

var html = "<b>Hello</b>\n<i>world!</i>";
//指代一切字符
/[\S\s]*/.exec(html)[0]
// "<b>Hello</b>\n<i>world!</i>"

重复类

模式的精确匹配次数,使用大括号({})表示。{n}表示恰好重复n次,{n,}表示至少重复n次,{n,m}表示重复不少于n次,不多于m次。

量词符

  • ? 问号表示某个模式出现0次或1次,等同于{0, 1}。
  • * 星号表示某个模式出现0次或多次,等同于{0,}。
  • + 加号表示某个模式出现1次或多次,等同于{1,}。

贪婪模式

默认情况下都是最大可能匹配,即匹配到下一个字符不满足匹配规则为止

  • +?:表示某个模式出现1次或多次,匹配时采用非贪婪模式。
  • *?:表示某个模式出现0次或多次,匹配时采用非贪婪模式。
  • ??:表格某个模式出现0次或1次,匹配时采用非贪婪模式。

修饰符

修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部。修饰符可以单个使用,也可以多个一起使用。

  • g 第一次匹配成功后,正则对象就停止向下匹配了。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。正则模式不含g修饰符,每次都是从字符串头部开始匹配。所以每次匹配,都返回true。正则模式含有g修饰符,每次都是从上一次匹配成功处,开始向后匹配。
  • i 正则对象区分字母的大小写,加上i修饰符以后表示忽略大小写(ignoreCase)。
  • m m修饰符表示多行模式(multiline),会修改^$的行为。默认情况下(即不加m修饰符时),^$匹配字符串的开始处和结尾处,加上m修饰符以后,^$还会匹配行首和行尾,即^$会识别换行符(\n)。

组匹配

正则表达式的括号表示分组匹配,括号中的模式可以用来匹配分组的内容。 注意,使用组匹配时,不宜同时使用g修饰符,否则match方法不会捕获分组的内容。

正则表达式内部,还可以用\n引用括号匹配的内容,n是从1开始的自然数,表示对应顺序的括号。

/(.)b(.)\1b\2/.test("abcabc")
// true
  • 非捕获组 (?:x)称为非捕获组(Non-capturing group),表示不返回该组匹配的内容,即匹配的结果中不计入这个括号。

Object对象

Object本身是一个韩硕,用于保证一个值一定是对象,如果参数是对象总是返回对象不用转换 value === Object(value)

对象自身方法

Object.keys()

接受一个对象做参数返回一个数组(不包含继承属性),同时只返回可枚举属性。

Object.getOwnPropertyNames()

返回与上个方法一致,但是涉及到不可枚举属性时候也可以返回。

其他方法

  • 对象属性模型相关方法
  • 控制对象状态方法
  • 原型链相关方法
  • Object.create():该方法可以指定原型对象和属性,返回一个新的对象。
  • Object.getPrototypeOf():获取对象的Prototype对象。

Object实例方法

Object.prototype.valueOf()

  • 默认情况下返回对象本身
  • 自动转换类型的时候默认调用该方法

Object.prototype.toString()

  • 自动转换类型的时候得到想要的字符串
  • 数组、日期类型、函数、字符串,都自定了该方法
  • 判断数据类型 Object.prototype.toString.call(value)

Object.prototype.hasOwnProperty()

该实例对象自身是否具有该对象