JavaScript 对象

本文详细介绍了JavaScript中对象的基本概念,包括数组与对象的区别、属性与方法的使用、构造函数的应用等内容。同时深入探讨了JavaScript的内建对象,如Object、Array、Function等的功能与使用方法。

1.从数组到对象

数组实际上就是一组值的列表。该表中的每一个值都有自己的索引值(即数字健值),索引序列从0开始,依次递增。

例:

var myarr = ["red","yellow","blue","purple"];

document.write(myarr + "<br>");

document.write(myarr[0] + "<br>"); //red

document.write(myarr[3] + "<br>"); //purple


事实上对象情况跟数组很相似,唯一的不同是它的键值类型是自定义的。也不是不仅限于数字索引了,也可以是字符串。

例:

var teacher = {

id:1,

name:”monan”

age:29

};

l 表示对象的变量名teacher

l 与定义数组不同,定义对象使用的是大括号{}

l 括号中用逗号分割着的是组成该对象的元素(通常称为属性)

l 键/值对之间用冒号隔开。


关于键名:

键名向下面这三种情况都是合法的:

var o = {prop:1};

var o = {“prop”:1};

var o = {‘prop’:1};


通常情况下,不建议在属性名上加引号。为什么呢?因为这样可以减少一些输入。但在以下的情况下是需要加引号的:

l 如果属性名是JavaScript中的保留字之一的话。

l 如果属性名中包含空格或其它特殊字符。

l 如果属性名以数字开头的话。

一句话说明清楚:如果我们所用的属性名不符合JavaScript中的变量名命名规则,就必须加上引号,不管是双引号、单引号都可以。

var o = {

something: 1,

‘yes or no’: ‘yes’,

‘*@$%^&!~’:true

}

总这在这里我要告诉大家,用[]声明的是数组,用{}声明的是对象。


1.1.元素、属性、方法

在说到数组的时候,我们学说其中包含的是元素。而当我们说对象的时候,就会说其中包含的是属性。实际上对于JavaScript来说,它们并没有本质的不同,只是在技术术语上的表达不同而已。

另外,对象的属性也可以是一个函数,因为函数本身也是一种数据,在这种情况下我们称该属性为方法。

var dog = {

name: ‘dahuang’;

talk: function(){

alert(‘汪汪汪…’);

}

};

dog.name; //属性

dog.talk; //方法


1.2哈希表、关联型数组

在一些程序语言中,通常会存在两种不同的数组形式:

l 一般性数组,也叫做索引型数组或叫做枚举型数组(通常以数字为键值)。

l 关联型数组,也叫做哈希表(通常以字符串为键值)。

在JavaSciprt中,我们会用数组来表示索引数组,而用对象来表示关联数组。


1.3访问对象属性

我们有两种方式来访问对象属性:

l 一各是以中括号的形式,例如:dog[“name”];

l 二种是以点的形式,例如:dog.name;

通常情况下都是用点的形式来访问对象属性,但是如果我们访问的属性不是一个合法的命名规则的时候,就不能通过点号来访问。


如果访问的属性不存在就会反回undefined。


对象可以可以包含任意数据类型,自然也可以包括其它对象:

var book = {

name:"细说PHP2",

published:2012,

author:{

firstname: "高洛峰",

lastname: "易第优教育组"

}

}


document.write(book['name'] + '<br>');

document.write(book.published + '<br>');

document.write(book['author'].firstname + '<br>');

document.write(book.author['lastname'] + '<br>');

1.4 调用对象方法

对象方法实际上是一个函数类型的属性,因此访问形式与属性完全相同。也主是说用点的方式和中括号的方式都可以。而其调用方式也与调用函数一样,在指定的方法名后面加上一个括号即可。

var dog = {

name: “dahuang”,

talk: function(){

document.write(‘汪汪汪…<br>’);

}

}

dog.talk();

dog[‘talk’]();


1.5 修改属性与方法

由于JavaScirpt是一种动态语言,所以它允许我们随时对现存的对象和属性和方法进行修改。

//先创建一个空对象

var pen = {};

//alert(pen.name);

