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