常用的内建函数:
String()
Number()
Boolean()
Array()
Object()
Function()
RegExp()
Date()
Error()
Symbol()
构造函数创建出来的是封装了基本类型值的封装对象
var a = new String( "abc" );
typeof a; //"object"
a instanceof String; //true
Object.prototype.toString.call( a ); //"[object String]"
内部属性[[class]]
所有typeof返回值为"object"的对象都包含一个内部属性[[class]](我们可以把它看作一个内部的分类,而非传统的面向对象意义上的类)。这个属性无法直接访问,一般通过Object.prototype.toString(..)来查看
Object.prototype.toString.call("abc");
//"[object String]"
Object.prototype.toString.call( 42 );
//"[object Number]"
Object.prototype.toString.call( true );
//"[object Boolean]"
上例中基本类型被各自的封装对象自动包装,所以它们的内部[[class]] 属性值分别为 "String" ,"Number", "boolean".
封装对象包装
封装对象扮演着十分重要的角色,由于基本类型值没有 .length和 .toString()这样的属性和方法,需要通过封装对象才能访问,此时javascript会自动为基本类型值包装一个封装对象
如果想要自己封装基本类型值,可以使用Object(...)函数
var a = "abc";
var b = new String( a );
var c = Object( a );
typeof a; //"string"
typeof b; //"object"
typeof c; //"object"
b instanceof String;
c instanceof String;
Object.prototype.toString.call( b ); //"[object String]"
Object.prototype.toString.call( c ); //"[object String]"
拆封
如果想要得到封装对象中的基本类型值,可以使用valueOf()函数:
var a = new String( "abc" );
var b = new Number( 42 );
var c = new Boolean( true );
a.valueOf(); //"abc"
b.valueOf(); //42
c.valueOf(); //true
在必要的时候 javascript 会进行隐式拆封
Date(...)和Error(...)
Date()用来获得当前的时间
Error()主要是为了获得当前运行栈的上下文(大部分js引擎通过 只读属性.stack来访问)
栈上下文信息包括函数调用栈信息和产生错误的代码的行号,可以用来debug
Object(...) Function(....) RegExg(...)
这三个并不经常使用
Symbol(...)
不能使用new来构造,直接使用Symbol()构造
原生原型
原生构造函数有自己的 .prototype对象,如Array.prototype,String.prototype
这些对象包含其对应子类型所特有的行为特征
例如,将字符串值封装为字符串对象之后,就能访问String.prototype中定义的方法
根据文档约定,我们将String.prototype.XYZ简写为 String#XYZ
String#indexOf(..)
在字符串中找到子字符串的位置
String#charAt(..)
获得字符串指定位置上的字符
String#substr(...)
获得字符串的指定部分
String#substr(..),String#substring(..) ,String#slice(..)
将字符串转换为大写或者小写
String#toUpperCase() String#toLowerCase()
去掉字符串前后的空格,返回新的字符串
String#trim()
去掉字符串前后的空格,返回新的字符串
以上方法并不改变原字符串的值,而是返回一个新的字符串,借助原型代理,所有字符串都可以访问这些方法
将原型作为默认值
Function.prototype是一个空函数,RegExp.prototype是一个空的正则表达式,而Array.prototype是一个空数组。对于为赋值的变量来说,它们是很好的默认值
function isThisCool(vals,fn,rx){
vals = vals || Array.prototype;
fn = fn || Function.prototype;
rx = rx || RegExp.prototype;
return rx.test(
vals.map ( fn ).join( "" );
);
}//默认值
isThisCool();
isThisCool(["a","b","c"],function(v) { return v.toUpperCase(); }, /D/) 赋给定的值