定义
- 原始值
- primitive value,就是最简单的数据
- Undefined,Null,Boolean,Number,String,Symbol都是原始值
- 保存原始值的变量是按值访问的,因为我们操作的是存储在变量中的实际值
- 引用值
- reference value,由多个值构成的对象
- JS不能直接访问内存位置,所以不能直接操作对象所在的内存空间
- 在操作对象的时候,实际上操作的是对该对象的引用,所以保存引用值的变量是按引用访问的
- 在把一个值赋给变量的时候,JS的引擎必须确定这个值是原始值还是引用值
动态属性
-
对于引用值,在变量保存了某个值之后,可以随时添加,修改,删除其属性和方法
let person = new Object(); person.name = "小明"; console.log(person); // {name: '小明'}
原始值不能有属性,但是给原始值添加属性不会报错,会返回undefined
-
原始类型的初始化可以只使用原始字面量形式,如果使用了new关键字,那么JS会创建一个Object类型的实例
let name1 = "小明"; let name2 = new String("小刚"); name1.age = 18; name2.age = 19; console.log(name1.age); // undefined console.log(name2.age); // 19 console.log(typeof name1); // string console.log(typeof name2); // object
复制值
-
在通过变量把一个原始值赋值到另一个变量的时候,原始值会被复制到新变量的位置
let n1 = 5; let n2 = n1;
- 此时,n2会得到数值5,这个数字和存储在n1中的5是互相独立的,互不干扰
-
在把引用值从一个变量赋给另一个变量的时候
存储在变量中的值也会被复制到新变量所在的位置,但是这里复制的值实际上是一个指针,它指向了存储在堆内存中的对象
-
复制完成之后,两个变量实际上指向同一个对象,所以一个对象上的变化会在另一个对象上反映出来
let obj1 = new Object(); obj1.name = "小明"; let obj2 = obj1; console.log(obj2.name); // 小明
确定类型
typeof对引用值的用处不大,当需要知道一个值是什么类型的时候,可以还有instanceof操作符
-
语法格式:result = variable instanceof constructor
- 如果变量是给定的引用类型的实例,就返回true
-
例子
let person = new Object(); person.name = "小明"; console.log(person instanceof Object); // 返回true console.log(person instanceof Array); // 返回false
所有引用值都是Object的实例,所以使用instanceof检测任何引用值和Object构造函数都会返回true
如果用instanceof检测原始值,那么会返回false,因为原始值不是对象