本系列内容由ZouStrong整理收录
整理自《JavaScript权威指南(第六版)》,《JavaScript高级程序设计(第三版)》
ECMAScript提供了3个特殊的引用类型:Boolean类型、Number类型 和String类型
我们确切的知道: 基本类型值不是对象,因而从逻辑上讲它们不应该有属性和方法,但是我们却可以——使用length属性查看字符串长度、使用各种方法操作字符串……..why?
实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的实例(包装对象),从而让我们能够调用一些方法来操作这些数据
var s1 = "text";
var s2 = s1.substring(2);
当第二行代码访问s1时,后台都会自动完成下列处理。
var s1 = new String("text"); // 创建String类型的一个实例(传入字符串参数);
var s2 = s1.substring(2); // 在实例上调用指定的方法;
s1 = null; // 销毁这个实例
上面这三个步骤是在操作字符串属性、方法的一瞬间完成的(三个步骤也分别适用于Boolean类型和Number类型)
引用类型与基本包装类型的主要区别就是对象的生存期;引用类型的实例,在当前作用域销毁之前一直保存在内存中;而自动创建的基本包装类型的实例,则只存在于一行代码的执行瞬间,然后立即被销毁。这就是我们为什么可以访问字符串或者数字,布尔值的属性,但是为他们添加属性和方法无效的原因所在(修改只是发生在临时对象身上,这个对象并没有保留下来)
var s1 = "text";
s1.color = "red"; //创建对象,添加属性,销毁对象
alert(s1.color); //创建了一个新对象,没有color属性,返回undefined
当然,可以显式地调用Boolean、Number和String构造函数来创建基本包装类型的对象。这样其生命周期就跟引用类型一样了,并且typeof会返回"object"
var s1 = new String("test");
var b1 = new Boolean(true);
var n1 = new Number(100); //变量中保存的都是相应包装类型的实例
new可省略,不过省略了之后就相当于转型函数了,即将任意值转变成对应的基本类型值
var s1 = String("test");
var b1 = Boolean(true);
var n1 = Number(100); //变量中保存的都是经过转换的基本类型值
几乎没有必要显示创建基本包装类型的实例,因为这种做法很容易让人分不清自己是在处理基本类型还是引用类型的值,我们只需要知道在基本类型值上调用属性和方法时发生了什么就好了
Object构造函数也会根据传入值的类型返回相应基本包装类型的实例
var obj1= new Object("some text");
var obj2= new Object(true);
var obj3= new Object(30);
obj1 instanceof String; //true
obj2 instanceof Boolean; //true
obj3 instanceof Number; //true
Boolean对象是与布尔值对应的对象。要创建Boolean对象,可以调用Boolean构造函数并传入true或false值
var booleanObject = new Boolean(true);
Boolean类型的实例重写了valueOf()方法,返回基本类型值true或false;重写了toString()方法,返回字符串"true"和"false",Boolean对象在ECMAScript中的用处不大,因为它经常会造成误解
var falseObject = new Boolean(false);
if ( falseObject ){
//执行
}
建议是永远不要使用Boolean对象
Number对象是与数字值对应的对象。要创建Number对象,可以调用Number构造函数并传入数值
var numberObject = new Number(100);
Number类型也重写了继承的方法。重写后的valueOf()方法返回对象表示的基本类型的数值,另外两个方法则返回字符串形式的数值
除了继承的方法之外,Number类型还提供了一些用于将数值格式化为字符串的方法
该方法会按照指定的小数位返回数值的字符串表示
var num = 10;
alert(num.toFixed(2)); //"10.00"
如果数值本身包含的小数位比指定的还多,那么接近指定的最大小数位的值就会四舍五入
var num = 10.005;
alert(num.toFixed(2)); //"10.01"
该方法返回数值的指数表示法的字符串形式(也称e表示法)
也接收一个参数,而且该参数同样也是指定输出结果中的小数位数
var num = 10;
alert(num.toExponential(1)); //"1.0e+1"
对于一个数值来说,toPrecision()方法可能会返回固定大小(fixed)格式,也可能返回指数(exponential)格式;具体规则是看哪种格式最合适。这个方法接收一个参数,即表示数值的所有数字的位数(不包括指数部分)
var num = 99;
alert(num.toPrecision(1)); //"1e+2"
alert(num.toPrecision(2)); //"99"
alert(num.toPrecision(3)); //"99.0"
实际上,toPrecision()会根据要处理的数值决定到底是调用toFixed()还是调用toExponential()。而这三个方法都可以通过向上或向下舍入,做到以最准确的形式来表示带有正确小数位的值。
不建议直接实例化Number类型,而原因与显式创建Boolean 对象一样
String类型是与字符串对应的引用类型。要创建String对象,可以调用String构造函数并传入字符串
var stringObject = new String("hello");
String类型继承的valueOf()、toLocaleString()和toString()方法,都返回对象所表示的基本字符串值
返回字符串中包含的字符数
基本类型值是不可变的,所有方法都是发生在临时生成的包装对象上
接收一个数字参数(基于0的字符位置),返回指定位置的字符(后者返回字符编码)
var stringValue = "hello world";
stringValue.charAt(1); //"e"
stringValue.charCodeAt(1); // 101
如果传入这两个方法的位置超出了范围,则前者返回空字符串””, 后者返回NaN
此外,ECMAScript5规定可以使用[]语法访问指定位置的字符(IE7以下不支持)
var stringValue = "hello world";
stringValue[1]; // "e"
接收一个字符串参数,返回指定子串的位置(没有的话返回-1)
可选的第二个参数表示,搜索开始的位置(包含该位置)
两个方法的区别在于:indexOf()方法从字符串的开头(或搜索位置)向后搜索子字符串,而lastIndexOf()方法是从字符串的末尾(或搜索位置)向前搜索子字符串
var stringValue = "hello world";
alert(stringValue.indexOf("o")); //4
alert(stringValue.lastIndexOf("o")); //7
alert(stringValue.indexOf("o", 6)); //7
alert(stringValue.lastIndexOf("o", 6)); //4
接收一到多个字符串参数,返回拼接得到的新字符串
var string= "hello";
var newString =string.concat("zsz","12"); //"hellozsz12"
虽然concat()是拼接字符串的官方用法,但是 + 操作符使用起来却更简单
都接收一或两个数字参数,都返回被操作字符串的一个子串
第一个参数表示子串的开始位置
其中slice()和substring()的第二个参数,表示结束位置(不包括)
substr()的第二个参数,表示返回的字符的个数
不指定第二个参数,则到结尾为止
var stringValue = "hello world";
alert(stringValue.slice(3)); //"lo world"
alert(stringValue.substring(3)); //"lo world"
alert(stringValue.substr(3)); //"lo world"
alert(stringValue.slice(3, 7)); //"lo w"
alert(stringValue.substring(3,7)); //"lo w"
alert(stringValue.substr(3, 7)); //"lo worl"
在传递给这些方法的参数是负值的情况下,它们的行为不尽相同
返回删除了首尾空格的新字符串
var stringValue = " hello world ";
stringValue.trim(); //"hello world"
返回字符串的大/小写形式
这个方法比较两个字符串,并返回下列值中的一个:
如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(大多数情况下是-1);
如果字符串等于字符串参数,则返回0;
如果字符串在字母表中应该排在字符串参数之后,则返回一个正数(大多数情况下是)
详见正则表达式部分