//添加几个属性

pen.name = '钢笔';

pen.color = '白色';

alert(pen.name);

pen.write = function(){

return  pen.name;

}


document.write(pen.write('我是中国人'));


//删除属性

delete pen.name;

alert(pen.name);


alert(pen.write()); //再调用这个方法就会出错


1.6 使用this

当在对象内部使用this时,代表的就是“这个对象”或“当前对象”。

var pen = {

name: ‘钢笔’,

write: function(){

return this.name;

}

}

pen.write(); //钢笔


1.7 构造函数 (constructor)

为了能使用函数来创建对象,我们需要用new操作符。

例:

function pen(){

this.name = "钢笔";

}


var pen1 = new pen;

document.write(pen1.name);


使用构造函数的好处在于,它可以在创建对象时接收一些参数。

例:

function pen(name){

this.name = name;

}


var pen1 = new pen("毛笔");

document.write(pen1.name);


利用构造器函数可以创建不同的对象了。

按照惯例,我们应该将构造器函数的首字母大写,以便区别于其它的一般函数。


1.8全局对象

function pen(name){

this.name = name;

}


var pen1 = pen('钢笔');

document.write(pen1); //这个时候返回undefined


这是因为,没有new操作符,这时候就和调用一个普通函数没有什么区别。这里的pen1值应该就是函数的返回值undefined.


那这个时候函数内部的this代表的是什么呢?答案是“全局对象”。


事实上,程序所在的环境中一般会提供一个全局对象,而我们前面所学的全局变量,就是全局对象的属性罢了。当程序的所在环境是Web浏览器时,这个全局变量就是Window了。

var a = '全局对象的全局变量';

//可以作为全局变量来访问

document.write(a + "<br>");

//也可以作为全局对象的属性来访问

document.write(window.a + "<br>");

document.write(window['a'] + "<br>");


所以上面的例子可以这样来访问

function pen(name){

this.name = name;

}


var pen1 = pen('钢笔');

//document.write(pen1.name + "<br>");

//document.write(typeof pen1.name + "<br>");

//其实它是创建了一个全局变量

document.write(name + "<br>");

//这就成了window对象的属性,也可以这样来调用

document.write(window.name + "<br>");


所以上一章所学的系统函数,也可以当作全局对象的方法来调用。

例:

parseInt(‘111’);

window.parseInt(‘111’);



1.9 构造器属性

当我们创建对象时,实际上同时也赋予了该对象一种特殊的属性——即构造器属性(constructor property)。该属性实际上是一个指向用于创建该对象的构造器函数的引用。

function pen(name){

this.name = name;

}


var pen1 = new pen('钢笔');

document.write(pen1.constructor + "<br>"); //返回构造函数


既然这样,那么我们是不是也可以这样来用:

var pen2 = new pen1.constructor('毛笔');

document.write(pen2.name);


如果是通过{}来创建的对象,那么他就是由内建构造器Object()所创建的(这个我们稍后再讲)。

var name = {};

document.write(name.constructor + "<br>");



1.10 instanceof 操作符

通过instanceof操作符,我们可以检测一个对象是不是由某个指定的构造器函数创建的。

function pen(){};

var pen1 = new pen();

var o = {};

document.write(pen1 instanceof pen);

document.write('<br>');

document.write(pen1 instanceof Object);

document.write('<br>');

document.write(o instanceof Object);

需要注意的是,这里函数名后面没有加括号,因为这里不是在调用,所心我们只需要像使用其它变量名一样,引用该函数的名字即可。


1.11 传递对象

传递对象,往往传递的都是该对象的引用。因此我们在引用上作改动,都会影响到原对象。

var obj = {name:"monan"};

var copy = obj;

document.write(copy.name + "<br/>");


copy.name = 'xiaofengfeng';

document.write(obj.name);


1.12 对象比较

var obj1 = {name:”xiaofengfeng”};

var obj2 = {name:”xiaofengfeng”};

document.write(obj1 === obj2); //false

document.write(obj1 == obj2); //false


var obj3 = obj2;

document.write(obj3 === ojb2); //true



2. 内建对象

