變數和物件在記憶體中如何儲存?
兩個面試題:
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
URLEncoder和URLDecoder;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; 雖然建