成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript基本數據類型和引用數據類型

開發 前端
本文主要給大家介紹JavaScript數據類型之基本類型和引用類型的值,動態的屬性、復制變量值、傳遞參數、檢測類型等內容,需要的朋友可以參考下。

ECMAScript包含兩種不同數據類型的值:基本類型值和引用類型值。基本類型值指的是簡單的數據段,而引用類型值那些可能有多個值構成的對象。

在進行變量賦值時,解析器必須確定這個值是基本類型值還是引用類型值。常用的5中基本數據類型為:Undefined、Null、Boolean、Number和String。基本數據類型是按值訪問的,因為可以操作保存在變量中的實際的值。而引用類型的值是保存在內存中的對象。JavaScript不允許直接訪問內存中的位置,即不能直接操作對象的內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。因此,引用類型的值是按引用訪問的。

1. 動態的屬性

對于引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法。例如:

  1. var person = new Object(); 
  2.  
  3. person.name = "John"
  4.  
  5. alert(person.name); //"John" 

只要對象不被銷毀或者這個屬性不被刪除,這個屬性就一直存在。但我們不能給基本類型的值添加屬性,盡管并不會導致任何錯誤。

2. 復制變量值

如果從一個變量向另一個變量復制基本類型的值,會在變量對象上創建一個新值,然后將該值復制到為新變量分配的位置上,例如:

  1. var num1 = 5; 
  2.  
  3. var num2 = num1; //5 

下圖形象地展示了復制基本類型值的過程:

 

當從一個變量向另一個變量復制引用類型的值時,同樣會將存儲在變量對象中的值復制一份放到為新變量分配的空間中。不同的是,這個值的副本實際上是一個指針,而這個指針指向存儲在堆中的一個對象。復制操作結束后,兩個變量實際上將引用同一個對象。因此,改變其中一個變量,就會影響另一個變量,例如:

  1. var obj1 = new Object(); 
  2.  
  3. var obj2 = obj1; 
  4.  
  5. obj1.name = "John"
  6.  
  7. alert(obj2.name); //"John" 

 

3. 傳遞參數

ECMAScript中所有函數的參數都是按值傳遞的。把函數外部的值復制給函數內部的參數,就和把一個變量的值復制給另一個變量一樣。無論傳遞的是基本類型的值還是引用類型的值。這里需要注意,訪問變量有按值和按引用兩種方式,但參數只能按值傳遞。

