JavaScript内建函数(原生函数):
String()
Number()
Boolean()
Array()
Object()
Function()
RegExp()
Date()
Error()
Symbol()
原生函数可以被当作构造函数来使用。new String('abc')创建的是字符串"abc"的封装对象,而不是基本类型值"abc";
var a = new String('abc');
typeof a ; //"object"
a instanceof String; //true
Object.prototype.toString.call(a); //"[object,String]"
所有typeof返回值是"object"的对象都包含内部属性[[Class]](内部的一个分类,就是针对对象的一个分类,用来区分具体是哪个子对象),该属性的访问一般通过Object.prototype.toString(...)来访问。
Object.prototype.toString.call([1,2,3]) //"[object Array]"
Object.prototype.toString.call( null ); //"[object Null]"
Object.prototype.toString.call( undefined ); //"[object Undefined]"
虽然没有Null()和Undefined()这样的原生函数存在,但是对象内部属性[[Class]]属性值仍然是可以作区分。
针对基本类型的检测:
Object.prototype.toString.call( "abc" ); //"[object String]"
Object.prototype.toString.call( 42 ); //"[object Number]"
Object.prototype.toString.call( true ); //"[object Boolean]"
是不是有点奇怪?不是说只针对object对象进行区分检测的么?怎么也能检测基本类型?这里是因为基本类型值被各自的封装对象自动包装,所以他们内部[[Class]]也有属性值。
像.length,.toString方法,需要通过封装对象才能访问,此时JavaScript自动为基本类型值包装一个封装对象。
var a = "abc";
a.length; // 3
a.toUpperCase(); // "ABC"
一般情况是,JavaScript引擎自己决定什么时候应该使用封装对象,优先考虑使用基本类型值。
var a = new Boolean( false );
typeof a //"object"
if (!a) {
console.log( "Oops" ); // 执行不到这里
}
a.valueOf(); //false
var b = new String('abc');
var c = b+""; //c的值为“abc”
可以通过valueOf()进行封装对象的拆封(获取封装对象中的基本类型值),或者隐式转换,如上。
Object(...),Function(...),RegExp(...)尽量不要使用。
实际中没有必要使用new Object()来创建对象的,使用字面量形式更方便。
Date()和Error()
Symbol()
symbol符号是具有唯一性的特殊值,是基本类型数据的一种。Symbol()原生构造函数在自定义符号时,特殊性在于不能像Object(),Function()等使用new关键字,否则会报错!
ar ss = Symbol('my symbol');
console.log(ss); //Symbol(my symbol)
typeof ss; //"symbol"
ss.toString(); //"Symbol(my symbol)"
var obj = {};
obj[ss] = "miya";
Object.getOwnPropertySymbols(obj); //[Symbol(my symbol)]
symbol符号可以作为对象的key,来存储数据。
原生构造函数的原型
比如:Array.prototype,String.prototype等。
String的prototype上面有indexOf(),charAt(),substr(),substring(),slice(),trime()等方法。
Number的prototype上有tofixed()等方法。
Array的prototype上有concat()等方法。
Function.prototype上有apply,call,bind等方法。
END:JavaScript引擎会自动对基本类型值进行封装(用封装对象来包装)来实现基本类型对属性和方法的访问。