Javascript知识整理——原生函数

常见的原生函数有

  • 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中卷》

你可能感兴趣的:(Javascript知识整理——原生函数)