摘要:做個小小的延伸在這個栗子中,兩個對象都有一條相同的值,但這兩個對象卻不相等,為什么呢因為兩個對象分別引用的是存放在堆內(nèi)存中的個不同的對象,故變量和的值引用地址也是不一樣的。
JavaScript中,有七種內(nèi)置類型:6種原始類型和引用類型,他們分別是:
6種原始類型(基本類型):
空值(null)
未定義(undefined)
布爾值(boolean)
數(shù)字(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
現(xiàn)在讓我們來看另一個問題:什么是undefined?
答案是:變量在未持有值時,變量的類型為undefined。
為什么我會在這里會多帶帶提出這個問題?因為很多開發(fā)人員把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),基本類型的儲存方式為棧內(nèi)存(Stack)儲存,下圖所示。
由此得出以下三點結(jié)論;
基本類型的值是不可變的
基本類型的比較是它們的值的比較
基本類型的變量是存放在棧內(nèi)存(Stack)里的
舉個栗子:
var a = "oops"; b = a; b; //"oops" a = "哈哈"; a; //"哈哈" b; //"oops" ,a值的改變不會影響b的值引用類型
我們先來一個栗子看看引用類型是如何在計算機內(nèi)存儲的:
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
從這個例子中可以看出,引用類型的值是保存在堆內(nèi)存(Heap)中的對象,棧內(nèi)存保存變量的指針,堆內(nèi)存中保存具體的對象。
做個小小的延伸:
var a ={name:"hz"}; var b ={name:"hz"}; console.log( a == b ); //false console.log( a === b ); //false
在這個栗子中,a,b兩個對象都有一條相同的值,但這兩個對象卻不相等,為什么呢?因為
a ,b 兩個對象分別引用的是存放在堆內(nèi)存中的2個不同的對象,故變量 a和 b的值(引用地址)也是不一樣的。
以上。
有錯誤的地方希望大家指出來,共同探討。
參考資料:
【文章】 JavaScript 深入了解基本類型和引用類型的值
【書籍】 你不知道的javascript(中卷) 第一章:類型
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99614.html
摘要:前提知識在實現(xiàn)克隆函數(shù)之前你需要明白以下一些概念如果你已經(jīng)明白了請直接閱讀實現(xiàn)部分什么是值類型引用類型很多新手可能會對值類型引用類型原始類型基本類型等等名稱感到困惑這里就解釋一下這些概念一個事物是可以有多種區(qū)分形式的比如貓我們可以說它是貓科 前提知識 在實現(xiàn)克隆函數(shù)之前,你需要明白以下一些概念,如果你已經(jīng)明白了,請直接閱讀 實現(xiàn) 部分. 什么是值類型、引用類型? 很多新手可能會對 值類...
摘要:棧區(qū)由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。屬性返回對創(chuàng)建此對象的構(gòu)造函數(shù)的引用。所有的和都是宿主對象參考高級程序設計堆和棧的概念和區(qū)別全面解析中的數(shù)據(jù)類型與類型轉(zhuǎn)換 數(shù)據(jù)類型 數(shù)據(jù)類型劃分 javascript中定義了6中基本數(shù)據(jù)類型(原始值類型),和一種復雜數(shù)據(jù)類型(引用類型),所謂復雜類型,其本質(zhì)是由無序的名值對(key:val...
摘要:返回布爾值,表示參數(shù)字符串是否在原字符串的頭部。布爾值中布爾值有兩個和和都表示值的空缺,但事從背后更深遠的角度考慮,他們的還是有差別的。首先我們來看一下類型轉(zhuǎn)化表任意的值都可以轉(zhuǎn)換為布爾值,只有會被轉(zhuǎn)換為,其他所有值都會被轉(zhuǎn)換成。 開辟了一個關(guān)于javascript的基礎(chǔ)系列,更加深入、細致的了解這門語言。今天分享的是js的數(shù)據(jù)類型。 javascript的數(shù)據(jù)類型可以分為兩類:原始類...
摘要:解除引用的最佳手段是將對象變量設置為。字面形式允許你在不需要使用操作符和構(gòu)造函數(shù)顯示創(chuàng)建對象的情況下生成引用值。函數(shù)就是值可以像使用對象一樣使用函數(shù)因為函數(shù)本來就是對象,構(gòu)造函數(shù)更加容易說明。 JavaScript(ES5)的面向?qū)ο缶?標簽: JavaScript 面向?qū)ο?讀書筆記 2016年1月16日-17日兩天看完了《JavaScript面向?qū)ο缶罚▍⒓赢惒缴鐓^(qū)的活動送...
摘要:八進制字面值的第一位必須是,然后是八進制數(shù)字序列。十六進制字面量的前兩位必須是,后跟任何十六進制數(shù)字以及。而自動創(chuàng)建的基本包裝類型的對象,則只存在于一行代碼的執(zhí)行瞬間,然后立即銷毀。 前言 ECMAScript 迄今為止標準定義了 7 種數(shù)據(jù)類型:6 種原始類型-- String、Number、 Boolean、 Undefined、Null 和 Symbol;1 種引用類型-- O...
閱讀 2132·2021-11-19 09:58
閱讀 1719·2021-11-15 11:36
閱讀 2879·2019-08-30 15:54
閱讀 3399·2019-08-29 15:07
閱讀 2771·2019-08-26 11:47
閱讀 2825·2019-08-26 10:11
閱讀 2511·2019-08-23 18:22
閱讀 2759·2019-08-23 17:58