1. 程式人生 > >變數和物件在記憶體中如何儲存?

變數和物件在記憶體中如何儲存?

兩個面試題:

var a = 10;
function a(){
console.log(a);
};
a();
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x); 
console.log(b.x); 
console.log(a); 
console.log(b); 

答案:
這裡寫圖片描述

這裡寫圖片描述

做對了嗎?
下面分別分析這兩個面試題:
1.javascript是單執行緒的,自上而下有序執行
2.javascript執行程式碼前,將變數,函式,引數提取出來,進行預載入處理(函式宣告優先於變數宣告。)

//預載入:
var
a; var a = function(){ console.log(a); }; //執行 //a = 10; //a();

第一題:
考慮:a函式永遠不被呼叫?
答案是:如果先呼叫的話,是可以呼叫的.因為在預載入時,函式宣告優先順序高,a此時儲存著a函式的地址,指向a函式.(number和地址,我們選擇地址)
但是為什麼在這個面試題中無法呼叫,a is not a function.
原因是:變數賦值時,a變數儲存number10,已經不再指向函式,並且這個函式被銷燬.

圖解:
這裡寫圖片描述

var a;
var b;
a = {n: 1};
b = a;
a.x = a = {n: 2};
console.log
(a.x); console.log(b.x); console.log(a); console.log(b);

第二題:
考慮:連等的情況是指向同一個地址記憶體.
a.x 與 a 都指向{n: 2}物件的記憶體地址.
所以輸出b.x可以輸出{n:2},本質上是x屬性儲存的是object2的地址.(見下圖)

圖解:
這裡寫圖片描述

相關推薦

變數物件記憶體如何儲存?