内建对象分为三组:

l 数据封装对象:Object Array Boolean Number String。这些代表站JavaScript中不同的数据类型,并且都拥有各自不同的typeof返回值,以及undefined和null状态。

l 工具类对象: Math Date RegExp 用于提供遍历的对象

l 错误类对象:包括一般类错误对象以及其它各种特殊的错误类对象。它们可以在某些异常发生时帮助我们纠正程序工作状态。

另外值得一提的是,不要去纠结什么是内建对象,什么是内建构造器,实际上它们是一回事,要不了多久你就会明白,无论是函数还是构造器函数,最后都是对象。


2.1 Object

Object 是JavaScript中所有对象的父级对象,所有对象都继承于此。

//以下代码执行结果是等价的

var obj = {};

var obj = new Object();


空对象包含了一些对象和方法,下面列举其中一小部分:

l 返回构造器函数的构造器属性constructor

l 返回对象描述字符串的toString()方法,返回对象的描述字符串

l 返回对象单值描述信息的valueOf()方法。一般情况下,返回的就是对象本身。

例:

var obj = new Object();

document.write(obj.toString() + "<br/>"); //返回对象的描述字符串

document.write(obj.valueOf() + "<br/>"); //返回对象本身


toString()方法会在某些需要用字符串来表示对象的时候被JavaScript内部调用。例如:

alert(obj);

lalert(obj.toString); //这两个其实是一个意思。


另一种就是我们把某个对象与字符串进行连接,那么这个对象也会自己调用自身的toString()方法。

document.write(“An object:” + obj); //An object [object Object]


总而言之:

l 我们创建对象既可以用var obj = {}; 也可以用var obj = new Object();

l 无论是多复杂的对象,它都是继承自Object对象,并且拥有其所有的方法(如toString())和属性(如constructor)。


2.2 Array

是用来构建数组的内建构造器函数

//以下两种构造函数的方法是等效的

var a = new Array();

var a = [];


构建好后,就可以往数组里添加元素,删除元素,访问元素等操作了。


也可以这样定义数组:

v ar a = new Array(1,2,3);


有一种情况是特殊的

var a = new Array(5); //这样是声明一个数组,定义了数组的长度。其值都是undefined。


既然数组也是由构造器函数创建的,那么数组也是一个对象。

document.write(typeof a); //object


既然是对象,那么也可以使用Object中的属性和方法

document.write(a.toString());

document.write(a.valueOf());

document.write(a.constructor);


尽管数组也是对象,但还是有一些特殊之处:

l 数组的属性名都是从0开始递增,并自动生成数值

l 数组拥有一个用于记录数组中元素个数的length属性

l 数组是在父级对象的基础上扩展额外的内建方法

var a = new Array(1,2,3,4);

document.write(a.length + “<br/>”);

a.length = 6; //添加了两个长度

document.write(a + “<br/>”); //后两个元素值将会以undefined来填充

a.legnth = 3;

document.write(a + “<br/>”);


值得关注的数组方法

举个例:

var a = new Array(1,2,3);

a.push('haha');

document.write(a + "<br/>");

a.pop();

document.write(a + "<br/>");

其它的自己去弄去吧。


2.3 Function

函数是一种特殊的数据类型,但事实远远不止如此,它实际上是一种对象。函数对象的内建构造器函数是Function(),我们可以把它看作是创建函数的一种备选方式,便不推荐这样用。

下面三种定义函数的方式是等效的:

function sum(a,b){

return a + b;

}

var sum = function(a,b){

return a + b;

}

var sum = new Function(‘a’,’b’,’return a + b;’);


注意:用内建构造器函数Function()创建的函数,括号中的代码全是字符串,这样的话,JavaScript要先解析这些字符串,然后再创建一个函数。这样效率是很低的。所以不推荐使用。


2.3.1 Function对象的属性

函数对象中含有一个构造器属性(constructor),其引用的就是Funciton()构造器函数

//construct 属性

var myfunc(a){return a;};

document.write(myfunc.constructor); //Function()


//length 属性:记录函数的参数个数

function myfunc(a,b,c,d,e){

return true;

}

