歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> JavaScript中的原始值和復雜值

JavaScript中的原始值和復雜值

日期:2017/3/1 9:19:41   编辑:Linux編程

前面的話

  javascript的數據類型可以分為兩種:原始類型和引用類型。原始類型也稱為基本類型或簡單類型,javascript基本數據類型包括Undefined、Null、Boolean、Number和String五種,而引用類型也稱為復雜類型,在Javascript中是Object。與此相對應,它們的值也分別被稱為原始值和復雜值

特性

原始值

  原始值是表示Javascript中可用的數據或信息的最底層形式或最簡單形式。原始類型的值被稱為原始值,是因為它們是不可細化的。也就是說,數字是數字,字符是字符,布爾值則是true或false,null和undefined就是null和undefined。這些值本身很簡單,不能表示由其他值組成的值

復雜值

  復雜值可以由很多不同類型的javascript對象組成。復雜對象其在內存中的大小是未知的,因為復雜對象可以包含任何值,而不是一個特定的已知值

存儲方式

棧存儲

  因為原始值占據空間固定,是簡單的數據段,為了便於提升變量查詢速度,將其存儲在棧(stack)中

堆存儲

  由於復雜值的大小會改變,所以不能將其存放在棧中,否則會降低變量查詢速度,因此其存儲在堆(heap)中,存儲在變量處的值是一個指針,指向存儲對象的內存處

訪問方式

按值訪問

  原始值是作為不可細化的值進行存儲和操作的,引用它們會轉移其值

var myString = 'foo';
var myStringCopy = myString;
var myString = null;
console.log(myString,myStringCopy);//null,'foo'

引用訪問

  復雜值是通過引用進行存儲和操作的,而不是實際的值。創建一個包含復雜對象的變量時,其值是內存中的一個引用地址。引用一個復雜對象時,使用它的名稱(即變量或對象屬性)通過內存中的引用地址獲取該對象值

var myObject = {};
var copyOfMyObject = myObject;//沒有復制值,而是復制了引用
myObject.foo = 'bar';//操作myObject中的值
//現在如果輸出myObject和copyOfMyObject,則都會輸出foo屬性,因為它們引用的是同一個對象
console.log(myObject,copyOfMyObject);//Object{foo="bar"}

比較方式

  原始值采用值比較,而復雜值采用引用比較。復雜值只有在引用相同的對象(即有相同的地址)時才相等。即使是包含相同對象的兩個變量也彼此不相等,因為它們並不指向同一個對象

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

動態屬性

  對於復雜值,可以為其添加屬性和方法,也可以改變和刪除其屬性和方法;但簡單值不可以添加屬性和方法

  復雜值支持動態對象屬性,因為我們可以定義對象,然後創建引用,再更新對象,並且所有指向該對象的變量都會獲得更新。一個新變量指向現有的復雜對象,並沒有復制該對象。這就是復雜值有時被稱為引用值的原因。復雜值可以根據需求有任意多個引用,即使對象改變,它們也總是指向同一個對象

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

包裝類型

  原始值被當作構造函數創建的一個對象來使用時,Javascript會將其轉換成一個對象,以便可以使用對象的特性和方法,而後拋棄對象性質,並將它變回到原始值

  關於包裝類型的詳細信息移步至此 http://www.linuxidc.com/Linux/2016-01/127132.htm

Copyright © Linux教程網 All Rights Reserved