兩個面試題: var a = 10; function a(){ console.log(a); }; a(); var a = {n: 1}; var b = a; a.x = a = {n: 2

變數資料是如何儲存記憶體

計算機的記憶體是一系列小的檔案櫃,每個檔案櫃有很多的小格子組成,每一個格子都有編號,這個編號就是記憶體的地址。變數根據儲存的資料的不同型別而放置在一個或多個格子裡。變數名是貼在檔案櫃上的標籤,使用者可以通過變數名,無需知道變數的具體地址就可以方便的查詢到變數資料。當執行一個程

jvm 物件記憶體儲存的佈局

jvm  物件在記憶體中儲存的佈局有三部分:物件頭、例項資料、對齊填充。 1、物件頭:執行時資料、型別指標、陣列長度。 (1)執行時資料:hashcode雜湊碼、鎖狀態標誌、執行緒持有的鎖、GC年齡分代等,有些不是固定不變的,在執行時會根據當時的狀態進行修改。 (2)型別指標:

python變數物件

文章標題:Python學習筆記(五)Python動態型別和引用 因為自己對於python中的引用型別有些混,加之看到了上面的文章中的連結,有了一些想法,就寫了下來。 if __name__ == "__main__": a = 3 # 賦值操作 #

第2課 變數物件

一、常見的資料--數字   1-python語言裡的一切資料都是物件   2-1,2,3、-5678   3-python2中int--整型、long--長整型   4-python3中只有int型,沒有long   5-type()---獲取一個數據的型別  print(type(100))

變數物件變數

先上程式碼: class Man(): #直接定義的類的變數,屬於類 #其中 gender, avg_height為基本資料型別,immutable #lis為列表型別,為mutable的 gender = 'male' avg_height =

整形數int、浮點型資料float,在記憶體儲存的表示

引言: 突然想到一個底層問題。 計算機組成原理裡學的:定點整數 定點小數 浮點數; 程式設計裡的基本資料型別int float在記憶體中的儲存形式; 二者究竟的對應關係是? CSDN部落格裡有這樣一句話,“實數在記憶體中以規範化的浮點數存放”,請先理清“實數”是多大範圍再回味這句話! 我在書上看到

[Java]Java類物件記憶體分配詳解

描述 程式碼說明: 一.當Person p1 = new Person();第一次被呼叫時需要做兩件事: 1.先判斷類載入器是否載入過Person類,如果沒有則載入到Person型別到方法區 2.在堆中開闢記憶體空間,在棧中物件名引用(指向)堆的相應記憶體空間 二. p1.name = '皓皓': 將堆中n

物件

類的6個預設成員函式 建構函式、拷貝建構函式、 解構函式、賦值操作符過載、 取地址操作符過載、const修飾的取地址操作符過載    1.建構函式 建構函式:(就是初始化函式) (1)函式名與類名相同,無返回值 (2)建立物件時,編譯器自動呼叫對應的建構函式

牛客網——華為機試(題15:求int型正整數在記憶體儲存時1的個數)(Java)

題目描述: 輸入一個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。 輸入描述: 輸入一個整數(int型別) 輸出描述:  這個數轉換成2進位制後,輸出1的個數 示例1: 輸入: 5 輸出: 2 程式碼:  import java.ut

jvm volatile 實現併發 解決副本快取變數在工作記憶體獲取最後的值

在Java執行緒併發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多執行緒併發處理的時候就可以萬事大吉。Java語言是支援多執行緒的,為了解決執行緒併發的問題,在語言內部引入了 同步塊(synchronized) 和 volatile

變數物件

1.變數在程式執行過程中,其值能被改變的量稱為變數。在Java中,所有的變數必須宣告才能使用,宣告方式為:變數型別 變數名;例如:int age,聲明瞭一個int型別的age變數。變數在使用前進行宣告是為了告訴編譯器這個變數的資料型別,這樣編譯器才能知道分配多大的記憶體空間給它,以及它能存放什麼樣的型別變數。

程式碼塊的解釋,構造程式碼塊,靜態程式碼塊,靜態常量常量以及靜態成員變數物件成員變數的區別

12  程式碼塊 就是一塊程式碼,是一對大括號括起來的內容  方法中:限制變數的生命週期 類中 方法外: 構造程式碼塊:沒有關鍵字修飾,在每次建立物件時,在構造方法執行前進行執行 用途:可以對成員 變

java的各種資料型別在記憶體儲存的方式

1.java是如何管理記憶體的 java的記憶體管理就是物件的分配和釋放問題。(其中包括兩部分) 分配:記憶體的分配是由程式完成的,程式設計師需要通過關鍵字new為每個物件申請記憶體空間(基本型別除外),所有的物件都在堆(Heap)中分配空間。 釋放:物件的釋放是由

華為oj 字串個數統計&&數字顛倒&&字串翻轉&&字元逆序&&求int型資料在記憶體儲存時1的個數

同樣只上程式,都是簡單題 #include<iostream> using namespace std; int main() { int in[128], count = 0; char n,temp[100]; memset(in, 0, sizeo

URLEncoderURLDecoder;cookie儲存特殊字元以及URL亂碼問題解決方案

cookie的特殊字元的編碼和解碼來解決亂碼問題;   編碼: protected void doGet(HttpServletRequest request, HttpServletRespo

求int型資料在記憶體儲存時1的個數

題目描述輸入一個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。輸入描述: 輸入一個整數(int型別)輸出描述: 這個數轉換成2進位制後,輸出1的個數示例1輸入5 輸出2import j

Python變數物件型別速記手冊

變數和物件型別 Python中關於變數和物件型別有一些重要的概念: 變數不受型別約束 變數並不是一塊記憶體空間的標籤,只是物件的名字,是沒有型別的,相當於一個可以指向任何物件void指標。型別屬於物件,而不是變數。 動態型別 它自動地跟蹤你的型別而不是要求宣告程式碼;Python中沒有型別宣告,執

字串記憶體儲存位置

原文連結:http://blog.csdn.net/yangdelong/article/details/5447362?reload ---------------------------------------------------------------------

C++ 關於類物件記憶體佔用的理解

類不是一個實體,而是一種抽象的型別,所以不佔用系統的儲存空間,所以是不會容納資料的。只有當建立物件之後,系統才會對其分配記憶體。每一個物件在建立時候,應該對其初始化。需要注意,同一個類建立的不同物件,資料之間是不能相互訪問的。例如: class A;   A a,b; 雖然建