document.write(myfunc.length);


//caller属性:在ECMA标准之外的属性,返回一个调用该函数对象的外层函数引用。

function a(){

return a.caller;

}

function b(){

return a();

}

document.write(b()); // function b(){return a();}


//prototype 属性

l 每个函数的prorotype属性中都包含了一个对象

l 它只有在该函数是构造函数时才会发挥作用

l 该函数创建的所有对象都会持有一个该prototype属性的引用,并可以将其当做自身的属性来使用。

例:

//声明一个对象

var obj = {

name: 'xiaohua',

say: function(){

return "My name is " + this.name +"<br/>";

}

}


//声明一个空函数,该函数的prototype属性是一个对象

function F(){}

document.write(F.prototype + "<br/>");


//把obj赋值给F()函数的prototype

F.prototype = obj;


//现在,我们将F()作为一个构造函数来创建对象,那么新对象obj就会对F.prototype属性的访问权

var newobj = new F();

document.write(newobj.name + "<br>");

document.write(newobj.say() + "<br>");


2.3.2 Function对象的方法:

它也拥有Object的所有方法。

//toString()方法:得到的是该函数的原代码

function myfunc(){

return arguments;

}

document.write(myfunc.toString() + "<br/>");


//如果用toString()来查看内建函数,是看不见源码的,得到的是一个没有用的字符串

document.write(eval.toString() + “<br/>”);


//call() 和 apply() 两个方法,通过这两个方法可以去借用其它对象中的方法,为己所用。这是一种代码重写的方式,非常简单,而且实用。

//声明一个对

var obj = {

name: '西门庆',

say: function(age){

return "My name is " + this.name + " My age is " + age + " year old<br/>"

}

}


//再创建一个新对象

var newobj = {name:"潘金莲"};


document.write(obj.say.call(newobj,15) + "<br/>");

document.write(obj.say.apply(newobj,[30,20]) + "<br/>");


2.3.3 重新认识arguments对象

arguments对象是用来访问传递给函数的参数。看上去像一个数组,其实只是一个年直去有点像数组的对象。因为数组是不会有方法的。arguments可以使用sort()、slice()这样的数组方法。

在这里呢,是想给大家介绍一个值得关注的属性——callee属性。该属性引用的是当前被调用的函数对象。也就是说,如果我们所建函数的返回值是arguments.callee的话,该函数在被调用时就会返回自身的引用。

//例:

function myfunc(){

return arguments.callee;

}

document.write(myfunc() + "<br/>");


//这就相当于是自己调用自己,可以用它来实现匿名函数的递归调用

(

function(count){

if(count <= 5){

document.write(count + "<br/>");

arguments.callee(++count);


}

}

)(0);

2.4 Boolean

继续内建对象,接下来介绍的是基本数据类型的封装:Boolean Number String.

首先介绍一下Boolean ,由Boolean()构造器所创建的对象并没有多少实用性,因为他并没有提供来自父级对象以外的任何方法和属性。

//这里必须明白,由内建函数创建的是一个对象,不是一个基本的布尔值。

var b = new Boolean();

document.write(typeof b + "<br/>");

document.write(typeof b.valueOf() + "<br/>");


//想获取这样的基本类型值,可以用valueOf()方法

document.write(b.valueOf() + "<br/>");


//被当作函数用的时候,会把非布尔值转换为布尔值(相当于两次取反)

document.write(Boolean("test") + "<br/>"); //字符串为真

document.write(Boolean("") + "<br/>"); //空字符串为真

document.write(Boolean({}) + "<br/>"); //空对象为真

document.write(Boolean([]) + "<br/>"); //空数组为真

document.write(Boolean(0) + "<br/>"); //0为假


2.5 Number

Number()函数与Boolean()基本相同,即:

l 在被当作一般函数时,它会试图将任何值转换为数字,这与parseInt() 和 parseFloat()起到的作用基本相同。

l 在被当作构造器函数时(即用于new操作符),它会创建一个对象。

var n = Number('12.12');

document.write(n + "<br/>"); //12.12

document.write(typeof n + "<br/>"); //number


