为了便于操作基本类型值,ECMAScript 还提供了3 个特殊的引用类型:Boolean、Number 和String。这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据
例子:
var s1 = "some text";
var s2 = s1.substring(2);
console.log(s2); //"me text"
这个例子中变量s1包含了一个字符串,我们都知道字符串是基本类型的值,所以从逻辑上讲s1不应该有方法,但是例子中的第二行代码却调用了s1的substring()方法。这是因为在我们实现这种直观的操作,后台已经自动完成了一系列的处理。当第二行代码访问s1 时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串时,后台都会自动完成下列处理
1、创建String的一个实例
2、在实例上调用置顶的而方法
3、销毁实例
可以想象成以下代码:
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
经过此番处理,基本的字符串值就变得跟对象一样了。而且,上面这三个步骤也分别适用于Boolean和Number 类型对应的布尔值和数字值。
引用类型与基本包装类型的主要区别就是对象的生存期。使用new 操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。来看下面的例子:
var s1 = "some text";
s1.color = "red";
console.log(s1.color); //undefined
在此,第二行代码试图为字符串s1 添加一个color 属性。但是,当第三行代码再次访问s1 时,其color 属性不见了。问题的原因就是第二行创建的String 对象在执行第三行代码时已经被销毁了。
第三行代码又创建自己的String 对象,而该对象没有color 属性。
- 一般不建议显示的调用Boolean Number String 来创建基本包装类型的对象。因为这种做法很容易让人分不清自己是在处理基本类型还是引用类型的值。例子:
var s1 = new String("Tom");
console.log(s1); //String {0: "T", 1: "o", 2: "m", length: 3, [[PrimitiveValue]]: "Tom"}
console.log(typeof s1); //"object"
var s2 = "jerry";
console.log(s2); "jerry"
console.log(typeof s2); "string"
一、Boolean类型
Boolean 类型是与布尔值对应的引用类型。要创建Boolean 对象,可以像下面这样调用Boolean构造函数并传入true 或false 值
var booleanObject = new Boolean(true);
Boolean 对象在ECMAScript 中的用处不大
二、Number类型
toString()
toFixed() //会按照指定的小数位返回数值的字符串表示
toExponential() //该方法返回以指数表示法(也称e 表示法)表示的数值的字符串形式
toPrecision() //方法可能会返回固定大小(fixed)格式,也可能返回指数(exponential)格式;具体规则是看哪种格式最合适
不建议直接实例化Number 类型
三、String类型
属性
length
var str = "hello Tom";
console.log(str.length); //9
方法:
1、字符方法
两个用于访问字符串中特定字符的方法:
charAt()
参数是基于0的字符位置。以字符串的形式返回给定位置的那个字符
charCodeAt()
返回的是字符编码
str[2]
使用[]加数字索引访问字符串中的特定字符
var str = "hello Tom";
var str1 = str.charAt(2);
console.log(str1); //l
var str2 = str.charCodeAt(2);
console.log(str2); //108
var str3 = str[1];
console.log(str3); //e
2、字符串操作方法
- 拼接字符串
concat
var str1 = "Tom";
var str2 = str1.concat(" and Jerry","!");
console.log(str2); //"Tom and Jerry!"
console.log(str1); //"Tom"
+
通常情况下用加号操作符拼接。
ECMAScript 还提供了三个基于子字符串创建新字符串的方法:slice()、substr()和substring()。
slice() substring()
:接收两个参数。第一个参数是字符串开始的位置,第二个参数(可选)是子字符串最后一个字符后面的位置
substr()
接收两个参数。第一个参数是字符串开始的位置,第二个参数(可选)是返回字符串的字符长度
var str = "hello world";
console.log(str.slice(3)); //"lo world"
console.log(str.substring(3)); //"lo world"
console.log(str.substr(3)); //"lo world"
console.log(str.slice(3.7)); //"lo w"
console.log(str.substring(3,7)); //"lo w"
console.log(str.substr(3,7)); //"lo worl";
在传递给这些方法的参数是负值的情况下,它们的行为就不尽相同了。其中,slice()方法会将传入的负值与字符串的长度相加,substr()方法将负的第一个参数加上字符串的长度,而将负的第二个参数转换为0。最后,substring()方法会把所有负值参数都转换为0
console.log(str.slice(-3)); //-3+11= 8 "rld";
console.log(str.substring(-3)); //负值转换成0 "hello world"
console.log(str.substr(-3)); // "rld";
console.log(str.slice(3,-4)); // = slice(3,7) "lo w"
console.log(str.substring(3,-4)); // =substring(3,0) "hel" 如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。
console.log(str.substr(3,-4); // =substr(3,0); ""
3、字符串位置方法
indexOf(targetElement[, startIndex])
:从前往后搜索子字符串的位置
lastIndexOf(targetElement[, startIndex])
:从后往前搜索子字符串的位置
var str = "hello world";
console.log(str.indexOf("o")); //4
console.log(str.lastIndexOf("o")); //7
console.log(str.indexOf("o",6)); //7
console.log(str.lastIndexOf("o",6)); //4
//通过循环调用这两个方法来找到所有匹配的字符串
var str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit";
var positions = [];
var pos = str.indexOf("e"); //3
while(pos > -1){
positions.push(pos);
pos = str.indexOf("e", pos + 1);
}
console.log(positions); // [3, 24, 32, 35, 52]
4、字符串trim()方法
这个方法会创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果。
var str = " hello world ";
var trimmedStr = str.trim();
console.log(str); //" hello world "
console.log(trimmedStr); "hello world"
5、字符串大小写转换方法
toLowerCase()
toLocaleLowerCase()
toUpperCase()
toLocaleUpperCase()
6、字符串的模式匹配方法
match()
search() search()方法返回字符串中第一个匹配项的索引
这两个方法接收的参数都是一个字符串或者一个正则表达式
为了简化替换子字符串的操作,ECMAScript 提供了replace()方法。这个方法接受两个参数:第一个参数可以是一个RegExp 对象或者一个字符串(这个字符串不会被转换成正则表达式),第二个参数可以是一个字符串或者一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,唯一的办法就是提供一个正则表达式,而且要指定全局(g)标志
replace()
7、localCompare()方法
与操作字符串有关的最后一个方法是localeCompare(),这个方法比较两个字符串,并返回下列值中的一个:
• 如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(大多数情况下是-1,具体的值要视实现而定);
• 如果字符串等于字符串参数,则返回0;
• 如果字符串在字母表中应该排在字符串参数之后,则返回一个正数(大多数情况下是1,具体的值同样要视实现而定)。
8、 fromCharCode()方法
String 构造函数本身还有一个静态方法:fromCharCode()。这个方法的任务是接收一或多个字符编码,然后将它们转换成一个字符串。从本质上来看,这个方法与实例方法charCodeAt()执行的是相反的操作。
console.log(String.fromCharCode(104,101,108,108,111)); //"hello";
网友评论