JavaScript原生函数浅谈

该文章阅读需要8分钟,更多文章请点击本人博客halu886


1.原生函数基本概念

1.1原生函数是什么

JavaScript为基本数据类型提供了封装对象,被称为原生函数(native function),同时也叫内建函数(built-in function)

常用的原生函数有:

  • Number()
  • String()
  • Boolean()
  • Array()
  • Object()
  • Function()
  • RegExp()
  • Date()
  • Error()
  • Symbol()//ES6新加入!

1.2作用是什么

为基本数据类型提供该子类所特有的方法和属性

比如说:String#trim(),Array#Array#concat()  

1.3补充

原生函数同时也能当做构造函数使用

let a = new String("abc");

a instanceof String;//true

通过构造函数创建了一个封装了基本数据类型的封装对象

2.[[class]]

let a = new String("abc");
typeof a;//"object" 

所有typeof返回的”object”的对象都有一个[[class]]属性

Object.prototype.toString.call(new String("abc"));//"[object String]"
Object.prototype.toString.call(new Number(1346));//"[object Number]"
Object.prototype.toString.call(null);//"[object Null]"
Object.prototype.toString.call(undefined);//"[object Undefined]"
//返回一个字符串类型的基本类型数据,格式为[object Xxxxx]

虽然不存在Null()和Undefined()原生函数,但是[[Class]]内部属性仍为这个

3.封装对象包装

当基本数据类型需要调用原生对象的方法和属性时,JavaScript会自动进行对象封装(object wrapper)

疑问:既然如此为什么不直接在变量声明时,直接定义为封装对象?

思考:

  1. JavaScript对基本数据类型的常见情况做了性能优化,直接使用封装对象来进行”提前优化“反而会降低执行效率
  2. 篡改数据类型,提升风险

    let a = false;
    !!false;//false
    let b = new Boolean(false);
    !!b;//true  
    
    //显性类型转换!!Object===>true  
    

4.拆封

当需要用到封装对象的基本类型值时,就需要用到valueOf()

var a = new String("sadflk");
var b = new Number(123);
var c = new Boolean(true);

a.valueOf()//"sadflf"
b.valueOf()//123
c.valueOf()//true

在需要用到基本类型值的时候会发生隐形拆封

坚持原创技术分享,您的支持是我前进的动力!