ECMAScript引用类型详解:Object、Boolean、Number与String核心特性

作者:半夏时间:2026-10-26 17:23:19浏览:427

本文深入解析ECMAScript中的核心引用类型。涵盖Object类的原型与内置方法,剖析Boolean对象在逻辑运算中的隐式转换陷阱,详解Number类的toFixed、toExponential及toPrecision格式化规则,并系统梳理String类的字符处理、查找、截取与大小写转换方法,最后通过instanceof运算符区分对象类型。

ECMAScript引用类型概述

2.8 引用类型



1、Object类

Object类及其属性与方法

在ECMAScript规范中,所有内置类均继承自Object基类。



Object类提供了以下关键属性:



Constructor:指向创建该对象构造函数(指针)的引用,针对Object类,此指针指向原始的Object()构造函数。



Prototype:指向该对象的原型对象引用。



此外,Object类还包含若干实用方法:



HasOwnProperty(property):检测对象是否拥有指定的自有属性,参数必须为字符串形式的属性名。



IsPrototypeOf(object):判断当前对象是否为指定对象的原型链中的一环。



PropertyIsEnumerable(property):检查指定属性是否可被for...in循环枚举。



ToString():返回对象对应的原始字符串表示形式。



ValueOf():返回最适合该对象的原始值。对于多数类,其返回值通常与toString()一致。



上述列出的所有属性和方法均可被子类覆盖或重写。



2、Boolean类

Boolean对象的隐式转换陷阱

在实际ECMAScript开发中,极少直接使用Boolean包装对象,因其行为容易引发误解,例如:


代码如下:

 
var oFalseObject = new Boolean(false);
var bResult= oFalseObject && true; //outpus true

上述代码创建了一个值为false的Boolean对象,并将其与原始布尔值true进行AND逻辑运算。按布尔逻辑,false与true的AND结果应为false。然而,此处实际参与运算的是oFalseObject对象本身。在布尔表达式求值时,所有对象(无论其内部值如何)均被自动转换为true,因此最终结果为true。参考以下对比代码:


代码如下:

 
var oFalseObject = new Boolean(false);
var bResult= oFalseObject && true; //outpus true
var bResult2= oFalseObject.valueOf() && true; //outpus false

3、Number类

Number类的数值格式化方法

Number类型的toString()方法已在先前章节详细阐述。



Number类提供了几个专门处理数值格式化的方法:



toFixed(参数):返回包含指定小数位数的数字字符串表示。参数取值范围为0至20。



toExponential(参数):返回使用科学计数法表示的数字字符串。该方法的参数指定小数点后的位数,取值范围同样为0至20。



toPrecision(参数):根据最具意义的格式(定点或指数)返回数字字符串。该参数指定表示数字所需的总位数(不含指数部分),最小值为1。



上述三个方法均执行舍入操作。示例代码如下:


代码如下:

 
var oNumber=new Number(99);
console.log(oNumber.toFixed(0)); //outpus 99
console.log(oNumber.toFixed(2)); //outpus 99.00
var oNumber1=new Number(99);
console.log(oNumber1.toExponential(0)); //outpus 1e+2 进行了舍入操作
console.log(oNumber1.toExponential(1)); //outpus 9.9e+1
console.log(oNumber1.toExponential(2)); //outpus 9.90e+1
var oNumber3=new Number(99);
console.log(oNumber3.toPrecision(0)); //outpus error precision 0 out of range
console.log(oNumber3.toPrecision(1)); //outpus 1e+2 进行了舍入操作
console.log(oNumber3.toPrecision(2)); //outpus 99
console.log(oNumber3.toPrecision(3)); //outpus 99.0

4、String类

String类的核心操作方法

String对象的valueOf()与toString()方法均返回String类型的原始值:


代码如下:

 
var oStringObject=new String("Hello world");
console.log(oStringObject.valueOf() == oStringObject.toString());//outpus true

String类包含length属性,表示字符串中的字符总数,其中双字节字符也计为一个字符。



String类提供了大量方法,主要介绍如下:



charAt(整型参数):返回字符串中指定位置的单个字符。示例:


代码如下:

 
var oStringObject=new String("Hello world");
console.log(oStringObject.charAt(0));//outpus "H"
console.log(oStringObject.charAt(1));//outpus "e"
console.log(oStringObject.charAt(11));//outpus (an empty string)

