摘要:做個小小的延伸在這個栗子中,兩個對象都有一條相同的值,但這兩個對象卻不相等,為什么呢因為兩個對象分別引用的是存放在堆內存中的個不同的對象,故變量和的值引用地址也是不一樣的。
JavaScript中,有七種內置類型:6種原始類型和引用類型,他們分別是:
6種原始類型(基本類型):
空值(null)
未定義(undefined)
布爾值(boolean)
數字(number)
字符串(string)
符號(symbol,ES6中新增)
引用類型:
對象(object)
類型判斷我們可以用typeof運算符來查看類型的值:
typeof(undefined) //"undefined" typeof("123") //"string" typeof(123) //"number" typeof(true) //"boolean" typeof Symbol() //"symbol" typeof({name:"oops"}) //"object" typeof([1,2,3]) //"object"
我們注意到,null值并不在列,為什么呢?這里比較特殊:
typeof(null) //"object" , 這是js中的一個bug
我們應該使用正確的方法來判斷null值的類型:
var a = null; (!a && typeof a ==="object") //true
現在讓我們來看另一個問題:什么是undefined?
答案是:變量在未持有值時,變量的類型為undefined。
為什么我會在這里會多帶帶提出這個問題?因為很多開發人員把undefined等同于undeclared(未聲明),這是一個觀念性的錯誤。已在作用域中聲明的變量但未賦值的,稱為undefined;相反,還未在作用域中聲明的變量,稱為undeclared(未聲明)。
舉個栗子:
var a; a; //undefined c; //Uncaught ReferenceError: c is not defined
是不是忽然明白了這兩者的差別,BUT!!,請看這個栗子:
var a; typeof a; //"undefined" typeof b; //"undefined"
奇怪,變量b未在作用域中聲明,為什么不報錯且typeof的值怎么還是undefined?那是因為typeof的一種特殊的安全機制。利用這點,當我們用if條件語句判斷某個變量是否有值時,可以用這種方法。舉個栗子:
//變量a未聲明,以下方式會報錯 if(a){ ... } //變量a未聲明,以下方式就是安全的 if( typeof a !== "undefined"){ ... }
so ,通過typeof檢查undeclared變量是個不錯的方法。
基本類型(原始類型)js中有六種基本類型,他們是:Undefined、Null、Boolean、Number、String、Symbol (new in ES 6),基本類型的儲存方式為棧內存(Stack)儲存,下圖所示。
由此得出以下三點結論;
基本類型的值是不可變的
基本類型的比較是它們的值的比較
基本類型的變量是存放在棧內存(Stack)里的
舉個栗子:
var a = "oops"; b = a; b; //"oops" a = "哈哈"; a; //"哈哈" b; //"oops" ,a值的改變不會影響b的值引用類型
我們先來一個栗子看看引用類型是如何在計算機內存儲的:
var a ={}; var b; a.name = "oops"; a.age = 24; b = a; console.log( b.age ); //24 a.name = "hz"; b.age = 18; console.log( a.age ) //18
從這個例子中可以看出,引用類型的值是保存在堆內存(Heap)中的對象,棧內存保存變量的指針,堆內存中保存具體的對象。
做個小小的延伸:
var a ={name:"hz"}; var b ={name:"hz"}; console.log( a == b ); //false console.log( a === b ); //false
在這個栗子中,a,b兩個對象都有一條相同的值,但這兩個對象卻不相等,為什么呢?因為
a ,b 兩個對象分別引用的是存放在堆內存中的2個不同的對象,故變量 a和 b的值(引用地址)也是不一樣的。
以上。
有錯誤的地方希望大家指出來,共同探討。
參考資料:
【文章】 JavaScript 深入了解基本類型和引用類型的值
【書籍】 你不知道的javascript(中卷) 第一章:類型
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99614.html
摘要:前提知識在實現克隆函數之前你需要明白以下一些概念如果你已經明白了請直接閱讀實現部分什么是值類型引用類型很多新手可能會對值類型引用類型原始類型基本類型等等名稱感到困惑這里就解釋一下這些概念一個事物是可以有多種區分形式的比如貓我們可以說它是貓科 前提知識 在實現克隆函數之前,你需要明白以下一些概念,如果你已經明白了,請直接閱讀 實現 部分. 什么是值類型、引用類型? 很多新手可能會對 值類...
摘要:棧區由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。屬性返回對創建此對象的構造函數的引用。所有的和都是宿主對象參考高級程序設計堆和棧的概念和區別全面解析中的數據類型與類型轉換 數據類型 數據類型劃分 javascript中定義了6中基本數據類型(原始值類型),和一種復雜數據類型(引用類型),所謂復雜類型,其本質是由無序的名值對(key:val...
摘要:返回布爾值,表示參數字符串是否在原字符串的頭部。布爾值中布爾值有兩個和和都表示值的空缺,但事從背后更深遠的角度考慮,他們的還是有差別的。首先我們來看一下類型轉化表任意的值都可以轉換為布爾值,只有會被轉換為,其他所有值都會被轉換成。 開辟了一個關于javascript的基礎系列,更加深入、細致的了解這門語言。今天分享的是js的數據類型。 javascript的數據類型可以分為兩類:原始類...
摘要:解除引用的最佳手段是將對象變量設置為。字面形式允許你在不需要使用操作符和構造函數顯示創建對象的情況下生成引用值。函數就是值可以像使用對象一樣使用函數因為函數本來就是對象,構造函數更加容易說明。 JavaScript(ES5)的面向對象精要 標簽: JavaScript 面向對象 讀書筆記 2016年1月16日-17日兩天看完了《JavaScript面向對象精要》(參加異步社區的活動送...
摘要:八進制字面值的第一位必須是,然后是八進制數字序列。十六進制字面量的前兩位必須是,后跟任何十六進制數字以及。而自動創建的基本包裝類型的對象,則只存在于一行代碼的執行瞬間,然后立即銷毀。 前言 ECMAScript 迄今為止標準定義了 7 種數據類型:6 種原始類型-- String、Number、 Boolean、 Undefined、Null 和 Symbol;1 種引用類型-- O...
閱讀 2102·2021-11-19 09:58
閱讀 1701·2021-11-15 11:36
閱讀 2867·2019-08-30 15:54
閱讀 3386·2019-08-29 15:07
閱讀 2759·2019-08-26 11:47
閱讀 2805·2019-08-26 10:11
閱讀 2496·2019-08-23 18:22
閱讀 2744·2019-08-23 17:58