var n = new Number('12.12');

document.write(typeof n + "<br/>"); //Object


Number对象的属性

//Number对象的属性

document.write(Number.MAX_VALUE + "<br/>"); //最大值

document.write(Number.MIN_VALUE + "<br/>"); //最小值

document.write(Number.POSITIVE_INFINITY + "<br/>"); //正无穷大

document.write(Number.NEGATIVE_INFINITY + "<br/>"); //负无穷大

document.write(Number.NaN + "<br/>"); //Not a Number


//Number对象的三个方法

var n = new Number(123.45678);

document.write(n.toFixed(1) + "<br/>");


var n = new Number(123456789);

document.write(n.toExponential(5) + "<br/>");


var n = new Number(255);

document.write(n.toString() + "<br/>"); //不填参数,默认为10进制

document.write(n.toString(10) + "<br/>"); //同上

document.write(n.toString(16) + "<br/>"); //转为十六进制

document.write(n.toString(2) + "<br/>"); //转为二进制


2.6 String对象

String()构造器函数创建一个Stirng对象。该对象为我们提供了一系列用于文本操作的方法,但我们还是推荐使用基本的字符串类型。

//通过下面的例子来看看String对象与基本字符串类型的区别

var str = "hello";

document.write(typeof str + "<br/>"); //字符串

var str = new String('world');

document.write(typeof str + "<br/>"); //对象


//String对象就像是一个数组,有索引,也有length属性

document.write(str[0] + "<br/>");

document.write(str[4] + "<br/>");

document.write(str.length + "<br/>");


//String对象继承自Object对象,因此想要查看基本类型值可能通过valueOf() toString()方法,也可以将其转换为字符串

document.write(str.valueOf() + "<br/>");

document.write(str.toString() + "<br/>");

document.write(str + "<br/>"); //第三种,拼接为字符串,也是字符串转换的一种


//如果我们将基本字符串当作对象来使用,后台就会自动调用相应的String对象创建与销毁操作

document.write("hello".length + "<br/>");

document.write("hello"[0] + "<br/>");

document.write("hello"["hello".length - 1] + "<br/>");


//再来看一个String对象和基本字符串的区别的例子

document.write(Boolean("") + "<br>");

document.write(Boolean(new String("")) + "<br>");


//与Number 和 Boolean对象类似,如果我们不作用new操作符来调用Stirng()函数,它将会将其参数转换为字符串类型的值。如果其参数是一个对象的话,就相当于调用该对象的toString()方法

document.write(typeof String(1) + "<br/>");

document.write(String({p:1}) + "<br/>");

document.write(String([1,2,3]) + "<br/>");

String对象中值得关注的方法:

var str = "Abcd EfgeE";

document.write(str.toUpperCase() + "<br/>"); //转大写


document.write(str.toLowerCase() + "<br/>"); //转小写


document.write(str.charAt(3) + "<br/>"); //返回指定位置的字符


document.write(str.indexOf('E') + "<br/>"); //返回指定字符的位置


document.write(str.lastIndexOf('E') + "<br/>"); //返回指定字符的最后出现的位置


document.write(str.toUpperCase().indexOf('E',6) + "<br/>"); //先转为大写,相当于不区分大小写,从第六个开始查询,返回E的位置


document.write(str.indexOf('z') + "<br/>"); //不存在返回-1


//slice() substring() 这两个方法都可以返回字符串的指定区间

document.write(str.slice(1,4) + "<br/>");

document.write(str.substring(1,4) + "<br/>");


//第二个参数指定的是区间的末端位置,而不是长度。这两个方法不同之处在于负值的处理方式。slice()会把这个负数和长度相加,而substring()则把它视为从0开始

document.write(str.slice(1,-1) + "<br/>");

document.write(str.substring(3,-1) + "<br/>");


//split()方法:将字符串按照指定字符分割为数组

document.write(str.split(' ') + "<br/>");

document.write(str.split(' ').join(' ') + "<br/>"); //数组又变回字符串了


//concat()方法,追加字符串,与字符串类型+操作符类似

