JavaScript數據類型

?

一、JavaScript數據類型主要分為原始類型引用數據類型

?

  1. 原始類型包括(不可拆分的東西):Number、String、Boolean、Null、Undefined。引用數據類型包括:Object(Array,Date,RegExp,Function)
  2. typeof(undefined)返回undefined、typeof(null)返回object
  3. undefined 實際上是從 null 派生來的,因此 ECMAScript 把它們定義為相等的
  4. 引用數據類型也就是對戲那個類型Object type,比如:Object、Array、Function、Date、RegExp等
  5. undefined == null; // true undefined值是派生自null值的
    1 == true;   // true  比較值,容易理解 
    2 == true;   // false 比較的時候,true轉化成1,false轉化成0
    0 == false;  // true  
    0 == '';     // true 
    NaN == NaN;  // false NaN與任何值都不相等,包括NaN本身,
    [] == false; // true 
    [] == ![];   // true 引用類型  

JavaScript的引用數據類型是保存在堆內存中的對象,與其他語言不同的是,你不可以直接訪問堆內存空間中的位置和操作堆內存空間。只能操作對象在棧內存中的引用地址。

二、隱式轉換

    把變量從字符串格式的數字轉換成數字類型:string - 0;

    把變量從數字轉換成字符串類型:number + '';

    字符串、數值轉換成布爾類型:!!string、!!number;

    同樣的null和undefined也可以轉換成布爾類型:!!null、!!undefined;

    Date類型轉換成Number類型:new Date().getTime();

三、包裝對象

基本類型中的Number、String和Boolean都有對應的包裝類型。

var str = 'string'; // 原始類型
var strObj = new String(str); // 包裝類型
strObj.valueOf(); // 返回原始類型
var num = 123; // 原始類型
var numObj = new Number(num); // 包裝類型
numObj.valueOf(); // 返回原始類型
var boo = !!123;// 原始類型
var booObj = new Boolean(123); // 包裝類型
booObj.valueOf();// 返回原始類型

?

四、總結區別

  • 聲明變量時不同的內存分配:

1)原始值:存儲在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置。這是因為這些原始類型占據的空間是固定的,所以可將他們存儲在較小的內存區域 – 棧中。這樣存儲便于迅速查尋變量的值。

2)引用值:存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內存地址。這是因為:引用值的大小會改變,所以不能把它放在棧中,否則會降低變量查尋的速度。相反,放在變量的棧空間中的值是該對象存儲在堆中的地址。地址的大小是固定的,所以把它存儲在棧中對變量性能無任何負面影響。

  • 不同的內存分配機制也帶來了不同的訪問機制
1)在javascript中是不允許直接訪問保存在堆內存中的對象的,所以在訪問一個對象時,首先得到的是這個對象在堆內存中的地址,然后再按照這個地址去獲得這個對象中的值,這就是傳說中的按引用訪問
2)而原始類型的值則是可以直接訪問到的。
  • 復制變量時的不同
1)原始值:在將一個保存著原始值的變量復制給另一個變量時,會將原始值的副本賦值給新變量,此后這兩個變量是完全獨立的,他們只是擁有相同的value而已
2)引用值:在將一個保存著對象內存地址的變量復制給另一個變量時,會把這個內存地址賦值給新變量,也就是說這兩個變量都指向了堆內存中的同一個對象,他們中任何一個作出的改變都會反映在另一個身上。
(這里要理解的一點就是,復制對象時并不會在堆內存中新生成一個一模一樣的對象,只是多了一個保存指向這個對象指針的變量罷了)。多了一個指針
  • 參數傳遞的不同(把實參復制給形參的過程
首先我們應該明確一點:ECMAScript中所有函數的參數都是按值來傳遞的。
但是為什么涉及到原始類型與引用類型的值時仍然有區別呢?還不就是因為內存分配時的差別。?

1)原始值:只是把變量里的值傳遞給參數,之后參數和這個變量互不影響。

2)引用值:對象變量它里面的值是這個對象在堆內存中的內存地址,這一點你要時刻銘記在心!
因此它傳遞的值也就是這個內存地址,這也就是為什么函數內部對這個參數的修改會體現在外部的原因了,因為它們都指向同一個對象。

  

轉載于:https://www.cnblogs.com/guxuelong/p/8548936.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453295.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453295.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

funcode拼圖游戲c語言程序,同求funcode平臺下拼圖游戲的C語言代碼

做了好幾天,寫了好多回就是不對,徹底崩潰。。#include "CommonAPI.h"//#include "LessonX.h"#include#define BLOCK_COUNT 4int g_iGameState;intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];charg_szBlockName[BLOCK_COUNT*BLOCK_COU…

什么是透明傳輸

透明傳輸是指不管所傳數據是什么樣的比特組合,都應當能夠在鏈路上傳送。當所傳數據中的比特組合恰巧與某一個控制信息完全一樣時,就必須采取適當的措施,使收方不會將這樣的數據誤認為是某種控制信息。這樣才能保證數據鏈路層的傳輸是透明的。…

Android 秒級編譯FreeLine

項目地址:FreeLine FreeLine官網: FreeLine 1. 安裝FreeLine插件 File->Settings->Plugins, 搜索輸入FreeLine Plugin, 查找到后進行安裝并重啟Android Studio。 圖1.png安裝好之后,在工具欄就會出一個圖標 圖2.png2. 配置gradle 根目錄build.gr…

