常见的原生函数有
- String()
- Number()
- Boolean()
- Array()
- Object()
- Function()
- RegExp()
- Date()
- Error()
- Symbol() ————Es6引入
通过构造函数(如new String('abc')创建出来的是封装了基本类型值(‘abc’)的封装对象
内部属性[[Class]]
所有typeof返回值为'object'的对象都包含一个内部属性[[Class]],通过Object.prototype.toString()来查看
Object.prototype.toString().call([1,2,3]) //[object Array]
Object.prototype.toString().call(/regex-literal/i); // [object RegExp]
大多数情况下,对象的内部[[Class]]属性和创建该对象的内建原生构造函数相对应。
基本类型值如null和undefined的[[Class]]
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(undefined) //"[object undefined]"
其他基本类型值(字符串、数字和布尔)的[[Class]]指向其包装对象的[[Class]]
Object.prototype.toString.call('abc')//[object String]
Object.prototype.toString.call('42') //[object Number]
Object.prototype.toString.call(true) //[object Boolean]
封装对象的注意点
创建的封装对象为真值
var a = new Boolean(false)
if(!a){console.log('Oops');//执行不到这里
拆封
若要得到封装对象中的基本类型值,可以使用valueOf()函数
var a = new String('abc')
a.valueOf() //"abc"
原生函数作为构造函数
Array构造函数只带一个数字参数的时候,该参数会被作为数组的预设长度
只要将length属性设置为超过实际单元数的值,就能隐式地制造出空单元(稀疏数组)
除非万不得已,否则不要使用Object(..)/Function(..)/RegExp(..)
构造函数Function只有在极少数情况下很有用,比如动态定义函数参数和函数体的时候
两列建议使用常量形式(如/^a*b+/g)来定义正则表达式,不仅语法简单,执行效率也更高
Date(..) 和 Error(..)
这两个原生构造函数作用比其他的大很多,因为没有对应的常量形式可以代替
- Date(..)主要用来获得当前的Unix时间戳
- Error(..)创建错误对象主要是为了获得当前运行栈的上下文,上下文信息包括函数调用栈信息和产生错误的代码行号,以便于debug,常与throw一起使用 throw new Error('x wasn't provided');
Symbol(..)
Symbol()比较特殊,如果带new运算符的话会报错
原生原型
String.prototype的方法
- String#indexOf(..)
在字符串中找到指定字符串的位置 - String#CharAt(..)
获得字符串指定位置上的字符 - String#substr(..)、String#substring(..)和String#slice(..)
获得字符串的指定部分 - String#toUpperCase()和String#toLowerCase()
将字符串转换为大写或小写 - String#trim()
去掉字符串前后的空格,返回新的字符串
以上方法均不改变原字符串的值,而是返回一个新字符串
某些原生原型并非普通对象那么简单
Function.prototype是一个函数,RegExp.prototype是一个正则表达式,而Array.prototype是一个数组,三者都是空的,是很好的默认值
本文参考《你不知道的JS中卷》
网友评论