包装对象
三种原始类型的值(数值、字符串、布尔值),在一定条件下自动转换为对象(包装对象:Number、String、Boolean)。
备注:
- 使对象这种类型可以覆盖js所有值,整门语言通用数据模型
- 使原始类型也有办法调用自己的方法
使用
- 调用时候不加new,而作为普通函数使用(用于将任意类型转换为(原始类型的值)数值、字符串、布尔值) 例如
// 字符串转为数值
Number('123') // 123
// 数值转为字符串
String(123) // "123"
// 数值转为布尔值
Boolean(123) // true
- 调用时候加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(),但有些许不同
- 第一个参数大于第二个参数的时候,自动更换两个参数的位置
- 如果是负数会自动转换为0,然后在调换两个参数的位置
String.prototype.substr()
第一个参数是子字符串开始位置,第二个参数是子字符串长度
- 如果第一个参数为负数,倒数计算字符位置
- 如果第二个参数是负数,自动转为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():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。没有匹配返回-1String.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()
该实例对象自身是否具有该对象