1.08 JavaScript对象简介
JavaScript数据类型
基本数据类型 引用类型
在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,这有点类似于传统面向对象语言中的“类”,但ECMAScript只是一种基于对象的语言,它不具备传统的面向对象语言所支持的类和接口等基本结构,因此,在ECMAScript中,引用类型被称为“对象定义”,它描述一类对象所具有的属性和方法。而引用类型的值则称为“对象”,它是引用类型的一个实例。
-
ECMAScript中的对象有三种:
☞ 本地对象:
ECMA-262 把本地对象定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。 简单来说,本地对象就是 ECMA-262 定义的引用类型。它们包括:Object、Function、 Array、String、Boolean、Number、Date、RegExp。
☞ 内置对象:
ECMA-262 把内置对象定义为“由 ECMAScript 实现提供的、独立于宿主环境的 所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例 化内置对象,它已被实例化了。ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
☞ 宿主对象:
所有非本地对象都是宿主对象,即由 ECMAScript 实现的宿主环境提供的对象。 如 BOM 和 DOM 对象都是宿主对象。
-
创建本地对象:
JavaScript中,创建对象有以下几种常用的方式:
☞ 使用new操作符后跟一个构造函数来创建
如 var obj=new Object();
var d=new Date();
☞ 使用对象字面量表示法
如 var person={
name:“张三”,
age:25,
height:“78KG”}
使用函数来构造对象
实例代码:
function person(name,age,height){
this.name=name;
this.age=age;
this.height=height;
}
var person3=new person("王五",28,"68kg");
建议多使用对象字面量法,因为这种语法要求的代码量少,而且能给人封装数据的感觉。实际上,对象字面量也是向函数传递大量可选参数的首选方式。
实例代码:
function displayInfo(args){
var output=””;
if(typeof args.name ==”string”){
output+ = “Name:”+args.name+”\n”;
}
if(typeof args.age ==”number”){
output+=”Age:”+args.age+”\n”;
}
console.log(output);
}
displayInfo({name:'abc',age:29})
displayInfo({name:'def'});
在这个例子中,函数displayInfo()接受一个名为args的参数。这个参数可能带有一
个名为name或age的属性,也可能这两个属性都有或者都没有。
这种传递参数的模式最适合需要向函数传入大量可选参数的情形。一般来讲,命名参数虽然容易处理,但在有多个可选参数的情况下就会显得不够灵活。最好的做法是对那些必需值使用命名参数,而使用对象字面量来封装多个可选参数。
一般来说,访问对象属性时使用的都是点表示法,这也是很多面向对象语言中通用的语法。不过,在javascript也可以使用方括号表示法来访问对象的属性。在使用方括号时,应该将要访问的属性以字符串的形式放在方括号中。
例如:person[‘name’] person.name
从功能上看,这两种访问对象属性的方法没有任何区别。但方括号的主要优点是可以通过变量来访问属性,
例如:var propertyName =‘def’;
console.log(person[propertyName]);
如果属性名中包含会导致语法错误的字符,或者属性名使用的关键字或保留字,也可以使用方括号表示法。
例如:person[“first name”]=‘abc’;
由于 “first name”中包含一个空格,所以不能使用点表示法来访问它。
然而,属性名中是可以包含非字母非数字的,这时候就可以使用方括号表示法来访问它们。通常,除非必须使用变量来访问属性,建议使用点表示法。
访问对象属性:
如 var arr=new Array();
alert(arr.length);
调用对象方法:
如 var d1=new Date();
alert(d1.getFullYear());
1.09 Object类型
-Object类型用来创建一个通用的对象,它是ECMAScript中使用最多的一个类型,虽然Object的实例不具备多少功能,但对于在应用程序中存储和传输数据来说,它是非常理想的选择。
-ECMAScript中的所有对象都由这个对象继承而来,Object 对象中的所有属性和方法都会出现在其他对象中 。
Object类型的使用:
格式:
var obj=new Object([value]);
obj—必选项,代表要赋值为Object对象的变量名。
vaule—可选项,可以是任意一种 JavaScript的基本数据类型。(Number、Boolean、
或 String。)如果 value 为一个对象,返回不作改动的该对象。如果value 为
null、undefined,或者没有给出,则产生没有内容的对象。
Object对象的属性和方法:
1.20 Array类型
Array类型也是ECMAScript中最常用的类型之一,ECMAScript中的数组与其他语言中的数组有着相当大的区别:
☞ ECMAScript中的数组的每一项可以保存任何类型的数据。
☞ ECMAScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新
增数据。
数组的创建:
☞ 使用Array()构造函数创建
如 var arr1=new Array();
var arr2=new Array(10);
var arr3=new Array(“张三”);
var arr4=Array(3);
使用字面量形式创建:
如 var colors=["red","blue","green"];
var name=[];
访问数组元素:
使用方括号加索引值得形式。
如 colors[0]
colors[2]
数组的length属性:
ECMAScript中,数组的length属性不是只读的,通过改变这个属性,可以从数组的末尾移除数组元素或向数组中添加新项。
如 var colors=["red","blue","green"];
colors.length=2; //移除末尾项green
colors[colors.length]=black; //新增一项
colors.lenght=5; //新增两个空项
检测数组:
要判断某个对象是否为数组,ECMAScript 3使用instanceof操作符检测。在ECMAScript 5中则新增了一个Array.isArray()方法来判断。
-
数字对象的常用属性和方法
迭代方法:(es5新增)每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象-影响this的值。传入这些方法中的函数会接收三个参数:数组项的值,该项在数组中的位置和数组对象本身。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响方法的返回值。
- every():
对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true.
下例检测数组中的所有元素是否都大于 10。
- every():
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
- filter():
对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入到返回数组中,false则不加;
新数组只包含返回true的值,索引缺失的不包括,原数组保持不变。
var data = [1,2,3,4,5];
console.log(data.filter(function(e){
return e%2==0;
}));
console.log(data);
-
forEach()
对数组中的每一项给定函数。这个方法没有返回值从头到尾遍历数组,为每个元素调用指定函数
第一个参数:传递的函数
该函数调用的参数:数组元素、元素索引、数组本身
var data =[1,2,3,4,5];
var sum =0;
data.forEach(function(value){
sum+=value;
});
console.log(“sum:”+sum);
data.forEach(function(a,i,v){
a [i]=v+1;
});
console.log(“加1后的值:”+data);
-
map()
对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
调用数组的每个元素传递给指定的函数,并返回一个包含返回值的新数组;
传递给map()的函数有返回值,map()返回新数组,不会修改调用的数组;
a =[1,2,3];
b = a.map(function(x){return x*x});
console.log(a);
-
some()
对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true.以上方法都不会修改数组中的包含值。
var a = new Array(1,2,3,4,5,6);
console.log(a.some(function(e){
return e>3;}));
console.log(a.every(function(e){
return e>3}));
every每一项都为true才为true,some只要有一项为true就为true。
every(function(item,index,array){});
some(function(item,index,array){});
归并方法:
ECMAScript5还新增了两个归并数组的方法:reduce()和reduceRight().这两个方
法都会迭代数组的所有项,然后构建一个最终返回的值。其中reduce()方法从数组的第
一项开始,逐个遍历到最后。而reduceRight()则从数组的最后一项开始,向前遍历到
第一项。
这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初
始值。传给reduce()和reduceRight()的函数接收4个参数:前一个值、当前值、项的
索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭
代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二
项。
1.21 Data类型
Date对象提供了与日期、时间相关的操作功能。ECMAScript中的Date类型是在早期java中的java.util.Date类基础上构建的,它使用来自UTC(国际协调时间)1970年1月1日零时开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后285616年。
创建日期对象:
var d1=new Date();
var d2=new Date(“May 25,2008”);
Data对象的常用属性和方法:
1.22 RegExp类型
RegExp对象表示正则表达式,它是字符串执行模式匹配的强大工具。ECMAScript正则表达式使用类似Perl的语法。
创建正则表达式
格式:
var expression=/pattern/flags; 或 var expression=new RegExp(pattern,flags);
参数说明:
pattern:字符串,指定正则表达式的模式或其他正则表达式
flags:可选参数 i-忽略大小写 g-全局匹配 m-多行模式
i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串
的大小写
g:表示全局(glob)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时
立即停止
m:表示多行模式(multiline)即在到达一行文本末尾时还会继续查找下一行中是否存在
与模式匹配的项。
测试正则表达式:
如 var re1=new RegExp("abc","i");
var re2=/abc/i;
test()方法:
如 alert(re1.test("abc1234edefg"));
alert(re2.test("ABCA1234edefg"));
RegExp对象的常用属性和方法: