《高级程序设计》整理(二)- - -正则与函数篇
一、正则(RegExp)
- - -| let pattern = / patern / ( i | g | m ) i:忽略大小写 g:全局匹配 m:多行匹配
(元字符需要转义—-> ’ ( { \ ^ $ | ) ? * + . ] } ’ )
- - -| RegExp的实例属性:global
、ignoreCase
、multiline
表示是否设置了该标志
- - -| RegExp的实例方法:
— exec()
: 包含第一个匹配项信息的数组([match[0],match[1],match[2]…]);或者在没有匹配项的情况下返回null。返回的数组虽然是Array的实例,但包含两个额外的属性:index(匹配项的索引)和input(输入)。
— test()
: /.*/.test(str) ==>boolean 常用于if语句
- - -| RegExp的构造函数属性:
长属性名 | 短属性名 | 说明 |
---|---|---|
input | $_ | 最近一次要匹配的字符串。Opera未实现此属性 |
lastMatch | $& | 最近一次的匹配性。 Opera未实现此属性 |
lastParen | $+ | 最近一次匹配的捕获组。 Opera未实现此属性 |
leftContext | $` | input字符串中lastMatch之前的文本 |
multiline | $* | 布尔值,是否所有表达式都使用多行模式。IE和Opera未实现此属性 |
rightContext | $· | input字符串中lastMatch之后的文本 |
$1、$2、$3… | 第一、第二、第三…匹配的捕获组 (常用 ) |
var text="this has been a short summer";
var pattern=/(.)hort/g;
/*
*注意:Opera不支持input、lastMatch、lastParen和multiline属性
*IE 不支持multiline属性
*/
if(pattern.test(text))
{
alert(RegExp.$_); // this has been a short summer
alert(RegExp.["$`"]); //this has been a
alert(RegExp.["$·"]); //summer
alert(RegExp.["$&"]); //short
alert(RegExp.["$+"]); //s
alert(RegExp.["$*"]); //false
alert(RegExp.["$1"]); //s
}
四、Function类型
每个函数都是function类型的实例,*即函数是对象,而函数名是指针
- - -| 函数的两种定义方式:1.function sum(num1, num2) {//函数声明 return num1 + num2 } 2.var sum = function(num1, num2) {//函数表达式 return num1 + num2 }; *注意:用不含括号的函数名访问的是函数指针,而非调用函数 即:var anotherSum = sum sum = null anotherSum(10,10) //==>20
函数声明和函数表达式
- - -| 解析器会将函数声明提升,率先解析函数声明并生成引用;
- - -| 表达式则是按解析顺序自上而下执行。函数内部属性(arguments, this)
- - -| this:引用函数的执行环境- - -| arguments:类数组对象,包含传入函数的所有参数。
- - callee:arguments.callee()
指向拥有该arguments对象的函数;常用于递归解耦
- - arguments[Symbol.iterator
]():返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。/*将arguments转成数组对象的方法*/ var args = Array.prototype.slice.call(arguments); var args = [].slice.call(arguments); const args = Array.from(arguments);// ES2015
函数属性和方法
- - 属性:length:函数希望接收的参数个数;prototype:保存所有实例方法
- - 方法:
–apply()和call():每个函数都包含两个非继承而来的方法:
apply()
和call()
。这两个方法的用途都是在特定的作用域中调用函数,实际上等于函数体内this
对象的值; 他们的第一参数都是作用域,apply()
的第二参数为数组而call()
则需将传递参数列举出来。
例子:function sum(num1, num2){ return num1 + num2; } function callSum1(num1, num2){ return sum.apply(this, arguments); } console.log(callSum1(10,10));//20
扩充作用域->例子:
window.color = "red"; var o = { color: "blue" }; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue
bind()
:
call() / apply() ,都是立马就调用了对应的函数,而bind()
不会,bind()
会生成一个新的函数,bind() 函数的参数跟 call() 一致,可以随时调用。
例子:window.color = "red"; var o = { color: "blue" }; function sayColor(){ alert(this.color); } var objectSayColor = sayColor.bind(o); objectSayColor(); //blue