**
原始值与引用值
**
原始值
》原始值表示单一的数据。
》ES中的原始值类型(6种):Undefined、Null、Boolean、Number、String、Symbol。
》表示原始值的变量是按值访问,在操作变量时,改变的是存储在变量内存中的实际值。
》原始值不可以拥有属性也不可以被改变。
引用值
》引用值是表示由多个值(原始值或其他引用值)构成的对象。
》ES中不允许直接访问对象的内存。实际操作对象时,其实访问的是保存对象内存的地址。(即,该对象的引用)
动态属性
》原始值是不可以改变的。
例如:let i = 0;其中,0这个值是不能被改变的,宏观上对0的改变,其实是对0的替换。
》引用值(对象)可以随时添加、修改和删除其属性和方法。
》原始值不可以拥有属性。如果在JS中,如果写成了对原始值属性进行操作,实际上是JS创建了一个对象,在对原始值进行属性操作的语句执行之后,该对象就被销毁。
例如:
此代码的输出结果为undefined。
因为在执行到第2条语句,也就是one.age = 20时,JS创建了一个对象来满足one.age的操作需求,而在这条语句执行结束之后,此处创建的对象就被销毁。
第3条语句对one.age进行输出时,此时并不存在one这个对象,因而是undefined。
值传递
》值传递即是赋值,是将值传递给变量的过程。
原始值与引用值值传递的区别
》本质上没有区别,都是僵变量中保存的信息复制给另一个变量。但是当传递的是一个对象是,对对象进行复制的时候,会修改到原对象的值。
原始值值传递
引用值的值传递
类型确定
typeof
typeof对于所引用的内容的类型的判断是不准确的。对于几乎所有的引用的值的类型,得到的结果都是object。
instanceof
对于引用值,通常采用 instanceof操作符判断引用值是否为某个构造函数的实例。
》instanceof不是方法,不可以通过“ . ”进行调用。
》instanceof的返回值为true或者false。
基本包装类型
原始包装类型
ES提供了3种特殊的引用类型:Boolean、Number、String。
》每当用到某个原始值的方法或属性时,后台会创建一个相应的原始包装类型的对象,从而暴露出操作原始值的各种方法。
后台执行步骤:
(1)创建一个包含了原始值的String类型的实例;
(2)调用实例上的特定方法;
(3)销毁该实例;
例如:
另如:
Number在js中如果只作为函数使用,则会进行强制类型转换。