您的位置:首页 > Web前端 > JavaScript

js 高程学习总结 第五章(2)

2017-02-13 13:59 274 查看
接上一篇:

RegExp类型

每个正则表达式都可带有一个或多个标志(flags),用于表明正则表达式的行为;有以下三个标志:g(全局模式,被应用与所有字符串);i(不区分大小写);m(多行模式,到达一行末尾还会继续查找下一行

正则表达式就是一个模式与上述标志的组合体;

正则表达式的元字符包括 ( | { \ ^ $ | ? * + . [ ] }

模式中使用的元字符必须转义(即要匹配元字符,用\ )

定义正则表达式

字面量形式:
var pattern = /[bc]at/i


使用RegExp构造函数,接收两个参数,一个是要匹配的字符串模式,另一个是可选的标志字符串。
var pattern1 = new RegExp("[bc]at","i")
;在构造函数中要对字符进行双重转义

ECMAScript 3 中,每个正则表达式字面量始终会共享一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是新实例;对于字面量,第一册调用test会找到cat,第二次会从上一次匹配的末尾开始,之后由于到了字符串末尾,下次调用test就又从开头开始了。

var re = null,
i;
for (i = 0; i < 10;i++){
re = /cat/g;
re.test("catastrophe");
}

for (i = 0; i < 10; i++){
re = new RegExp("cat","g");
re.test("catastrophe");
}


ECMAScript 5明确规定,字面量和构造函数一样,每次都新建RegExp实例

RegExp实例属性

RegExp实例局域下列属性

- global 布尔值,是否设置了g标志

- ignoreCase 布尔值,是否设置了g标志

- multiline 布尔值,是否设置了m标志

- lastIndex 整数,表示开始搜索下一个匹配项的字符位置,从0算起

- source 正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

RegExp 实例方法

exec(),该方法是专门为捕获组而设计的;

exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;没匹配时返回null

返回的数值时Array实例,还包括两个额外的属性,index(匹配项在字符串的位置)和input(应用正则表达式的字符串)。数组中的第一项与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)

var text = "mom and dad and baby";
var pattern = /mom (and dad (and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index);
alert(matches.input);
alert(matches[0]);
alert(matches[1]);
alert(matches[2]);


不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息,而在设置全局标志的情况下,每次调用exec()都会在字符串张继续查找新匹配项

test()方法,只接受一个字符串参数,在模式与参数匹配的情况下返回true,否则返回false。常放在if语句中

RegExp实例继承的toLocalString,toString 方法都会返回正则表达式的字面量,与创建正则表达式的方式无关

valueOf 返回正则表达式本身

RegExp构造函数属性

这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化,可以通过长属性名和短属性名来访问

长属性名短属性名说明
input$_最后一次匹配的字符串
lastMatch$&最后一次匹配项
lastParen$+最后一次匹配的捕获组
leftContext$`input字符串中的lastMatch之前的文本
multiline$*布尔值,是否所有表达式都使用多行模式
rightContext$’input字符串中的lastMatch之后的文本
RegExp.$1-9,用于存储第一、第二到第九匹配的捕获组,在执行exec()或test()方法时,这些属性自动填充

Function类型

每个函数都是Function类型的实例,与其他引用类型一样具有属性和方法(函数是对象,函数名实际是一个指向函数对象的指针,而不是绑定)。访问函数的指针而不执行函数的话,必须去掉函数名后面的圆括号

function sum(){}
或
var sum = function(){};
或
var sum = new Function ()//不推荐


没有重载

因为函数名只是指针,声明两个同名函数,后面的函数覆盖了前面的函数(第二个变量覆盖了第一个变量)

函数声明和函数表达式

函数声明:解析器率先读取函数声明,使其在执行任何代码之前可用,至于函数表达式,必须等到解析器执行到它所在的代码行,才会真正被解释执行

上面不会报错,而下面的写法会报错,因为执行到函数所在语句之前,变量sum中不会保存有对函数的引用

sum (10,10);
function(num1,num2){
return num1+num2;
}
或
var sum = function(num1,num2){
return num1+num2;
}


作为值的函数

函数名本身就是变量,所以函数也可以作为值来使用,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回

用于给sort函数传入比较函数(比较规则,默认为toString方法确认顺序)

函数内部属性

arguments 和this 这两个对象

- 其中arguments主要是用来保存函数参数,但这个对象还有一个callee的属性,该属性有一个指针,指向拥有这个arguments对象的函数;即arguments.callee() 指向原函数

- this–引用的是函数据以执行的环境对象(当在网页的全局作用域中调用函数时,this对象引用的就是window)

window.color = "red";
var o = {color:"blue"};
function sayColor(){
console.log(this.color);
}
sayColor();//"red"
o.sayColor = sayColor;
o.sayColor();


ECMAScript 5规范了另一个函数对象的属性:caller(调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,值为null)

当在严格模式下时,arguments.callee会导致错误,arguments.caller也会报错,与函数的caller不同,严格模式下也不能为函数的caller属性赋值

函数的属性和方法

每个函数都包含length(函数希望接收的命名参数的个数)和prototype(保存它们所有实例方法的真正所在),

在ECMAScript 5中,prototype属性不可枚举,for-in无法发现

每个函数都包含两个非继承而来的方法,apply()和call()

这两个方法都是在特定作用域中调用的函数,实际上等于设置函数体内this对象的值;

apply()方法接收两个参数:一个在其中运行函数的作用域,另一个是参数数组(可以使数组或arguments对象)

call()方法与apply方法作用相同,区别仅在于接收参数的方式不同,第一个参数是this,其余参数直接传递给函数

这两个函数强大的地方是能够扩充函数赖以运行的作用域

window.color = "red";
var o = {color:"blue"};
function sayColor(){
console.log(this.color);
}
sayColor();//"red"
sayColor.call(this);//"red"
sayColor.call(window);//"red"
sayColor.call(o);//"blue"


使用这两个方法来扩展作用域的最大好处,就是对象不需要与方法有任何耦合关系

ECMAScript 5还定义了一个方法,bind(),这个方法会创建一个函数实例,其中this会被绑定到传给bind()函数的值

window.color = "red";
var o = {color:"blue"};
function sayColor(){
console.log(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();//blue


toLocaleString 和toString 和valueOf方法始终都返回函数的代码

基本包装类型

3个特殊的引用类型Boolean、Number和String(每当读取一个基本数据类型的时候,后台就会创建一个对应的基本包装类型的对象,从而可以调用一些方法来操作数据:步骤为:1.创建一个String类型的实例,2.调用指定方法3.销毁实例)

引用类型和基本包装类型

区别在于对象的生存期:引用类型的实例,在执行流离开当前作用域之前都一直保持在内存中;自动创建的基本包装类型的对象,只在代码执行的瞬间,之后立即销毁;这意味着我们不能在运行时为基本类型添加属性和方法;

对于基本包装类型的实例调用typeof会返回“object”;布尔运算时所有对象都会被转化为true

Object 构造函数也会向工厂方法一样,返回相应基本包装类型的实例

typeof(Number(value))//转型函数,“number”;typeof(new Number(value)//构造函数,“object”;


Boolean类型

var bObject = new Boolean(true)


Boolean类型重写了valueOf方法,返回基本类型true或false,重写了toString()方法,返回字符串“true”“false”;

检测布尔对象结果为(建议永远不要使用Boolean对象) 重点内容

typeof falseObject; //object
typeof falseValue; //boolean
falseObject instanceof Boolean; //true
falseValue instanceof Boolean;//false


Number类型

var numberObject = new Number(10);


与Boolean类型类似也重写了valueOf方法,返回基本类型的数值,重写了toString()方法,返回字符串形式的数值;另外toString()还可以传递一个表示基数的参数,告诉返回几进制数值的字符串;

数值格式化为字符串的方法

toFixed()方法

按照指定的小数位返回数值的字符串表示;传入的数字表示几位小数

toExponential()方法

传入的参数表示输出结果中的小数位数
10.toExponential(1);//"1.0e+1"


toPrecision() 方法

可能返回固定大小格式(fixed),也可能返回指数格式(exponential)具体看哪种格式合适。该方法接受一个参数,表示所有数字的位数(不包含指数部分)

不建议直接实例化Number类型

var num = 99;
num.toPrecision(1);//"1e+2"
num.toPrecision(2);//"99"
num.toPrecision(3);//"99.0"


String 类型

可以使用构造函数创建
var stringObject = new String("hello world");


String 对象的方法可以在所有基本的字符串值访问到。其中valueOf()、toLoacleString()、toString()方法,都返回对象表示的基本字符串值

length:即使字符串中包含双字节字符(不是占一个字节的ASCII字符,每个字符仍然算一个字符,即”高兴”.length;//2)

字符方法

访问字符串中特性字符的方法:charAt()和charCodeAt(),参数为基于0的字符位置;

charAt() 以单字符字符串的形式返回给定位置的那个字符,
"高兴".charAt(1);//'兴'


charCodeAt()返回字符编码

字符串操作方法

concat:将一或多个字符串拼接其阿里,返回新字符串(实践中更多是用加号操作符)

slice、substr、substring方法,(可以接收一或两个参数,不会改变原始字符串)第一个参数都是指定字符串的开始位置

其中slice和substring方法,第二个参数指定的是子字符串到哪里结束,而substr则为返回的字符个数;如果没有第二个参数,则将字符串的长度作为结束位置.

在传递参数为负值的时候,他们的行为不仅相同

其中slice()会将传入的负值与字符串的长度相加,substr会将负的第一个参数加上字符串长度,负的第二个值转换为0,substring会将所有的负值转换为0;

substring(3,0)//这个方法会从较小的数开始,相当于substring(0,3),slice 不行;slice(4,3)会得到空字符串


字符串的位置方法

indexOf和lastIndexOf,从字符串中搜索给定的子字符串,然后返回子字符串的位置,如果没有找到则返回-1;不过一个从前向后搜索(indexOf),一个从后向前(lastIndexOf)

可以接收第二个参数,表示字符串从哪个位置开始搜索

在使用第二个参数的情况下,可以通过循环调用indexOf或lastIndexOf来找到所有匹配的子字符串

//关键为
pos = stringValue.indexOf("e",pos+1);


trim()方法

会创建一个字符串的副本,删除前置和后缀的所有空格,然后返回结果

字符串大小写转换方法

toLowerCase、toLocaleLowerCase、toUpperCase、toLocaleUpperCase

在不知道代码将在哪种语言中运行时,使用这对时区的方法更为稳妥

字符串的模式匹配方法

match()方法,本质上和RegExp的exec()方法相同,这个方法只接受一个参数,要么是正则表达式,要么是一个RegExp对象;返回一个数组,与exec方法相同

search()方法,与match方法参数相同,返回字符串第一个匹配项的索引,如果没有,将返回-1;始终是从字符串开头向后查找模式

replace () 方法接收两个参数:第一个参数可以是一个RegExp或字符串(不会被转换成正则表达式),第二个参数可以是一个字符串或者函数,如果第一个参数是字符串,只会替换第一个子字符串,想要替换所有子字符串,只能提供一个正则表达式,而且要有全局指定标志;第二个参数可以使字符串,也可以使一些特殊的字符序列;

字符序列替换文本
$$$
$&匹配整个模式的字符串
$’匹配子字符串之前的子字符串
$`匹配子字符串之后的子字符串
$n匹配第n个捕获的子字符串,0~9,没有定义捕获组则是空字符串
$nn匹配第nn个捕获的子字符串,01~99没有定义捕获组则是空字符串
replace 方法的第二个参数可以是一个函数,在只有一个匹配项的情况下,向函数传递三个参数,模式的匹配项,其在字符串的位置,原始字符串

split方法

基于指定的分隔符将字符串分割为多个子字符串,并放入一个数值中,分隔符可以是字符串,也可以是RegExp对象,这个方法不会将字符串看成正则表达式,split可以接收第二个参数,用于指定数值的大小,以确保返回的数组不会超过既定大小

localeCompare 方法

比较两个字符串,字符串在字母表中排在字符串参数之前,则返回一个负数,相等,则返回0,之后,则为正数

formCharCode方法

接收一或多个字符编码,转换成一个字符串,charCodeAt的反操作

单体内置对象

在ECMAScript执行前就有,不用显示实例化

- Global对象

编码方法

encodeURI()和encodeURIComponent()方法可以对URI进行编码,以便发送给浏览器

encodeURI:主要用于整个uri,不会对本身属于uri的特殊字符进行编码,如冒号,正斜杠,问号和#号

encodeURIComponent:主要用于uri的某一段进行编码,会对他发现的任何非标准字符进行编码

对应解码为decodeURI 和decodeURIComponent

eval()方法

只接受一个参数,要执行的ECMAScript字符串,像是一个完整的ECMAScript解析器

不要使用,在严格模式下,外部访问不到任何在eval中创建的函数和变量

Global对象的属性

属性说明属性说明
undefined特殊值undefinedDate构造函数Date
NaN特殊值NaNRegExp构造函数RegExp
Infinity特殊值InfinityError构造函数Error
Object构造函数ObjectEvalError构造函数EvalError
Array构造函数ArrayRangeError构造函数RangeError
Function构造函数FunctionReferenceError构造函数ReferenceError
Boolean构造函数BooleanSyntaxError构造函数SyntaxError
String构造函数StringTypeError构造函数TypeError
Number构造函数NumberURIError构造函数URIError
window 对象

全局作用域中声明的所有变量和函数,都成了window对象的属性

Math对象

Math对象的属性

E、LN10、LN2、LOG2E、LOG10E、PI、SQRT1_2、SQRT2

min和max方法

传入任意多个数值参数

求数组的最大值、最小值
Math.max.apply(Math,Array);


舍入方法

Math.ceil() 执行向上舍入

Math.floor() 执行向下舍入

Math.round() 执行标准舍入

random 方法

function (lower,upper){
var choice = upper - lower;
return Math.floor(Math.random()*choice+lower);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: