本文深入解析JavaScript中的基本包装类型Boolean、Number和String。阐述自动创建与销毁机制,对比引用类型的生存期差异,并详细讲解各类型的核心方法,包括Number的格式化输出、String的字符处理、模式匹配及大小写转换等实用技巧。
JavaScript基本包装类型概述
本文通过具体实例解析JavaScript中的基本包装类型,旨在帮助读者深入理解并应用于实际开发。
为了便于操作基本类型值,ECMAScript规范提供了三种特殊的引用类型:基本包装类型,即Boolean、Number和String。每当代码读取某个基本类型值时,后台会自动创建一个对应的基本包装类型对象,从而允许调用相关方法。
var str = "Hello world";
var substr = str.substring();
其内部处理逻辑等价于以下显式创建过程:
var str = new String("Hello world");//创建String类型的实例
var substr = str.substring();//在实例上调用substring()方法
str = null;//销毁实例
基本包装类型属于特殊的引用类型,它与普通引用类型存在显著区别,主要体现在以下两个方面:
首先是对象的生存期差异。
通过new操作符创建的引用类型实例,其生命周期会持续到当前作用域执行结束,一直驻留在内存中;而自动创建的基本包装类型对象仅在代码执行的瞬间存在,执行完毕后立即被销毁。这意味着开发者无法在运行时为基本包装类型的值动态添加自定义属性或方法。
var str1 = "Hello world";
var str2 = new String("Hello World");
str1.life = 20;
str2.life = 20;
alert(str1.life);//undefined
alert(str2.life);//20
其次是instanceof操作符的测试结果不同。
使用instanceof操作符检测基本包装类型的实例会返回true,而检测基本类型值则返回false。
var str1 = "Hello World";
var str2 = new String("Hello world");
alert(str1 instanceof String);//false
alert(str2 instanceof String);//true
虽然可以通过显式调用Boolean、Number或String构造函数来创建基本包装类型对象,但通常不建议这样做,因为这会导致代码难以区分当前操作的是基本类型值还是引用类型对象。
Object构造函数会根据传入值的类型,返回相应基本包装类型的实例。
var str = new String("Hello world");
alert(str instanceof String);//true
var num = new Number(16);
alert(num instanceof Number);//true
var bool = new Boolean(true);
alert(bool instanceof Boolean);//true
对这类基本包装类型的实例调用typeOf()方法,返回的结果始终是字符串"Object",尽管其实例变量内部保存的仍是基本类型值。
var str = new String("Hello world");
alert(typeof str);//object
var num = new Number(16);
alert(typeof num);//object
var boolean = new Boolean(true);
alert(typeof boolean);//object
使用new操作符调用基本包装类型的构造函数,与直接调用同名的转型函数(如String())是不同的。前者返回的是基本包装类型的实例,而后者返回的是对应的基本类型值。
var str = String("Hello world");
alert(typeof str);//string
var num = Number(16);
alert(typeof num);//number
var bool = Boolean(true);
alert(typeof bool);//boolean
值得注意的是,所有基本包装类型的对象在转换为布尔类型时,其值均为true,即使内部保存的是false、0或空字符串。
var boolean1 = new Boolean(false);
alert(boolean1);//false
alert(boolean1 && true);//true
var boolean2 = new Boolean(0);
alert(boolean2);//false
alert(boolean2 && true);//true
var boolean3 = new Boolean("");
alert(boolean3);//false
alert(boolean3 && true);//true
Boolean类型详解
1、Boolean类型
var boolean = new Boolean(true);
Boolean类型的实例重写了valueOf()方法,该方法返回对应的基本类型值true或false;同时重写了toString()方法,返回字符串形式的"true"或"false"。
Number类型格式化方法
2、Number类型
var num = new Number(16);
Number类型同样重写了继承自Object的valueOf()、toString()和toLocaleString()方法。其中,重写后的valueOf()方法返回对应的基本类型数值,而另外两个方法返回对应的字符串表示。此外,toString()方法支持接收一个表示基数的参数,用于指定输出的进制格式。
除了继承的方法外,Number类型还提供了专门用于将数值格式化为字符串的方法:
(1)toFixed()方法:接收一个表示小数位数的参数,返回包含指定小数位数的数值字符串表示。
(2)toExponential()方法:接收一个表示小数位数的参数,返回以指数表示法(科学计数法)表示的数值字符串形式。
(3)toPrecision()方法:接收一个表示数值所有有效数字位数(不包含指数部分)的参数,返回指定格式的有效数字字符串表示。
String类型核心方法解析
3、String类型
var str = new String("Hello world");
String类型继承了valueOf()、toString()和toLocaleString()方法,这些方法返回对象所表示的字符串值。
(1)String类型实例的属性。
length属性:用于表示字符串中包含的字符总个数。
(2)String类型实例的方法。
---字符方法
这些方法不会修改原始字符串的值,仅返回子字符串或字符编码,对原始字符串没有影响。
1)charAt()方法:接收一个基于0的字符位置参数,返回给定位置上的单个字符。
2)charCodeAt()方法:接收一个基于0的字符位置参数,返回给定位置上字符的字符编码(Unicode值)。
---字符串操作方法
1)concat()方法:接收任意多个字符串作为参数,返回拼接后的新字符串。
2)substr()、slice()和substring()方法:这三个方法均基于子字符串创建新字符串,接收一个或两个参数。第一个参数指定子字符串的起始位置;第二个参数可选,slice()和substring()的第二个参数指定子字符串的结束位置,而substr()的第二个参数指定子字符串的长度。当传入负数参数时,slice()方法会将负值与字符串长度相加后计算,substr()方法将第一个负值加上字符串长度,而第二个负值转换为0,substring()方法则将所有负值都转换为0后再进行计算。
---字符串位置方法
用于搜索给定的子字符串,返回其首次出现的位置,若未搜索到则返回-1。第一个参数指定要搜索的子字符串,第二个参数可选,用于指定搜索的起始位置。
1)indexOf()方法:从头开始向后搜索。
2)lastIndexOf()方法:从后开始向前搜索。
---trim()方法
该方法创建一个字符串的副本,删除前缀和后缀的空格,返回处理后的新字符串,原始字符串保持不变。
---字符串大小写转换方法
1)toLowerCase()方法:通用的转换为小写的方法。
2)toUpperCase()方法:通用的转换为大写的方法。
3)toLocaleLowerCase()方法:针对特定地区语言环境的小写转换方法。
4)toLocaleUpperCase()方法:针对特定地区语言环境的大写转换方法。
---字符串模式匹配方法
1)match()方法:在字符串上调用match()方法,其行为与在RegExp实例上调用exec()方法相同。接收一个参数——正则表达式或RegExp对象。返回一个数组,数组的第一项是与整个模式匹配的字符串,后续每一项分别对应各个子模式的匹配结果。
2)search()方法:从头开始向后查找匹配项。接收一个参数——正则表达式或RegExp对象。返回第一个匹配项的索引位置,若未找到匹配结果则返回-1。
3)replace()方法:用于替换字符串。接收两个参数——第一个参数可以是正则表达式、RegExp对象或普通字符串(普通字符串不会被转换为正则表达式);第二个参数可以是字符串或函数。若第一个参数是字符串,则仅替换第一个匹配的子字符串;若想替换所有匹配项,需使用带有g标志的RegExp对象。
a、当第二个参数为字符串时,可以使用特殊的字符序列,将正则表达式操作得到的值插入到结果字符串中。
| 特殊的字符序列 | 替换文本 |
|---|---|
| $$ | $ |
| $& | 匹配整个模式的子字符串 |
| $' | 匹配的子字符串之前的子字符串 |
| $` | 匹配的子字符串之后的子字符串 |
| $n | 匹配第n个子模式的子字符串,n等于0-9.若正则表达式中没有定义子模式,则使用空字符串 |
| $nn | 匹配第nn个子模式的子字符串,nn等于01-99.若正则表达式中没有定义子模式,则使用空字符串 |
var str = "cat, fat, eat";
var result = str.replace(/(.at)/g, "my($1)");
alert(result);//my(cat), my(fat), my(eat)
b、当第二个参数为函数时,可以实现更为精细和复杂的替换逻辑。
在只有一个匹配项(即与模式匹配的字符串)时,向函数传递3个参数——模式的匹配性、模式匹配项在字符串中的位置和原始字符串。在正则表达式中定义了多个子模式的情况下,向函数传递的参数依次是模式的匹配项、第一个子模式的匹配项、第二个子模式的匹配项、......、模式匹配项在字符串中的位置和原始字符串。函数返回替换后的文本。
var str = "<a href = \"test.jsp\">link</a>";
var result = str.replace(/[<>"&]/g, function(match, positon, originalStr) {
switch(match) {
case "<":
return "<";
case ">":
return ">";
case "&":
return "&";
case "\"":
return """;
}
});
alert(result);//<a href = "test.jsp">link</a>
4)split()方法:接收第一个参数为分隔符(字符串或RegExp对象,字符串不会被转换为正则表达式),第二个参数可选,用于指定返回的字符串数组的大小限制。该方法返回分割后的字符串数组。
var strs1 = str.split("|", 2);//["cat","fat","eat"]
var str = "cat|fat|eat";
var strs1 = str.split("|");
alert(strs1);//cat,fat,eat
var strs2 = str.split("|", 2);
alert(strs2);//cat,fat
var strs3 = str.split(/[^\|]+/);
alert(strs3);//,|,|,
例如,strs3的分隔符为“cat”、"fat"、“eat”,因此返回的数组第一项和最后一项为空字符串。
---localeCompare()方法:
用于比较两个字符串。若字符串在字母表中应该排列在字符串参数之前,返回一个负数(大多数情况是-1);若在之后,返回一个正数(大多数情况是1);若相等,返回0。
alert("world".localeCompare("hello"));//1
---fromCharCode()方法:
这是String类的静态方法,接收一个或多个字符编码,将其转换为对应的字符串。该操作与charCodeAt()方法的功能相反。
alert(String.fromCharCode(104, 101, 108, 108, 111));//"hello"
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript常用函数技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript页面元素操作技巧总结》及《JavaScript操作DOM技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。