document.write(str.concat("zzzzzzz") + "<br/>");

document.write(str + "zzzzzzz" + "<br/>");


//以上讨论的情况,都不会修改源字符串


2.7 Math对象

Math对象与其它内建对象有些区别,既不能当作一般函数来使用,也不能用new操作符来创建对象。Math只是一个包含一系列方法和属性、用于数学计算的内奸对象。

Math对象的属性都是不可修改的,因此它们都是大写的。

//Math对象的属性

//3.14

document.write(Math.PI + "<br/>");

//2的平方根

document.write(Math.SQRT2 + "<br/>");

//欧拉常数e

document.write(Math.E + "<br/>");

//2的自然对数

document.write(Math.LN2 + "<br/>");

//10的自然对数

document.write(Math.LN10 + "<br/>");


//Math对象的方法

//生成随机数 Math.round() 四舍五入  Math.ceil() Math.floor()

document.write(Math.random() + "<br/>"); //返回0到1之间的某个数

document.write(Math.round(Math.random()*100) + "<br/>"); //返回0到100之间的某个整数


//如果要获取某个区间内的值,用这个公式(max - min) * Math.random() + min

document.write(Math.round((100 - 20) * Math.random() + 20) + "<br/>")


//Math.min() Math.max() 取一个区间内的最小值,最大值

//比如如何验证一个合法的月份

var n = 13;

document.write(Math.min(Math.max(1,n),12) + "<br/>");


//2的8次方

document.write(Math.pow(2,8) + "<br/>");


//求9的平方根

document.write(Math.sqrt(9) + "<br/>");


2.8 Date对象

Date()对象是用于创建Date对象的构造函数器,可以传递以下几种参数:

l 无参数(返回当天的日期)

l 一个用于表示日期的字符串

l 分别传递日、月、时间等值

l 一个Unix时间戳


//表示一个当天时间的对象实例

document.write(new Date() + "<br/>");


//其它的一些表示

var d = new Date('2013 07 17 17:30:50');

document.write(d + "<br/>");


var d = new Date('1 1 2014');

document.write(d + "<br/>");


//通过一个字符串来表示日期不够精确

//更好的选择是向构造器传递一些具体的值

//年份,月份(0-11),日期(1-31),小时(0-23)、

//分钟(0-59),秒钟(0-59),毫秒(0-999)

var d = new Date(2013,2,30,12,13,13,888);

document.write(d + "<br/>");


//传一个Unxi时间戳

var d = new Date(1369996543234);

document.write(d + "<br/>");


//如果没有 使用new操作符,无论传不传参数,得到的都是当前时间

var d = Date(111111111111111);

document.write(d + "<br/>");


//表示一个当天时间的对象实例

document.write(new Date() + "<br/>");


//其它的一些表示

var d = new Date('2013 07 17 17:30:50');

document.write(d + "<br/>");


var d = new Date('1 1 2014');

document.write(d + "<br/>");


//通过一个字符串来表示日期不够精确

//更好的选择是向构造器传递一些具体的值

//年份,月份(0-11),日期(1-31),小时(0-23)、

//分钟(0-59),秒钟(0-59),毫秒(0-999)

var d = new Date(2013,2,30,12,13,13,888);

document.write(d + "<br/>");


//传一个Unxi时间戳

var d = new Date(1369996543234);

document.write(d + "<br/>");


//如果没有 使用new操作符,无论传不传参数,得到的都是当前时间

var d = Date(111111111111111);

document.write(d + "<br/>");


//Date对象方法的工作方式

//一旦创建了Date对象,就可以使用该对象中的很多方法

//使用最多的就是set*() 和get*()系列

//例如,getMonth(),setMonth(),getHours(),setHours()

var d = new Date();

document.write(d.getMonth() + "<br/>");

document.write(d.toLocaleString() + "<br/>");


//设置为8月

d.setMonth(7);

document.write(d.toLocaleString() + "<br/>");


//把字符串转为Unix时间戳,注意这个时间戳不是秒,而是毫秒

var d = Date.UTC(2013,7,18);

document.write(d + "<br/>");


var d = Date.parse('7,18,2013');

