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