原始值(primitive value)
?
簡單的說:原始值是固定而簡單的值,是存放在棧(stack)中的簡單數(shù)據(jù)段,也就是說,它們的值直接存儲在變量訪問的位置.
原始值是表示Javascript中可用的數(shù)據(jù)或信息的最底層形式或最簡單形式。原始類型的值被稱為原始值,是因為它們是不可細化的。也就是說,數(shù)字是數(shù)字,字符是字符,布爾值則是true或false,null和undefined就是null和undefined。這些值本身很簡單,不能表示由其他值組成的值
有哪些類型是原始類型呢?
原始類型(primitive type)有以下五種類型:Undefined,Null,Boolean,Number,String
我們可以使用typeof來判斷一個是否在某個類型的范圍內(nèi).
typeof運算符
對變量或值使用typeof運算符將會返回下列值之一:
?
注意:
1.返回值為字符串類型.
2.和原始類型比,還差了個null,這個比較特殊,使用typeof(null),返回的是"object",我們將null理解成是object的占位符.
復雜值
復雜值可以由很多不同類型的javascript對象組成。復雜對象其在內(nèi)存中的大小是未知的,因為復雜對象可以包含任何值,而不是一個特定的已知值
存儲方式
棧存儲
因為原始值占據(jù)空間固定,是簡單的數(shù)據(jù)段,為了便于提升變量查詢速度,將其存儲在棧(stack)中
堆存儲
由于復雜值的大小會改變,所以不能將其存放在棧中,否則會降低變量查詢速度,因此其存儲在堆(heap)中,存儲在變量處的值是一個指針,指向存儲對象的內(nèi)存處
?
訪問方式
按值訪問
原始值是作為不可細化的值進行存儲和操作的,引用它們會轉移其值
?
| 1 2 3 4 | var myString = 'foo'; var myStringCopy = myString; var myString = null; console.log(myString,myStringCopy);//null,'foo' |
引用訪問
復雜值是通過引用進行存儲和操作的,而不是實際的值。創(chuàng)建一個包含復雜對象的變量時,其值是內(nèi)存中的一個引用地址。引用一個復雜對象時,使用它的名稱(即變量或對象屬性)通過內(nèi)存中的引用地址獲取該對象值
?
| 1 2 3 4 5 | var myObject = {}; var copyOfMyObject = myObject;//沒有復制值,而是復制了引用 myObject.foo = 'bar';//操作myObject中的值 //現(xiàn)在如果輸出myObject和copyOfMyObject,則都會輸出foo屬性,因為它們引用的是同一個對象 console.log(myObject,copyOfMyObject);//Object{foo="bar"} |
比較方式
原始值采用值比較,而復雜值采用引用比較。復雜值只有在引用相同的對象(即有相同的地址)時才相等。即使是包含相同對象的兩個變量也彼此不相等,因為它們并不指向同一個對象
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var price1 = 10; var price2 = 10; var price3 = new Number('10'); var price4 = price3; console.log(price1 == price2);//true console.log(price1 == price3);//false price4 = 10; console.log(price4 == price3);//true console.log(price4 === price3);//false var objectFoo = {same:'same'}; var objectBar = {same:'same'}; console.log(objectFoo == objectBar);//false var objectA = {foo: 'bar'}; var objectB = objectA; console.log(objectA == objectB);//true |
動態(tài)屬性
對于復雜值,可以為其添加屬性和方法,也可以改變和刪除其屬性和方法;但簡單值不可以添加屬性和方法
復雜值支持動態(tài)對象屬性,因為我們可以定義對象,然后創(chuàng)建引用,再更新對象,并且所有指向該對象的變量都會獲得更新。一個新變量指向現(xiàn)有的復雜對象,并沒有復制該對象。這就是復雜值有時被稱為引用值的原因。復雜值可以根據(jù)需求有任意多個引用,即使對象改變,它們也總是指向同一個對象
?
| 1 2 3 4 5 6 7 8 | var str = 'test'; str.property = true; console.log(str.property);//undefined var objA = {property: 'value'}; var pointer1 = objA; var pointer2 = pointer1; objA.property = null; console.log(objA.property,pointer1.property,pointer2.property);//null null null |
包裝類型
原始值被當作構造函數(shù)創(chuàng)建的一個對象來使用時,Javascript會將其轉換成一個對象,以便可以使用對象的特性和方法,而后拋棄對象性質,并將它變回到原始值
總結
以上是生活随笔為你收集整理的原始值(primitive value)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑箱问题
- 下一篇: 【JZOJ 省选模拟】多项式(poly)