Object类
ECMAScript中的Object类与Java中的java.lang.object相似,ECMAScript中的所有类都由这个类继承而来,Object类中的所有属性和方法都会出现在其他类中,所以理解了Object类,就可以更好地理解其他类。
Object类具有下列属性:
Constructor——对创建对象的函数的引用(指针)。对于Object类,该指针指向原始的object()函数。
Prototype——对该对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。
Object类还有几个方法:
HasOwnProperty(property)——判断对象是否有某个特定的属性。必须用字符串指定该属性(例如,o.hasOwnProperty("name"))。
IsPrototypeOf(object)——判断该对象是否为另一个对象的原型。
PropertyIsEnumerable(property)——判断给定的属性是否可以用for…in语句进行枚举。
ToString()——返回对象的原始字符串表示。对于Object类,ECMA-262没有定义这个值,所以不同的ECMAScript实现具有不同的值。
ValueOf()——返回最适合该对象的原始值。对于许多类,该方法返回的值都与toString()的返回值相同。
上面列出的每种属性和方法都会被其他类覆盖。
Boolean类
- var oFalseObject = new Boolean(false);
- var bResult = oFalseObject && true;//outputs "true"
在这段代码中,用false值创建Boolean对象。然后用这个值与原始值true进行AND操作。在Boolean运算中,false和true进行AND操作的结果是false。不过,在这行代码中,计算的是oFalseObject,而不是它的值false。正如前面讨论过的,在Boolean表达式中,所有对象都会被自动转换为true,所以oFalseObejct的值是true。然后true再与true进行AND操作,结果为true。
Number类
Number类是Number原始类型的引用类型。
- var oNumberObject = new Number(55);//创建Number对象
- var iNumber = oNumberObject.valueOf();//得到数字对象的Number原始值
- var oNumberObject = new Number(99);
- alert(oNumberObject.toFixed(2));//outputs "99.00"
- //toFixed()方法返回的是具有指定位数小数的数字的字符串表示
- var oNumberObject = new Number(99);
- alert(oNumberObject.toExponential(1));//outputs "9.9e+1"
- //它返回的是用科学记数法表示的数字的字符串形式
- var oNumberObject = new Number(99);
- alert(oNumberObject.toPrecision(1));//outputs "1e+2"
- //toPrecision()方法根据最有意义的形式来返回数字的预定形式或指数形式。
- //它有一个参数,即用于表示数的数字总数(不包括指数)。
toFixed()、toExponential()和toPrecision()方法都会进行舍入操作,以便用正确的小数位数正确地表示一个数。
String类
String类是String原始类型的对象表示法,它是以下列方式创建的:
- var oStringObject = new String("hello world");
- var oStringObject = new String("hello world");
- alert(oStringObject.length);//outputs "11"
- //String类具有属性length,它是字符串中的字符个数
- var oStringObject = new String("hello world");
- alert(oStringObject.charAt(1));//outputs "e"
- //charAt()方法返回的是包含指定位置处的字符的字符串
- var oStringObject = new String("hello world");
- alert(oStringObject.charCodeAt(1));//outputs "101"
- //如果想得到的不是字符,而是字符代码,那么可以调用charCodeAt()
- var oStringObject = new String("hello ");
- var sResult = oStringObject.concat("world");
- alert(sResult); //outputs "hello world"
- alert(oStringObject);//outputs "hello "
- //concat()方法,用于把一个或多个字符串连接到String对象的原始值上
- var oStringObject = new String("hello world");
- alert(oStringObject.indexOf("o"));//outputs "4"
- alert(oStringObject.lastIndexOf("o"));//outputs "7"
- //indexOf()方法是从字符串的开头(位置0)开始检索子串
- //lastIndexOf()则是从字符串的结尾开始检索子串的
这里,第一个"o"字符串出现在位置4,即"hello"中的"o";最后一个"o"字符串出现在位置7,即"world"中的"o"。如果该字符串中只有一个"o"字符串,那么indexOf()和lastIndexOf()方法返回的位置相同。
下一个方法是localeCompare(),对字符串值进行排序。该方法有一个参数——要进行比较的字符串,返回的是下列3个值之一:
如果String对象按照字母顺序排在参数中的字符串之前,返回负数(最常见的是-1,不过真正返回的值是由实现决定的)。
如果String对象等于参数中的字符串,返回0。
如果String对象按照字母顺序排在参数中的字符串之后,返回正数(最常见的是1,不过同样,真正返回的值是由实现决定的)。
示例如下:
- var oStringObject = new String("yellow");
- alert(oStringObject.localeCompare("brick")); //outputs "1"
- alert(oStringObject.localeCompare("yellow"));//outputs "0"
- alert(oStringObject.localeCompare("zoo")); //outputs "-1"
ECMAScript提供了两种方法从子串创建字符串值,即slice()和substring()。这两种方法返回的都是要处理的字符串的子串,都接受一个或两个参数。第一个参数是要获取的子串的起始位置,第二个参数(如果使用的话)是要获取子串终止前的位置(也就是说,获取终止位置处的字符不包括在返回的值内)。如果省略第二个参数,终止位就默认为字符串的长度。与concat()方法一样,slice()和substring()方法都不改变String对象自身的值。它们只返回原始的String值,保持String对象不变。
- var oStringObject = new String("hello world");
- alert(oStringObject.slice(3)); //outputs "lo world"
- alert(oStringObject.substring(3)); //outputs "lo world"
- alert(oStringObject.slice(3,7)); //outputs "lo w"
- alert(oStringObject.substring(3,7));//outputs "lo w"
对于负数参数,slice()方法会用字符串的长度加上参数,substring()方法则将其作为0处理(也就是说将忽略它)。例如:
- var oStringObject = new String("hello world");
- alert(oStringObject.slice(-3)); //outputs "rld"
- alert(oStringObject.substring(-3)); //outputs "hello world"
- alert(oStringObject.slice(3,-4)); //outputs "lo w"
- alert(oStringObject.substring(3,-4));//outputs "hel"
有4种方法用于执行大小写转换,即toLower- Case()、toLocaleLowerCase()、toUpperCase()和toLocaleUpperCase()。从名字上可以看出它们的用途,前两种方法用于把字符串转换成全小写的,后两种方法用于把字符串转换成全大写的。
- var oStringObject = new String("Hello World");
- alert(oStringObject.toLocaleUpperCase());//outputs "HELLO WORLD"
- alert(oStringObject.toUpperCase()); //outputs "HELLO WORLD"
- alert(oStringObject.toLocaleLowerCase());//outputs "hello world"
- alert(oStringObject.toLowerCase()); //outputs "hello world"
这段代码中,toUpperCase()和toLocaleUpperCase()方法输出的都是"HELLO WORLD",toLowerCase()和toLocaleLowerCase()方法输出的都是"hello world"。一般说来,如果不知道在以哪种编码运行一种语言,则使用区域特定的方法比较安全。
记住,String类的所有属性和方法都可应用于String原始值上,因为它们是伪对象。
instanceof 运算符
在使用typeof运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回"object"。ECMAScript引入了另一个Java运算符instanceof来解决这个问题。
instanceof运算符与typeof运算符相似,用于识别正在处理的对象的类型。与typeof方法不同的是,instanceof方法要求开发者明确地确认对象为某特定类型。例如:
- var oStringObject = new String("hello world");
- alert(oStringObject instanceof String);//outputs "true"
这段代码问的是“变量oStringObject是否为String类的实例?”oStringObject的确是String类的实例,因此结果是"true"。尽管不像typeof方法那样灵活,但是在typeof方法返回"object"的情况下,instanceof方法还是很有用的。