定義
- 原始值
- primitive value,就是最簡(jiǎn)單的數(shù)據(jù)
- Undefined,Null,Boolean,Number,String,Symbol都是原始值
- 保存原始值的變量是按值訪問的,因?yàn)槲覀儾僮鞯氖谴鎯?chǔ)在變量中的實(shí)際值
- 引用值
- reference value,由多個(gè)值構(gòu)成的對(duì)象
- JS不能直接訪問內(nèi)存位置,所以不能直接操作對(duì)象所在的內(nèi)存空間
- 在操作對(duì)象的時(shí)候,實(shí)際上操作的是對(duì)該對(duì)象的引用,所以保存引用值的變量是按引用訪問的
- 在把一個(gè)值賦給變量的時(shí)候,JS的引擎必須確定這個(gè)值是原始值還是引用值
動(dòng)態(tài)屬性
-
對(duì)于引用值,在變量保存了某個(gè)值之后,可以隨時(shí)添加,修改,刪除其屬性和方法
let person = new Object(); person.name = "小明"; console.log(person); // {name: '小明'} 原始值不能有屬性,但是給原始值添加屬性不會(huì)報(bào)錯(cuò),會(huì)返回undefined
-
原始類型的初始化可以只使用原始字面量形式,如果使用了new關(guān)鍵字,那么JS會(huì)創(chuàng)建一個(gè)Object類型的實(shí)例
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
復(fù)制值
-
在通過變量把一個(gè)原始值賦值到另一個(gè)變量的時(shí)候,原始值會(huì)被復(fù)制到新變量的位置
let n1 = 5; let n2 = n1;- 此時(shí),n2會(huì)得到數(shù)值5,這個(gè)數(shù)字和存儲(chǔ)在n1中的5是互相獨(dú)立的,互不干擾
-
在把引用值從一個(gè)變量賦給另一個(gè)變量的時(shí)候
存儲(chǔ)在變量中的值也會(huì)被復(fù)制到新變量所在的位置,但是這里復(fù)制的值實(shí)際上是一個(gè)指針,它指向了存儲(chǔ)在堆內(nèi)存中的對(duì)象
-
復(fù)制完成之后,兩個(gè)變量實(shí)際上指向同一個(gè)對(duì)象,所以一個(gè)對(duì)象上的變化會(huì)在另一個(gè)對(duì)象上反映出來
let obj1 = new Object(); obj1.name = "小明"; let obj2 = obj1; console.log(obj2.name); // 小明
確定類型
typeof對(duì)引用值的用處不大,當(dāng)需要知道一個(gè)值是什么類型的時(shí)候,可以還有instanceof操作符
-
語法格式:result = variable instanceof constructor
- 如果變量是給定的引用類型的實(shí)例,就返回true
-
例子
let person = new Object(); person.name = "小明"; console.log(person instanceof Object); // 返回true console.log(person instanceof Array); // 返回false 所有引用值都是Object的實(shí)例,所以使用instanceof檢測(cè)任何引用值和Object構(gòu)造函數(shù)都會(huì)返回true
如果用instanceof檢測(cè)原始值,那么會(huì)返回false,因?yàn)樵贾挡皇菍?duì)象