在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量(即命名參數)。例如:

  1. function addTen(num){ 
  2.  
  3. num += 10; 
  4.  
  5. return num; 
  6.  
  7.  
  8. var count = 20; 
  9.  
  10. var result = addTen(count); 
  11.  
  12. alert(count); //20,沒有變化 
  13.  
  14. alert(result); //30 

參數實際上是函數的局部變量。參數num和變量count互不認識,它們只是具有相同的值。假如num是按引用傳遞的,那么count的值也會變成30,從而反應函數內部的變化。

在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變量,因此這個局部變量的變化會反應在函數外部。例如:

  1. function setName(obj){ 
  2.  
  3. obj.name = "John"
  4.  
  5.  
  6. var person = new Object(); 
  7.  
  8. setName(person); 
  9.  
  10. alert(person.name); //"John" 

在這個函數內部,obj和person引用的是同一個對象。換句話說,即使這個值是按值傳遞的,obj也會按引用來訪問同一個對象。于是,在函數內容為obj添加nama屬性在函數外的person對象也有所反應,因為person指向的對象在堆內存中只有一個,而且是全局對象。有許多開發者認為,在函數內容修改的對象會在全局作用域中反應出來,說明參數是按引用傳遞的,這個觀點其實是錯誤的,看下面的代碼:

  1. function setName(obj){ 
  2.  
  3. obj.name = "John"
  4.  
  5. obj = new Object(); 
  6.  
  7. obj.name = "Evan"
  8.  
  9.  
  10. var person = new Object(); 
  11.  
  12. setName(person); 
  13.  
  14. alert(person.name); //"John" 

如果person是按引用傳遞的,那么person就會自動被修改為指向其name屬性為"Evan"的新對象,但我們訪問person.name時發現其值仍然為"John",這說明即使在函數內部修改了參數的值,但原始的引用仍然保持不變。實際上,在函數內部重寫obj時,這個變量引用的就是一個局部對象了。而這個局部對象在函數執行完成之后會立即銷毀。

4. 檢測類型

要檢測一個值是不是基本數據類型,typeof操作符是***工具。它可以檢測一個變量是字符串、數值、布爾值還是undefined。如果一個變量是對象或null,則typeof操作符會返回object。

但是在檢測引用類型的值時,typeof用處就不那么大了,通常我們并不想知道某個值是對象,而想知道它是什么類型的對象,此時可以使用instanceof操作符,如果變量是給定引用類型的實例,那么instanceof操作符就會返回true。例如:

  1. alert(person instanceof Object);    //變量person是Object嗎? 
  2. alert(colors instanceof Array);    //變量colors是Array嗎? 
  3. alert(pattern instanceof RegExp);    //變量pattern是RegExp嗎? 

所有引用類型的值都是Object的實例。因此,在檢測一個引用類型的值或Object構造函數時,instanceof都會返回true。當用instanceof操作符檢測一個基本類型的值時,都會返回false,因為基本類型不是對象。

責任編輯:武曉燕 來源: 博客園
相關推薦

2017-02-27 08:34:09

JavaScript數據引用

2010-10-08 09:02:03

JavaScript基

2010-10-08 15:11:28

JavaScript數

2023-03-27 10:04:27

數據類型浮點型布爾型

2020-10-26 13:46:07

Java基礎入門篇

2021-04-28 18:16:24

Rust數據類型

2011-05-26 14:27:56

java

2019-11-11 14:55:25

Redis數據類型命令

2010-04-27 11:03:39

Oracle Java

2009-08-14 11:15:45

C#基本數據類型

2021-12-03 15:24:45

Javascript數據類型

2024-11-04 06:20:00

Redis單線程

2010-07-22 17:57:40

2010-10-15 13:28:34

MySql數據類型

2010-01-18 16:49:36

VB.NET基本數據類

2018-05-25 09:50:30

Java數據類型類型轉換

2023-07-04 08:41:08

Redis數據類型

2011-07-29 10:12:12

JavaScript

2019-08-12 11:40:48

數據庫SQLite3數據類型

2014-01-05 17:08:09

PostgreSQL數據類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区久久精品视 | 一区二区三区四区视频 | 国产精品美女久久久久久免费 | 日韩毛片网 | 日韩在线一区二区三区 | 日韩精品在线一区 | 91精品国产色综合久久 | 日韩成人 | 久久久久中文字幕 | 久久久精品一区 | www.天天操.com | 国产成人a亚洲精品 | 亚洲一区二区视频在线播放 | 少妇一区二区三区 | 中文久久 | 成人免费观看男女羞羞视频 | 伊人伊人 | 亚洲中国字幕 | 欧美日韩三级在线观看 | 五月婷六月丁香 | 久久久精 | 中文字幕视频在线看5 | 一区二区高清在线观看 | 香蕉大人久久国产成人av | 91精品国产91久久综合桃花 | 国产成视频在线观看 | 欧美成人精品欧美一级 | 精品一区二区三区在线视频 | 日韩视频观看 | 一级久久久久久 | 视频一区在线观看 | 天久久| 日韩在线播放中文字幕 | 久久久一区二区三区 | 黄视频免费 | 在线国产小视频 | 国产中文字幕在线 | 一级免费在线视频 | 免费在线观看一级毛片 | 丝袜美腿一区二区三区 | 午夜成人免费视频 |