1.内置对象及内置函数
1.1.基本包装类型
在 ES 中,数据的分类分为基本数据类型和引用类型。
而基本包装类型,严格来说不属于上面两个中的任意一个,但是又和这两种类型息息相关。
基本数据类型和引用类型这两个类型其中一个很明显的区别是,引用类型有自己内置的方法,也可以自定义其
他方法用来操作数据,而基本数据类型不能像引用类型那样有自己的内置方法对数据进行更多的操作。
但基本数据类型真的没有吗?
对于部分基本类型来说确实是这样的。
按照最新 ES 标准定义,基本数据类型(primitive value)包括 Undefined, Null, Boolean, Number, Symbol, String。
为了便于操作基本类型值,ECMAScript提供了3个特殊引用类型(基本包装类型):Boolean, Number, String。
基本包装类型,和其他引用类型一样,拥有内置的方法可以对数据进行额外操作。
每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型对象,从而可以调用一些方法操作这些数据。
比如:
var str = 'test';
//substring(start,end),截取从start到end的字符串,不包括end。
var str2 = str.substring(2);
console.log(str2);
上面 str 变量存储的值是一个字符串,'test' 字符串是基本数据类型 String 类型的值。然而它调用了substring
方法,并将结果保存在了str2中。
为什么它不是对象却能调用对象的方法呢?
在执行第二行代码时,JS会自动进行下面的步骤:
1.自动创建 String 类型的一个实例(和基本类型的值不同,这个实例就是一个基本包装类型的对象)
2.调用实例(对象)上指定的方法
3.销毁这个实例
//用 String 构造函数创建一个实例,这个实例是一个对象
var str = new String('test')
//对象中有内置方法供开发人员调用
var str2 = str.substring()
// 销毁这个实例
str = null
//虽然基本类型的值没有方法可以调用,但是后台临时创建的构造函数实例(也就是对象)上有内置方法可以让我们对值进行操作,因此这样我们就可以对字符串、数值、布尔值这三种基本数据类型的数据进行更多操作,这也是基本包装类型的主要用处:便于操作基本类型值。
经过上面的加工后,基本字符串变的跟对象一样,上面这三个步骤也适用于Boolean、Number
类型。
JS什么时候会自动创建一个对应的基本包装类型对象呢?
取决于当前执行的代码是否是为了获取他的值。每当读取一个基本类型的值,也就是当我们需要从内存中获取
到它的值时(这个访问过程称为读取模式),这时,后台就会自动创建一个基本包装类型的对象。
var str = 'test';
str.test = 'hhh';
console.log(str.test); //undefined
上面第二行代码给自动创建的 String 实例对象添加了 test 属性,虽然此刻代码执行时他是生效的,但是在这行代码执行完毕后该 String 实例就会立刻被销毁,String 实例的 test 属性也就不存在了。 当执行第三行代码时,由于是读取模式,又重新创建了新的 String 实例,而这个新创建的 String 实例没有 test 属性,结果也就是 undefined。
怎么才能给基本类型添加方法或者属性呢?
-
增加对应的包装对象的原型方法
//给字符串添加属性或方法 要写到对应的包装对象的原型下才行 var str = 'hello'; String.prototype.last = function(){ // 返回指定位置的字符 return this.charAt(this.length - 1); }; console.log(str.last()); // o 执行到这一句,JS会偷偷做一些事情 // 相当于 // 1.找到基本包装对象,new一个和字符串值相同的对象, // var str = new String('hello'); // 2.通过这个对象找到了包装对象下的方法并调用 // str.last(); // 3.这个对象被销毁 // str = null;
-
使用new运算符创建String对象
// new运算符 var str = new String('hello'); // 有效属性 str.name = 'HI'; // 有效方法 str.age = function () { return 100; } console.log(str); //[String: 'hello'] { name: 'HI', age: [Function] } console.log(typeof str); //object console.log(typeof str.valueOf()); // 重写valueOf()方法ÿ