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