document.write(d + "<br/>");

document.write(new Date(d).toLocaleString() + "<br/>");


//Date()函数也可以接受一个Unix时间戳

var d = new Date(1376784000000);

document.write(d.toLocaleString() + "<br/>");


//输出一个我们习惯的时间

var d = new Date();

document.write(d.getFullYear() + "年"+ (d.getMonth() + 1)+ "月" + d.getDate(d) + "日" + d.getHours() + "时" + d.getMinutes() + "分" + d.getSeconds() + "秒" + "<br/>");




2.9 RegExp (正则表达式)

正则表达式是一种强大的文本搜索和处理方式

正则表达式的组成:

l 一个用于匹配的模式文本

l 用0个或多个修饰符描述匹配模式细节

事实上掌握正则表达式是一个很大的问题,我们不打算在这里详细的讨论这个问题。我们只是来介绍一下它在JavaScript中的语法。

//利用构造器函数来创建一个正则对象

var re = new RegExp("j.*t");

//有一个更为简便的定义正则对象的方式:文本定义方式

var re1 = /j.*t/; //这里不需要引号,如果是把它放在构造器函数中是需要引号的。


2.9.1 RegExp对象的属性

* global: 如果设置该属性为false(这也是默认值),相关搜索会在找到第一个匹配的位置时就停止。如果需要找到所有匹配的位置,就需要设置为true

* ignoreCase: 设置是否区分大小写,默认为false

* multiline: 设置是否跨行搜索的选项,默认为false

* lastIndex: 设置开始的索引位置,默认为0

* source: 用于存储正则表达式匹配模式的属性

除了lastIndex外,上述属性定义了对象之后就不能被修改。前三个属性还可以通过RegExp修饰符来表示。当我们创建一个正则对象时,就向构造函数的第二个参数,传递下列字符中的任意组合即可。

l g 代表 global

l i 代表 ignoreCase

l m 代表 multiline

只要传递了该值就说明值被设置为true了。

例:

var re = new RegExp(“j.*t”,’gim’);

var re1 = /j.*t/gim;


2.9.2 RegExp对象的方法

test() //返回布尔值

exec() //返回匹配到的字符组成的数组

document.write(/j.*t/gim.test("JavaScript") + "<br/>"); //true

document.write(/j.*t/gi.exec("JavaScript") + "<br/>"); //JavaScript


2.9.3 以正则表达式为参数的字符串方法

* match() 返回一个包含匹配内容的数组

* search() 返回第一个匹配内容所在的位置

* replace() 将匹配到的文本替换为指定的字符串

* split() 能根据指定的正则表达式将目标字符串分割成数组元素

var s = new String("HelloJavaScriptWorld");


document.write(s.match(/[A-Z]/g) + "<br/>"); //[H,J,S,W]

document.write(s.search(/j.*a/i) + "<br/>");


document.write(s.replace(/[A-Z]/g,'**') + "<br/>");


var str = "one*two*three*four";

var newstr = str.split(/\*/);

document.write(newstr + "<br/>");


//以上四个函数,如果正则过于简单,建议直接使用字符串来表示。但是如果这们析话,就不能使用修饰符了。


2.10 Error对象

当程序出现错误时,就会抛出一个Error对象,该对象可能由以下几个内建构造器中的一个产生而成,它们包括EvalError  RangeError  ReferenceError  SyntaxError  TypeError  URIError  这些构造器都继承自Error对象。

try{

l();

}catch(e){

//try里面如果有错误,就会执行这里的代码

document.write(e.name + ":" + e.message + "<br/>");

}finally{

//有没有错误都要执行的代码

document.write("强制执行<br/>");

}


////实例二,自定义错误抛出

try{

var func = function(){return 0;};

var total = func();

if(total === 0){

throw {name:"除数", message:"OMG!除数不能为零"};

}else{

document.write(50 / total);

document.write("<br/>");

}

}catch(e){

document.write(e.name + ":" + e.message + "<br/>");

}finally{

document.write("强制执行的代码块<br/>");

}


转载于:https://my.oschina.net/appk/blog/152951

一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值