Closed sailei1 closed 4 years ago
var a = new String( "abc" ); typeof a; // 是"object",不是"String" a instanceof String; // true Object.prototype.toString.call( a ); // "[object String]" //new String("abc")创建的是字符串"abc"的封装对象,而非基本类型值"abc"。 //一般情况下,我们不需要直接使用封装对象。最好的办法是让 JavaScript 引擎自己决定什 么时候应该使用封装对象
封装对象包装
var a = "abc"; a.length; // 3 a.toUpperCase(); // "ABC" //由于基本类型值没有 .length 和 .toString() 这样的属性和方法,需要通过封装对象才能访问,此时 JavaScript 会自动为 基本类型值包装(box 或者 wrap)一个封装对象
拆封 如果想要得到封装对象中的基本类型值,可以使用 valueOf() 函数。 在需要用到封装对象中的基本类型值的地方会发生隐式拆封
var a = new String( "abc" ); a.valueOf(); // "abc" var b = a + ""; // b的值为"abc" typeof a; // "object" typeof b; // "string
原生函数作为构造函数 数组(array)、对象(object)、函数(function)和正则表达式,我们通常喜欢以常 量的形式来创建它们。实际上,使用常量和使用构造函数的效果是一样的(创建的值都是 通过封装对象来包装)。
永远不要创建和使用空单元数组
尽量不要使用 Object(..)/Function(..)/RegExp(..)
Date(..) 和 Error(..) 的用处要大很多,因为没有对应的常量 形式来作为它们的替代。
原生原型 原生构造函数有自己的 .prototype 对象,如 Array.prototype、String.prototype 等。 这些对象包含其对应子类型所特有的行为特征。
将原型作为默认值 Function.prototype 是一个空函数,RegExp.prototype 是一个“空”的正则表达式(无 任何匹配),而 Array.prototype 是一个空数组。对未赋值的变量来说,它们是很好的默认值。
封装对象包装
拆封 如果想要得到封装对象中的基本类型值,可以使用 valueOf() 函数。 在需要用到封装对象中的基本类型值的地方会发生隐式拆封
原生函数作为构造函数 数组(array)、对象(object)、函数(function)和正则表达式,我们通常喜欢以常 量的形式来创建它们。实际上,使用常量和使用构造函数的效果是一样的(创建的值都是 通过封装对象来包装)。
永远不要创建和使用空单元数组
尽量不要使用 Object(..)/Function(..)/RegExp(..)
Date(..) 和 Error(..) 的用处要大很多,因为没有对应的常量 形式来作为它们的替代。
原生原型 原生构造函数有自己的 .prototype 对象,如 Array.prototype、String.prototype 等。 这些对象包含其对应子类型所特有的行为特征。
将原型作为默认值 Function.prototype 是一个空函数,RegExp.prototype 是一个“空”的正则表达式(无 任何匹配),而 Array.prototype 是一个空数组。对未赋值的变量来说,它们是很好的默认值。