[JS高程]|[JS高程] 特殊的原始值类型
目录
- 原始值包装类型 (特殊引用类型)
- 原始值包装类型和应用类型的区别
原始值包装类型 (特殊引用类型) 在ES6 时,ECMAScript 数据类型是这样去分类的:
- 原始值(基本数据类型)
- Number
- String
- Boolean
- Undefined
- Null
- Symbol
- 引用值(复杂数据类型)
- 【[JS高程]|[JS高程] 特殊的原始值类型】Object
函数也是一种引用类型
- 【[JS高程]|[JS高程] 特殊的原始值类型】Object
indexOf()
,lastIndexOf()
search()
slice()
,substring()
,substr()
replace()
toUpperCase()
,toLowerCase()
concat()
trim()
- 等等...
toExponential()
toFixed()
toPrecision()
- 等等...
toString()
valueOf()
实际上,ECMAScript 为了方便的操作原始值,提供了3中 特殊的引用类型 :
- Boolean
- Number
- String
let s1 = "some text";
let s2 = s1.substring(2);
这里,第二行在访问
s1
的时候,是以读模式访问的。 也就是要从内存中读取变量保存的值, 以读模式访问字符串值的任何时候,后台都会执行以下3个步骤:- 创建一个String类型的实例;
- 调用实例上的特定方法;
- 销毁实例。
let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;
布尔值和数值也是一样的, 以上3步也会在后台发生,不过使用的是Boolean 和 Number 包装类型而已 。
这三种特殊的引用类型,也叫做原始值包装类型。
原始值包装类型和应用类型的区别
引用类型与原始包装类型的主要区别在于对象的生命周期。 在通过
new
实例化引用类型后。 得到的实例会在离开作用域时被销毁,而自创建的原始值包装对象则只存在于访问它的那行代码执行期间。 这也为之不能在运行时给原始值添加属性和方法。let s1 = "some text";
s1.color = "red";
// 创建临时String 对象,并在执行完该行后立即被销毁。
console.log(s1.color);
// undefined
不过如果真的期望达到给一个原始值添加属性。 可以显式的去调用new Boolean()
、new Number()
、new String()
这些构造函数以创建原始值包装对象。
有几点值得注意:
- 不推荐使用, 因为会让开发者容易疑惑。
- 在原始值包装类型的实例上使用
typeof
会返回 "object"
let objNumb = new Number(100); let objStr = new String("some text"); let objBool = new Boolean(true); typeof objNumb; //'object' typeof objStr; //'object' typeof objBool; //'object'
- 通过原始值包装类型构造函数显式的实例化对象 都是 对应原始值包装类型的实例
objNumb instanceof Number; // true objStr instanceof String; // true objBool instanceof Boolean; // true
- 通过工厂方法
Object
构造函数,也能够根据传入值的类型返回相应原始值包装类型的实例
let Ostr = new Object("some text"); let Onum = new Object(100); let Obool = new Object(false); Ostr instanceof String; // true Onum instanceof Number; // true Obool instanceof Boolean; // true
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量