我們已經(jīng)知道了JS的六種基本數(shù)據(jù)類型:number碳想,boolean,string毁靶,object胧奔,undefined,null预吆,但是js是動態(tài)類型1語言龙填,變量沒有類型限制,可以隨時賦予任意值拐叉。所以我們來討論js的數(shù)據(jù)類型轉(zhuǎn)換岩遗。
一 強(qiáng)制轉(zhuǎn)換
強(qiáng)制轉(zhuǎn)換主要指使用Number、String和Boolean三個函數(shù)凤瘦,手動將各種類型的值宿礁,分布轉(zhuǎn)換成數(shù)字、字符串或者布爾值蔬芥。
Number轉(zhuǎn)換
數(shù)值:轉(zhuǎn)換后還是原來的值
字符串:如果可以被解析為數(shù)值梆靖,則轉(zhuǎn)換為相應(yīng)的數(shù)值Number('324')// 324//?
字符串:如果不可以被解析為數(shù)值,返回 NaN
空字符串轉(zhuǎn)為0
布爾值:true 轉(zhuǎn)成 1笔诵,false 轉(zhuǎn)成
undefined:轉(zhuǎn)成 NaN
null:轉(zhuǎn)成0
String函數(shù)
數(shù)值:轉(zhuǎn)為相應(yīng)的字符串返吻。
字符串:轉(zhuǎn)換后還是原來的值。
布爾值:true轉(zhuǎn)為字符串"true"乎婿,false轉(zhuǎn)為字符串"false"测僵。
undefined:轉(zhuǎn)為字符串"undefined"。
null:轉(zhuǎn)為字符串"null"谢翎。
Boolean函數(shù)
undefined捍靠,null,-0或+0森逮,NaN''剂公,(空字符串)轉(zhuǎn)換為false,其余全部為true
二 自動轉(zhuǎn)換
遇到以下三種情況時吊宋,JavaScript 會自動轉(zhuǎn)換數(shù)據(jù)類型纲辽,即轉(zhuǎn)換是自動完成的颜武,用戶不可見。
第一種情況拖吼,不同類型的數(shù)據(jù)互相運(yùn)算鳞上。
第二種情況,對非布爾值類型的數(shù)據(jù)求布爾值吊档。
第三種情況篙议,對非數(shù)值類型的值使用一元運(yùn)算符(即+和-)。
自動轉(zhuǎn)換的規(guī)則是這樣的:預(yù)期什么類型的值怠硼,就調(diào)用該類型的轉(zhuǎn)換函數(shù)鬼贱。比如,某個位置預(yù)期為字符串香璃,就調(diào)用String函數(shù)進(jìn)行轉(zhuǎn)換这难。如果該位置即可以是字符串,也可能是數(shù)值葡秒,那么默認(rèn)轉(zhuǎn)為數(shù)值姻乓。
由于自動轉(zhuǎn)換具有不確定性,而且不易除錯眯牧,建議在預(yù)期為布爾值蹋岩、數(shù)值、字符串的地方学少,全部使用Boolean剪个、Number和String函數(shù)進(jìn)行顯式轉(zhuǎn)換。
自動轉(zhuǎn)換為布爾值
JavaScript 遇到預(yù)期為布爾值的地方(比如if語句的條件部分)版确,就會將非布爾值的參數(shù)自動轉(zhuǎn)換為布爾值禁偎。系統(tǒng)內(nèi)部會自動調(diào)用Boolean函數(shù)。
自動轉(zhuǎn)換為字符串
JavaScript 遇到預(yù)期為字符串的地方阀坏,就會將非字符串的值自動轉(zhuǎn)為字符串如暖。具體規(guī)則是,先將復(fù)合類型的值轉(zhuǎn)為原始類型的值忌堂,再將原始類型的值轉(zhuǎn)為字符串盒至。
字符串的自動轉(zhuǎn)換,主要發(fā)生在字符串的加法運(yùn)算時士修。當(dāng)一個值為字符串枷遂,另一個值為非字符串,則后者轉(zhuǎn)為字符串棋嘲。
自動轉(zhuǎn)換為數(shù)值
JavaScript 遇到預(yù)期為數(shù)值的地方酒唉,就會將參數(shù)值自動轉(zhuǎn)換為數(shù)值。系統(tǒng)內(nèi)部會自動調(diào)用Number函數(shù)沸移。
除了加法運(yùn)算符(+)有可能把運(yùn)算子轉(zhuǎn)為字符串痪伦,其他運(yùn)算符都會把運(yùn)算子自動轉(zhuǎn)成數(shù)值侄榴。
內(nèi)存圖
一般網(wǎng)頁內(nèi)存分為兩塊,一邊存代碼也叫做“代碼區(qū)”网沾,一邊存數(shù)據(jù)“數(shù)據(jù)區(qū)”癞蚕。
數(shù)據(jù)區(qū)又分兩塊,左邊Stack(棧內(nèi)存)辉哥,右邊Heap(堆內(nèi)存)桦山。
畫內(nèi)存圖時,
把值(簡單的數(shù)據(jù)類型)直接放在Stack里醋旦;
復(fù)雜型的如(object)把Heap ADDR存入Stack里恒水。
深拷貝與淺拷貝(有點類似于指針?)
var a = 1
bar b = a
b = 2
a = 饲齐?
//a = 1
上面代碼表示b變不影響a钉凌,如果能實現(xiàn)這樣的,簡單類型除對象的賦值就叫做深拷貝B嵴拧(b變a不變)
var a = {name:'a'}
var b = a
b.name = 'b'
a.name ?
//a.name = 'b'
b變化導(dǎo)致a也跟著變化甩骏,這就叫做淺拷貝窗市。(b變a也變)