sailei1 / blog

1 stars 0 forks source link

你不知道的JS -原生函数 笔记 #77

Closed sailei1 closed 4 years ago

sailei1 commented 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 是一个空数组。对未赋值的变量来说,它们是很好的默认值。