1、我们已知,在JavaScript中有7大原始类型:string , number , bigint , boolean , symbol , null , undefined 。

    在JavaScript中,原始类型的方法都是依靠构建临时对象,并给这个临时对象的一个属性作为一个有效方法并调用该方法。也可以说为了能让这些方法生效,我们创建了提供额外功能的“对象包装器”,使用后就被销毁。

    例如我们知道的字符串方法 str.toUpperCase() 返回一个大写化处理的字符串。例如下例用法:

    let str = ‘Hello’;

    alert( str.toUpperCase() ); //HELLO

    那么,toUpperCase() 中实际上是发生了什么呢?

    1.字符串 str 是一个原始值,我们在访问其属性时,会创建一个包含字符串字面量的特殊对象,并且具有有用的方法,例如 toUpperCase() 。

    2.该方法运行并返回一个新的字符串(由 alert 显示)。

    3.特殊对象被销毁,只留下原始值 str 。

    所以原始对象可以提供方法,但他们不属于对象,仍是轻量级的。

    现代JavaScript引擎已经非常智能化了,他甚至可以跳过额外创建对象,但是他人要遵循JavaScript规则,假装自己创建了这个对象。

    例如 String / Number / Boolean 构造器,仅供内部使用

    我们在JavaScript中仍可以使用这些函数,但是极为不推荐,因为用这几个构造函数创建出来的是一个对象,可能并非我们所想的。

    在严格模式下,我们无法对构建函数内部写入属性,所以我们想要访问基本数据类型的自定义属性时会报错,在非严格模式下,将会返回undefined。基本类型的方法都是已经写好并内置在构造函数中的。

    我们也要注意,null 和 undefined 是没有任何方法的,任何访问其属性的行为都会报错。