JS實現大整數乘法(性能優化、正負整數)

本方法的思路為: 一:檢查了輸入的合法性(非空,無非法字符) 二:檢查輸入是否可以進行簡單計算(一個數為 0,1,1,-1) 三:去掉輸入最前面可…

c語言中- gt he,C語言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分別是什么意思

fabs 編輯本段C語言數學函數:fabs 函數簡介  原型:在TC中原型是extern float fabs(float x);,在VC6.0中原型是double fabs( double x );。   用法:#include   功能:求浮點數x的絕對值   說明:計算|x|, 當x不為…

物理層

目的: 物理層要盡可能地屏蔽掉物理設備和傳輸媒體,通信手段的不同,使數據鏈路層感覺不到這些差異,只考慮完成本層的協議和服務。 給其服務用戶(數據鏈路層)在一條物理的傳輸媒體上傳送和接收比特流…

C語言中的二級指針(雙指針)

二級指針又叫雙指針。C語言中不存在引用,所以當你試圖改變一個指針的值的時候必須使用二級指針。C中可以使用引用類型來實現。 下面講解C中的二級指針的使用方法。 例如我們使用指針來交換兩個整型變量的值。 錯誤代碼如下: 一級指針 [cpp] view pla…

測試環境服務器硬盤塞滿問題排查

項目中出現的問題 某天下午測試環境服務器出現tab無法補全命令,給出的提示大概意思就是說,無可用空間無法創建臨時文件,不過這次跟上次出現的問題比較像,上次服務器出現的問題,因此樓主判斷可能是服務器數據盤被占滿,果…

alpine_glibc 構建sun jdk 8的docker鏡像

2019獨角獸企業重金招聘Python工程師標準>>> 構建系統基礎鏡像 alpine glibc 的Dockerfile內容如下&#xff1a; alpine:3.6 MAINTAINER tongqiang<tongqiangyingmail.com># Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV ALP…

單工 半雙工 全雙工

1 單工 單工就是指A只能發信號&#xff0c;而B只能接收信號&#xff0c;通信是單向的&#xff0c;就象燈塔之于航船——燈塔發出光信號而航船只能接收信號以確保自己行駛在正確的航線上。 2 半雙工 半雙工就是指A能發信號給B&#xff0c;B也能發信號給A&#xff0c;但這兩…

c語言兩個循環的ys,c語言編程:從鍵盤輸入兩個數,求它們的最小公倍數

滿意答案flywisdom2019.06.20采納率&#xff1a;44% 等級&#xff1a;9已幫助&#xff1a;1064人main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//輸入兩個正整數.if(n{tempn;nm;mtemp;}pn*m;//P是原來…

每日微軟面試題

每日微軟面試題——day 1 <以下微軟面試題全來自網絡> <以下答案與分析純屬個人觀點&#xff0c;不足之處&#xff0c;還望不吝指出^_^> 題&#xff1a;.編寫反轉字符串的程序&#xff0c;要求優化速度、優化空間。 分析&#xff1a;構建兩個迭代器p 和 q &…

第八章 多態

第八章 多態1. 重寫一個類通過繼承來產生一個新類&#xff0c;繼承了父類的所有變量和方法&#xff0c;在繼承這些變量和方法的時候&#xff0c;子類也可以具有自己獨特的特征和行為。Public class fruit{Public void print(){System.out.println(“這是超類的方法”);}}Clas…

Ionic Angular自動捕獲錯誤 配置Angular2.x +

配置app.module.ts import { Pro } from ionic/pro;// These are the imports required for the code below, // feel free to merge into existing imports. import { Injectable, Injector } from angular/core; import { IonicErrorHandler } from ionic-angular;const Ioni…

信道和物理媒體的區別

一個信道可以包含很多的物理媒體嗎&#xff0c;同時一個物理媒體也可以包含很多的信道。 信道借助于物理媒體實現數據傳輸&#xff0c;在比較遠的數據傳輸過程中可能會使用多個不同的物理媒體實現數據的傳輸。 而一個物理媒體也可以借助于多路復用技術實現多條信道

c語言刪除尾部空格函數,新人提問:如何將輸出時每行最后一個空格刪除

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓如何將每行最后一個空格刪除&#xff0c;使矩陣只有數字間有空格&#xff0c;沒有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

jsonArray與 jsonObject區別與js取值

一、JSONObject和JSONArray的數據表示形式 JSONObject的數據是用 { } 來表示的&#xff0c; 例如&#xff1a; { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業", "content" : nu…

計劃任務 at,cron

示例&#xff1a;每3小時echo和wall命令 轉載于:https://www.cnblogs.com/momenglin/p/8551618.html

代碼疑云

代碼疑云(1)-掌握初始化列表 代碼&#xff1a; [cpp] view plaincopy#include<iostream> using namespace std; class A { private: int x1; int x2; public: A():x2(1),x1(x2){} //初始化列表 void print() { cout<<"x1"<&…

網絡擁塞

擁塞&#xff08;Congestion&#xff09;指的是在包交換網絡中由于傳送的包數目太多&#xff0c;而存貯轉發節點的資源有限而造成網絡傳輸性能下降的情況。擁塞的一種極端情況是死鎖&#xff08;Deadlock&#xff09;&#xff0c;退出死鎖往往需要網絡復位操作。