charCodeAt(整型参数):返回字符串中指定位置字符的Unicode编码值。示例:


代码如下:

 
var oStringObject=new String("Hello world");
console.log(oStringObject.charCodeAt(0));//outpus "72"
console.log(oStringObject.charCodeAt(1));//outpus "101"
console.log(oStringObject.charCodeAt(11));//outpus NaN

concat(字符串):将一个或多个字符串连接到String对象的原始值末尾。示例:


代码如下:

 
var oStringObject=new String("Hello world");
var sResult=oStringObject.concat(" Concat");
console.log(oStringObject);//outpus "String { 0="H", 1="e", 2="l", ...}"
console.log(sResult);//outpus "Hello world Concat"
alert(oStringObject);//outpus "Hello world"

indexOf(字符串):返回指定子字符串在字符串中首次出现的位置(从头开始检索)。



lastIndexOf(字符串):返回指定子字符串在字符串中最后一次出现的位置(从尾部开始检索)。示例:


代码如下:

 
var oStringObject=new String("Hello Hello");
console.log(oStringObject.indexOf("lo"));//outpus 3
console.log(oStringObject.lastIndexOf("lo"));//outpus 9

localeCompare(字符串):按区域设置规则对字符串进行排序比较,返回值有以下几种情况:



A、若String对象按字母顺序排在参数字符串之前,返回负数(通常为-1,具体取决于实现)。



B、若String对象等于参数字符串,返回0。



C、若String对象按字母顺序排在参数字符串之后,返回正数(通常为1,具体取决于实现)。



示例:


代码如下:

 
var oStringObject=new String("Hello");
console.log(oStringObject.localeCompare("aello")); //outpus 1
console.log(oStringObject.localeCompare("Hello")); //outpus 0
console.log(oStringObject.localeCompare("zello")); //outpus -1

slice(整型参数[,整型参数])、substring(整型参数[,整型参数]):从原字符串截取子串生成新字符串。第一个参数指定起始索引,第二个参数指定结束索引(不包含该位置)。若省略第二个参数,则默认截取至字符串末尾。这两个方法均不修改原String对象。当参数均为非负数时,两者行为一致;差异仅出现在负数参数处理上:slice()会将负索引视为字符串长度加上该负值,而substring()将负索引视为0。此外,若第二个参数小于第一个参数,slice()返回空字符串,而substring()会自动交换两个参数位置。示例如下:


代码如下:

 
var oStringObject=new String("Hello World");
console.log(oStringObject.slice(3)); //outpus "lo World"
console.log(oStringObject.substring(3)); //outpus "lo World"
console.log(oStringObject.slice(3,7)); //outpus "lo W"
console.log(oStringObject.substring(3,7)); //outpus "lo W"
console.log(oStringObject.slice(3,0)); //outpus (an empty string)
console.log(oStringObject.substring(3,0)); //outpus "Hel"
console.log(oStringObject.slice(-3)); //outpus "rld"
console.log(oStringObject.substring(-3)); //outpus "Hello World"
console.log(oStringObject.slice(3,-4)); //outpus "lo W"
console.log(oStringObject.substring(3,-4)); //outpus "Hel"

toLowerCase()、toLocaleLowerCase()、toUpperCase()、toLocaleUpperCase():前两个方法将字符串转换为全小写,后两个转换为全大写。toLowerCase()与toUpperCase()为标准方法,toLocaleLowerCase()与toLocaleUpperCase()则基于特定区域设置实现。示例:


代码如下:

 
var oStringObject=new String("Hello World");
console.log(oStringObject.toLowerCase()); //outpus "hello world"
console.log(oStringObject.toLocaleLowerCase()); //outpus "hello world"
console.log(oStringObject.toUpperCase()); //outpus "HELLO WORLD"
console.log(oStringObject.toLocaleUpperCase()); //outpus "HELLO WORLD"

  
5、instanceof运算符

使用instanceof运算符识别类型

使用typeof运算符检测引用类型存储值时存在局限:无论引用何种类型的对象,它始终返回"object"。为此,ECMAScript引入了instanceof运算符来解决此问题。


instanceful运算符与typeof类似,用于识别对象的具体类型。不同之处在于,instanceof要求开发者明确确认对象是否属于特定类型。示例:


代码如下:

 
var oStringObject=new String("hello world");
alert(oStringObject instanceof String); //outpus "true"
作者最新文章