摘要:類型類型只有一個(gè)值,也就是在使用關(guān)鍵聲明一個(gè)變量而未對其進(jìn)行初始化時(shí),這個(gè)變量的值就是。其他的轉(zhuǎn)換方法自動(dòng)四舍五入,接受一個(gè)參數(shù),表示返回值的小數(shù)位數(shù)。以指數(shù)表示法返回字符串。
一.JavaScript中的基礎(chǔ)概念 1.defer屬性
一般我們在引用外部js文件的時(shí)候往往是將引用文件的位置放在
標(biāo)簽當(dāng)中,比如那么在標(biāo)簽中引入多個(gè)js文件時(shí),瀏覽器會(huì)按照引入順序加載執(zhí)行這些引入的js文件,如果加載執(zhí)行的這些js文件的時(shí)間比較長,那么頁面就會(huì)處在等待期間。在下載引入的js文件時(shí),現(xiàn)在的瀏覽器大多都是會(huì)并行下載的,不會(huì)去單線程的下載,這樣提高了效率,但仍然會(huì)阻塞一些其他資源的下載比如說圖片的下載,這樣就因?yàn)閖s的下載執(zhí)行而阻塞了UI渲染,會(huì)在頁面上形成空白頁面,這時(shí)我們可以有多種辦法解決這個(gè)問題。比如說使用defer屬性,雖然使用defer屬性這不是最好的辦法腳本會(huì)被延遲到整個(gè)HTML頁面都解析完畢后再運(yùn)行,HTML5規(guī)范要求腳本按照出現(xiàn)的先后順序執(zhí)行,因此,第一個(gè)延遲腳本會(huì)在第二個(gè)延遲腳本之前執(zhí)行。但是事實(shí)中并不一定是這樣的,所以建議頁面中只包含一個(gè)延遲腳本。并且這個(gè)defer屬性只適用于外部腳本文件(引入腳本文件 src = "...")
2.作用域全局作用域
在函數(shù)外部聲明的或者定義的變量屬于全局作用域的范圍,事實(shí)上在函數(shù)外部聲明或者定義的變量會(huì)被作為window對象的屬性。
示例代碼如下:
var msg;//聲明一個(gè)變量會(huì)作為window對象的屬性 alert(msg);//輸出undefined
局部作用域
在函數(shù)中使用var操作符定義的變量為局部變量 函數(shù)退出后這個(gè)變量就會(huì)銷毀,看看下面的代碼:
function test(){ var msg = "hi";//在函數(shù)中定義一個(gè)變量,當(dāng)函數(shù)執(zhí)行完成后 這個(gè)變量就會(huì)銷毀 } test();//調(diào)用test函數(shù),函數(shù)執(zhí)行完成后,變量msg就會(huì)銷毀 alert(msg + "_debug");//解析錯(cuò)誤
但是需要注意的是,聲明或者定義變量時(shí)省略var操作符會(huì)直接定義全局變量,如下所示:
function test(){ msg = "hi";//直接定義全局變量 } test(); alert(msg + " -sss");// 輸出hi -sss數(shù)據(jù)類型
JavaScript這門語言屬于數(shù)據(jù)松散類型的語言,但是也有5種基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number,和String和一種復(fù)雜數(shù)據(jù)類型(引用類型)Object,可以使用typeof操作符檢測給定變量的類型。
Undefined類型
Undefined類型只有一個(gè)值,也就是undefined.在使用var關(guān)鍵聲明一個(gè)變量而未對其進(jìn)行初始化時(shí),這個(gè)變量的值就是Undefined。但是需要注意的是:只聲明沒有初始化的變量的值是undefined, 但是如果沒有聲明變量而直接使用一個(gè)沒有聲明的變量會(huì)報(bào)錯(cuò)看看下面的代碼唄
var msg;//這個(gè)變量聲明之后雖然沒有初始化但是獲得了undefined值 alert(msg);//輸出undefined alert(msg == undefined);//輸出true alert(aa);//aa并沒有聲明 報(bào)錯(cuò) ReferenceError: aa is not defined
然而,惡心的地方是在于使用typeof操作符判斷一個(gè)無論是否進(jìn)行過聲明的變量都會(huì)返回undefined,如下所示:
var msg;//這個(gè)變量聲明之后雖然沒有初始化但是獲得了undefined值 //age并沒有聲明 alert(typeof msg);//輸出undefined alert(typeof age);//age并沒有聲明 但是依然會(huì)返回undefined
Null類型
Null類型也是只有一個(gè)值的特殊數(shù)據(jù)類型,即null,null表示一個(gè)空對象指針 而用typeof檢測null值會(huì)返回object,如果要聲明一個(gè)變量指向一個(gè)對象(Object),那么可以聲明時(shí)先var dog = null; 如下所示:
var dog = null; alert(dog);//輸出空白 alert(typeof dog);//輸出object
實(shí)際上,undefined值是派生自Null值的,所以他們的相等性測試會(huì)返回true alert(undefined == null);//輸出true.盡管,undefined和null有著這樣的關(guān)系,但是他們的用途是完全不同的,聲明一個(gè)對象時(shí),盡量讓這個(gè)指向?qū)ο蟮淖兞恐赶騨ull,即體現(xiàn)了null作為空對象指針的慣例,又有助于區(qū)分undefined和null.
Boolean類型
Boolean類型的值只有true和false,但是任何類型的值調(diào)用Boolean()函數(shù),都可以返回一個(gè)Boolean類型的值,看看下面的代碼示例:
String 類型,如果是非空的字符串 轉(zhuǎn)換完成后是true 如果是空字符串是false
var msg = "hi" ; var msg1 = ""; alert(Boolean(msg));// 非空字符串 輸出true alert(Boolean(msg1)); // 空字符串 輸出false
Number類型,如果是非零的數(shù)值則會(huì)轉(zhuǎn)換為true,如果是0或者NaN則會(huì)轉(zhuǎn)換為false
alert(Boolean(0));//輸出false alert(Boolean(222));//輸出true
Obeject類型,如果是Object類型的變量并且指向一個(gè)對象,那么返回true,如果指向的是null,那么返回false.看看下面的代碼:
var t1 = new Object(); console.debug(Boolean(t1));//true var t2; console.debug(Boolean(t2));//false var t3 = null; console.debug(Boolean(t3));//false function isNull(obj){ if(obj){ console.debug("obj不為空"); }else{ console.debug("obj為空"); } } isNull(t1);//obj不為空 isNull(t2);//obj為空 isNull(t3);//obj為空
Number類型
1.浮點(diǎn)數(shù)值
由于保存浮點(diǎn)數(shù)值所需要的內(nèi)存空間是保存整數(shù)值的兩倍,因此ECMAScript會(huì)盡量的將float可以轉(zhuǎn)化整數(shù)值
如果一個(gè)小數(shù)點(diǎn)后面沒有數(shù)字,那么這個(gè)數(shù)值就會(huì)作為整數(shù)存儲(chǔ),如果浮點(diǎn)數(shù)本身就是一個(gè)整數(shù),比如1.0也會(huì)轉(zhuǎn)換為整數(shù)
存儲(chǔ)。如下所示:
var n1 = 1.0;//雖然是浮點(diǎn)數(shù),但是等于一個(gè)整數(shù),解析為1 var n2 = 2.;//小數(shù)點(diǎn)后沒有數(shù)字,解析為2
2.NaN值
NaN值(Not a Number 非數(shù)值型)表示本來要返回?cái)?shù)值的操作結(jié)果卻未返回?cái)?shù)值的情況。比如 1/0這樣的操作
NaN有兩個(gè)特點(diǎn)::
1任何涉及NaN的操作(例如NaN/10)都會(huì)返回NaN
2.NaN與任何數(shù)值包括NaN都不想等 比如NaN == NaN 返回false
isNaN()函數(shù)可以幫助我們確定這個(gè)參數(shù) 是否為不是數(shù)值 比如 isNaN(NaN);返回true
3.數(shù)值轉(zhuǎn)換
數(shù)值轉(zhuǎn)換時(shí)使用的轉(zhuǎn)換函數(shù):Number()、parseInt()、parseFloat()
1.Number()函數(shù)的轉(zhuǎn)換規(guī)則:適用于任何數(shù)據(jù)類型。
boolean值 true和false分別被轉(zhuǎn)換為 1 和 0;
數(shù)值只是簡單的傳入和返回;
null轉(zhuǎn)換為 0;
undefined轉(zhuǎn)換為 NaN;
目標(biāo)是字符串時(shí)的轉(zhuǎn)換規(guī)則:
字符串中只包含數(shù)字,將其轉(zhuǎn)換為十進(jìn)制數(shù)值,前導(dǎo)0會(huì)被忽略(包括了八進(jìn)制的轉(zhuǎn)換,因?yàn)榘诉M(jìn)制是有前導(dǎo)0和其他0-7的數(shù)字組成);字符串中包含有效浮點(diǎn)值,轉(zhuǎn)換為對應(yīng)的浮點(diǎn)數(shù);字符串中包含有效的十六進(jìn)制數(shù),會(huì)轉(zhuǎn)換為相等的十進(jìn)制數(shù)值(比如“0xf”);空字符串轉(zhuǎn)換為0;
目標(biāo)是對象的轉(zhuǎn)換規(guī)則:
如果目標(biāo)是對象,則調(diào)用對象的valueOf()方法,然后按照前面的規(guī)則轉(zhuǎn)換返回值,如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對象的toString()方法,
然后再次按照前面的規(guī)則轉(zhuǎn)換返回的字符串值.可以看看下面的示例代碼:
var num1 = Number("Hello world!"); //NaN var num2 = Number(""); //0 var num3 = Number("000011"); //11 var num4 = Number(true); //1
2、parseInt()轉(zhuǎn)換函數(shù)
parseInt(parseNum,radix)函數(shù),第一參數(shù)為需要轉(zhuǎn)換的數(shù)值,第二個(gè)參數(shù)為基數(shù),即以radix為基數(shù),
對parseNum進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換完成后返回的數(shù)值是10進(jìn)制數(shù),并且為number類型,這種轉(zhuǎn)換方法主要是用來轉(zhuǎn)換字符串,
parseInt會(huì)會(huì)略字符串前面的空格字符得到結(jié)果的第一個(gè)字符不是數(shù)字字符和負(fù)號(hào)(-),將返回NaN。
parseInt()可以接受兩個(gè)參數(shù),第一個(gè)值表示要進(jìn)行轉(zhuǎn)換的值,第二個(gè)表示轉(zhuǎn)換的方式(十進(jìn)制、十六進(jìn)制、或者八進(jìn)制格式)。
當(dāng)沒有第二個(gè)參數(shù)時(shí),默認(rèn)轉(zhuǎn)換為十進(jìn)制。
var num1 = parseInt("11", 2); //3 parsed as binary alert(typeof(num1)); // alert number 為number類型 var num2 = parseInt("15", 8); //13 parsed as octal var num3 = parseInt("10", 10); //10 parsed as decimal var num4 = parseInt("11", 16); //17 parsed as hexadecimal
3、parseFloat()轉(zhuǎn)換方法,該方法會(huì)始終忽略前導(dǎo)0且只有一個(gè)小數(shù)點(diǎn)有效,如果小數(shù)點(diǎn)之后只有數(shù)字0,將會(huì)返回整數(shù)。
4、其他的轉(zhuǎn)換方法
toFixed()自動(dòng)四舍五入,接受一個(gè)參數(shù),表示返回值的小數(shù)位數(shù)。
toExponential()以指數(shù)表示法返回字符串。
toPrecision(),自動(dòng)選擇合適的表示方法。
注:這三個(gè)方法都會(huì)返回字符串。
var num3 = parseFloat("10.12345", 10); alert(typeof num3);//轉(zhuǎn)換完成后為number類型 var num3Str = num3.toFixed(4);//四舍五入后返回的是string類型 alert(num3Str);//10.1235 alert(typeof num3Str);//string類型操作符需要注意的地方
對于 + 操作符,如果有一個(gè)操作數(shù)是字符串類型,那么另一個(gè)操作數(shù)會(huì)轉(zhuǎn)換為字符串,然后拼接起來,看看下面的代碼
var f = true; alert(f);//true alert(typeof f);//boolean var s = ""; alert( s + f);//輸出true var fs = s+f; alert( typeof fs);//返回String var str = "test_"; var strT = str + f; alert(strT);//test_true alert(typeof strT);//string var num = 5; var s = "5"; var ss = num+s; alert(ss);//輸出55 將num轉(zhuǎn)換為字符串的5 然后與5拼接得 字符串55 alert(typeof ss); //string var is = parseInt(s); alert(is + num);//輸出10
2.比較操作符 > < <= =>
如果兩個(gè)操作數(shù)都是數(shù)值 ,進(jìn)行數(shù)值比較,
都是字符串,則比較兩個(gè)字符串的字符編碼值
只有一個(gè)操作數(shù)是數(shù)值,則將另一個(gè)操作數(shù)轉(zhuǎn)為數(shù)值進(jìn)行比較
如果有一個(gè)操作數(shù)是布爾值,則先將其轉(zhuǎn)換為數(shù)值,然后再進(jìn)行比較。
如果一個(gè)操作數(shù)是對象,則調(diào)用這個(gè)對象的valueOf()方法,用前面的規(guī)則。如果對象沒有valueOf()方法,則調(diào)用toString()方法
如果兩個(gè)操作數(shù)都是對象,則比較他們是不是同一個(gè)對象。如果兩個(gè)操作數(shù)都指向同一個(gè)對象,則相等操作返回true,否則返回false
null和undefined是相等的
// == 與 != 的判斷是先轉(zhuǎn)換再判斷 var result = "1" == 1;// 字符串會(huì)轉(zhuǎn)換為數(shù)值 true result = "1" == 0;// 字符串會(huì)轉(zhuǎn)換為數(shù)值 false result = null == undefined;//null 與undefined 相等 result = null ==NaN;//NaN無論跟什么比較 都不相等false result = NaN == NaN;//NaN即使與NaN比較 都是false //若是比較兩個(gè)對象是否== 則是是否指向同一個(gè)對象 var o1 = new Object(); var o2 = new Object(); var o3 = o1; alert("o1==o2 ? " + (o1==o2));//false alert("o1==o3 ? " + (o1==o3));//true
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87576.html
摘要:在中,由于垃圾回收是自動(dòng)進(jìn)行的,所以人們在編碼時(shí)可能不太會(huì)注意這方面。時(shí),引擎統(tǒng)一對所有這些狀態(tài)的對象進(jìn)行回收。,表示釋放該對象后能得到的內(nèi)存大小。 在 JavaScript 中,由于垃圾回收是自動(dòng)進(jìn)行的,所以人們在編碼時(shí)可能不太會(huì)注意這方面。但事實(shí)是,一些 webapp 在使用一段時(shí)間后,會(huì)出現(xiàn)卡頓的現(xiàn)象,特別是那些單頁應(yīng)用,包括 WebView 方式的手機(jī) app 。這個(gè)現(xiàn)象在傳統(tǒng)...
摘要:關(guān)于中的坑大家都踩過。那這里的和是嚴(yán)格相等的。這里介紹的是通過創(chuàng)建對象時(shí)的。提示一下,數(shù)組對象的函數(shù)本身就是有這個(gè)功能的,也就是說可以達(dá)到要求。事件有兩種記法,一個(gè)是也是類似,那么在中出現(xiàn)的表示觸發(fā)該事件的元素,也就是。 TL;DR: this 指向調(diào)用該方法的對象,只有函數(shù)執(zhí)行時(shí),this 才有定義。 關(guān)于 JavaScript 中 this 的坑大家都踩過。像本文開頭的這句話,道理...
摘要:每一個(gè)對象直接量都是的子類,即構(gòu)造函數(shù)中的構(gòu)造函數(shù)與普通函數(shù)并沒有什么兩樣,只不過在調(diào)用時(shí),前面加上了關(guān)鍵字,就當(dāng)成是構(gòu)造函數(shù)了。由于沒有傳入變量,在調(diào)用的構(gòu)造函數(shù)時(shí),會(huì)出錯(cuò)這個(gè)問題可以通過一個(gè)空對象來解決改自。 showImg(https://segmentfault.com/img/bVmNZj); 對于 OO 語言,有一句話叫Everything is object,雖然 Ja...
摘要:前端日報(bào)精選變量聲明與賦值值傳遞淺拷貝與深拷貝詳解淺談自適應(yīng)學(xué)習(xí)比你想象的要簡單常見排序算法之實(shí)現(xiàn)世界萬物誕生記中文深入理解筆記與異步編程譯不可變和中的知乎專欄譯怎樣避免開發(fā)時(shí)的深坑瘋狂的技術(shù)宅在翻譯網(wǎng)格布局掘金詳解改變模糊度亮 2017-08-15 前端日報(bào) 精選 ES6 變量聲明與賦值:值傳遞、淺拷貝與深拷貝詳解淺談web自適應(yīng)學(xué)習(xí) React.js 比你想象的要簡單常見排序算法之...
閱讀 2284·2023-04-25 16:42
閱讀 1198·2021-11-22 14:45
閱讀 2329·2021-10-19 13:10
閱讀 2821·2021-09-29 09:34
閱讀 3398·2021-09-23 11:21
閱讀 2094·2021-08-12 13:25
閱讀 2176·2021-07-30 15:15
閱讀 3488·2019-08-30 15:54