摘要:引用數(shù)據(jù)類型引用數(shù)據(jù)類型值指保存在堆內(nèi)存中的對(duì)象。訪問(wèn)方式是按引用訪問(wèn)。數(shù)據(jù)類型檢測(cè)操作符是檢測(cè)基本類型的最佳工具。未定義布爾值字符串?dāng)?shù)值對(duì)象或函數(shù)用于檢測(cè)引用類型,可以檢測(cè)到它是什么類型的實(shí)例。
前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總
歡迎提issues斧正:數(shù)據(jù)類型
回味,無(wú)窮!
數(shù)據(jù)類型定義 數(shù)據(jù)類型分類基本數(shù)據(jù)類型:String,boolean,Number,Symbol(ES6新增),Undefined, Null
引用數(shù)據(jù)類型:Object
基本數(shù)據(jù)類型中有兩個(gè)為特殊數(shù)據(jù)類型: null, undefined
js的常見(jiàn)內(nèi)置對(duì)象:Date,Array,Math,Number,Boolean,String,Array,RegExp,Function...
基本數(shù)據(jù)類型:基本數(shù)據(jù)類型值指保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段。訪問(wèn)方式是按值訪問(wèn)。
var a = 1;
操作的是變量實(shí)際保存的值。
a = 2;
基本類型變量的復(fù)制:從一個(gè)變量向一個(gè)變量復(fù)制時(shí),會(huì)在棧中創(chuàng)建一個(gè)新值,然后把值復(fù)制到為新變量分配的位置上。
var b = a;
b = 2;
引用數(shù)據(jù)類型:引用數(shù)據(jù)類型值指保存在堆內(nèi)存中的對(duì)象。也就是,變量中保存的實(shí)際上的只是一個(gè)指針,這個(gè)指針指向內(nèi)存中的另一個(gè)位置,該位置保存著對(duì)象。訪問(wèn)方式是按引用訪問(wèn)。
var a = new Object();
當(dāng)操作時(shí),需要先從棧中讀取內(nèi)存地址,然后再延指針找到保存在堆內(nèi)存中的值再操作。
a.name = "xz";
引用類型變量的復(fù)制:復(fù)制的是存儲(chǔ)在棧中的指針,將指針復(fù)制到棧中未新變量分配的空間中,而這個(gè)指針副本和原指針指向存儲(chǔ)在堆中的同一個(gè)對(duì)象;復(fù)制操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象。因此,在使用時(shí),改變其中的一個(gè)變量的值,將影響另一個(gè)變量。
var b = a;
b.sex = "boy";
漏畫了,差一條指針。b的引用指針也指向object{sex:"boy"}
b.sex; //"boy" a.name; //"boy"堆&棧
兩者都是存放臨時(shí)數(shù)據(jù)的地方。
棧是先進(jìn)后出的,就像一個(gè)桶,后進(jìn)去的先出來(lái),它下面本來(lái)有的東西要等其他出來(lái)之后才能出來(lái)。
堆是在程序運(yùn)行時(shí),而不是在程序編譯時(shí),申請(qǐng)某個(gè)大小的內(nèi)存空間。即動(dòng)態(tài)分配內(nèi)存,對(duì)其訪問(wèn)和對(duì)一般內(nèi)存的訪問(wèn)沒(méi)有區(qū)別。對(duì)于堆,我們可以隨心所欲的進(jìn)行增加變量和刪除變量,不用遵循次序。
棧區(qū)(stack) 由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。
堆區(qū)(heap) 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。
typeof操作符是檢測(cè)基本類型的最佳工具。
"undefined" — 未定義 "boolean" — 布爾值 "string" — 字符串 "number" — 數(shù)值 "object" — 對(duì)象或null "function" — 函數(shù)Instanceof
instanceof用于檢測(cè)引用類型,可以檢測(cè)到它是什么類型的實(shí)例。
instanceof 檢測(cè)一個(gè)對(duì)象A是不是另一個(gè)對(duì)象B的實(shí)例的原理是:查看對(duì)象B的prototype指向的對(duì)象是否在對(duì)象A的[[prototype]]鏈上。如果在,則返回true,如果不在則返回false。不過(guò)有一個(gè)特殊的情況,當(dāng)對(duì)象B的prototype為null將會(huì)報(bào)錯(cuò)(類似于空指針異常)。
var sXzaver = new String("Xzavier"); console.log(sXzaver instanceof String); // "true" var aXzaver = [1,2,3]; console.log(aXzaver instanceof Array); // "true" 檢測(cè)數(shù)組在ECMA Script5中定義了一個(gè)新方法Array.isArray()Constructor
constructor屬性返回對(duì)創(chuàng)建此對(duì)象的數(shù)組函數(shù)的引用??梢杂糜跈z測(cè)自定義類型。
"xz".constructor == String // true (123).constructor == Number // true (true).constructor == Boolean // true [1,2].constructor == Array // true ({name:"xz"}).constructor == Object // true (function(){}).constructor == Function // true (new Date()).constructor == Date // true (Symbol()).constructor == Symbol // true (/xz/).constructor == RegExp // true
constructor不適用于null和undefined。除了這些原生的,constructor還可驗(yàn)證自定義類型。
function Xzavier(){} var xz = new Xzavier(); xz.constructor == Xzavier; // trueObject.prototype.toString.call(obj)
推薦使用:Object.prototype.toString.call(obj)
原理:調(diào)用從Object繼承來(lái)的原始的toString()方法 Object.prototype.toString.call("xz"); //"[object String]" Object.prototype.toString.call(123); //"[object Number]" Object.prototype.toString.call(true); //"[object Boolean]" Object.prototype.toString.call([1,2]); //"[object Array]" Object.prototype.toString.call({name:"xz"}); //"[object Object]" Object.prototype.toString.call(function(){}); //"[object Function]" Object.prototype.toString.call(null); //"[object Null]" Object.prototype.toString.call(undefined); //"[object Undefined]" Object.prototype.toString.call(); //"[object Undefined]" Object.prototype.toString.call(new Date()); //"[object Date]" Object.prototype.toString.call(/xz/); //"[object RegExp]" Object.prototype.toString.call(Symbol()); //"[object Symbol]" var obj = {name:"Xzavier", age:23}; var a = [1,2,3]; function isType(obj) { return Object.prototype.toString.call(obj).slice(8, -1); } isType(obj); // "Object" isType(a) // "Array"數(shù)據(jù)類型轉(zhuǎn)換 隱式轉(zhuǎn)換
undefined == null; // true 1 == true; // true 2 == true; // false 0 == false; // true 0 == ""; // true NaN == NaN; // false NaN不等于任何值 [] == false; // true [] == ![]; // true "6" - "3" // 3 1234 + "abcd" // "1234abcd"
1.undefined與null相等,但不恒等(===)
2.一個(gè)是number一個(gè)是string時(shí),會(huì)嘗試將string轉(zhuǎn)換為number
3.隱式轉(zhuǎn)換將boolean轉(zhuǎn)換為number,0或1
4.隱式轉(zhuǎn)換將Object轉(zhuǎn)換成number或string,取決于另外一個(gè)對(duì)比量的類型
5.對(duì)于0、空字符串的判斷,建議使用 “===” 。
6.“==”會(huì)對(duì)不同類型值進(jìn)行類型轉(zhuǎn)換再判斷,“===”則不會(huì)。它會(huì)先判斷兩邊的值類型,類型不匹配時(shí)直接為false。
顯示轉(zhuǎn)換一般指使用Number、String和Boolean三個(gè)構(gòu)造函數(shù),手動(dòng)將各種類型的值,轉(zhuǎn)換成數(shù)字、字符串或者布爾值。
Number:Number("1234") // 1234 Number("1234abcd") // NaN Number("") // 0 Number(true) // 1 Number(null) // 0 Number(undefined) // NaNString:
String(1234) // "1234" String("abcd") // "abcd" String(true) // "true" String(undefined) // "undefined" String(null) // "null"Boolean:
Boolean(0) // false Boolean(undefined) // false Boolean(null) // false Boolean(NaN) // false Boolean("") // false
使用總,!!相當(dāng)于Boolean:
!!"foo"; // true !!""; // false !!"0"; // true !!"1"; // true !!"-1" // true !!{}; // true !!true; // true
Number、String、Boolean轉(zhuǎn)換對(duì)象時(shí)主要使用了對(duì)象內(nèi)部的valueOf和toString方法進(jìn)行轉(zhuǎn)換。
Number轉(zhuǎn)換對(duì)象:1.先調(diào)用對(duì)象自身的valueOf方法。如果返回原始類型的值,則直接對(duì)該值使用Number函數(shù),返回結(jié)果。
2.如果valueOf返回的還是對(duì)象,繼續(xù)調(diào)用對(duì)象自身的toString方法。如果toString返回原始類型的值,則對(duì)該值使用Number函數(shù),返回結(jié)果。
3.如果toString返回的還是對(duì)象,報(bào)錯(cuò)。
Number([1]); //1 轉(zhuǎn)換演變: [1].valueOf(); // [1]; [1].toString(); // "1"; Number("1"); //1String轉(zhuǎn)換對(duì)象
1.先調(diào)用對(duì)象自身的toString方法。如果返回原始類型的值,則對(duì)該值使用String函數(shù),返回結(jié)果。
2.如果toString返回的是對(duì)象,繼續(xù)調(diào)用valueOf方法。如果valueOf返回原始類型的值,則對(duì)該值使用String函數(shù),返回結(jié)果。
3.如果valueOf返回的還是對(duì)象,報(bào)錯(cuò)。
String([1,2]) //"1,2" 轉(zhuǎn)化演變: [1,2].toString(); //"1,2" String("1,2"); //"1,2"Boolean轉(zhuǎn)換對(duì)象
Boolean轉(zhuǎn)換對(duì)象很特別,除了以下六個(gè)值轉(zhuǎn)換為false,其他都為true
undefined null false 0(包括+0和-0) NaN 空字符串("") Boolean(undefined) //false Boolean(null) //false Boolean(false) //false Boolean(0) //false Boolean(NaN) //false Boolean("") //false Boolean([]) //true Boolean({}) //true Boolean(new Date()) //true
寫寫博客打打球...要代碼,要籃球,更要生活。。。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79870.html
摘要:業(yè)務(wù)越復(fù)雜,邏輯就越復(fù)雜,判斷就越多比較判斷比較判斷是比較兩個(gè)值,返回一個(gè)布爾值,表示是否滿足比較條件。對(duì)于非布爾值的數(shù)據(jù),取反運(yùn)算符會(huì)自動(dòng)將其轉(zhuǎn)為布爾值。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:========== JavaScript-判斷 代碼中,多多少少會(huì)有判斷語(yǔ)句。業(yè)務(wù)越復(fù)雜,邏輯就越...
摘要:對(duì)象創(chuàng)建字面量方式構(gòu)造函數(shù)方式也可以這樣不過(guò)這樣的話,為何不選擇字面量方式字面量方式和方式的寫法是等價(jià)的,返回的結(jié)果是同種類的對(duì)象。構(gòu)造函數(shù)產(chǎn)生實(shí)例時(shí),實(shí)例通過(guò)其對(duì)應(yīng)原型對(duì)象的訪問(wèn)對(duì)應(yīng)的構(gòu)造函數(shù)對(duì)象。 前端學(xué)習(xí):教程&模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試資源匯總 歡迎提issues斧正:對(duì)象&對(duì)象使用 Object對(duì)象 在 JavaScript 中,對(duì)...
摘要:接收響應(yīng)當(dāng)請(qǐng)求發(fā)送到服務(wù)器端,收到響應(yīng)后,響應(yīng)的數(shù)據(jù)會(huì)自動(dòng)填充對(duì)象的屬性。一般而已狀態(tài)代碼為作為成功的標(biāo)志。必要時(shí),可以將查詢字符串參數(shù)追加到的末尾,以便提交給服務(wù)器。后端實(shí)現(xiàn)可以自學(xué)一點(diǎn)后端知識(shí),便于學(xué)習(xí)。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:Ajax JavaScript-Ajax&&no...
摘要:該對(duì)象包含了函數(shù)的所有局部變量命名參數(shù)參數(shù)集合以及,然后此對(duì)象會(huì)被推入作用域鏈的前端。如果整個(gè)作用域鏈上都無(wú)法找到,則返回。此時(shí)的作用域鏈包含了兩個(gè)對(duì)象的活動(dòng)對(duì)象和對(duì)象。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:閉包 JavaScript-閉包 閉包(closure)是一個(gè)讓人又愛(ài)又恨的somet...
摘要:創(chuàng)建數(shù)組數(shù)組字面量數(shù)組構(gòu)造函數(shù)參數(shù)為數(shù)組建議使用數(shù)組字面量方式,性能好,代碼少,簡(jiǎn)潔,畢竟代碼少。數(shù)組判斷方法用來(lái)判斷某個(gè)值是否為。的這是最簡(jiǎn)潔最直接的遍歷數(shù)組元素的語(yǔ)法。把數(shù)組轉(zhuǎn)換為本地?cái)?shù)組,并返回結(jié)果。 前端學(xué)習(xí):前端教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)組&數(shù)組方法使用詳解 Array對(duì)象 之前一...
閱讀 1948·2021-11-22 14:44
閱讀 1682·2021-11-02 14:46
閱讀 3674·2021-10-13 09:40
閱讀 2609·2021-09-07 09:58
閱讀 1627·2021-09-03 10:28
閱讀 1669·2019-08-29 15:30
閱讀 987·2019-08-29 15:28
閱讀 1477·2019-08-26 12:20