萌新HTML5 入門指南(二)
本文由葡萄城技術(shù)團隊原創(chuàng)并首發(fā)
上一篇我們已經(jīng)為大家介紹了HTML5新增的內(nèi)容和基礎(chǔ)頁面布局,這篇會繼續(xù)向大家介紹廣義上HTML5中另一個組成部分:JavaScript數(shù)據(jù)類型。
JavaScript作為一種弱類型語言,最大的特點就是動態(tài)類型。也就是說不用提前聲明變量的類型,在程序運行時,類型會被動態(tài)的確定,并且在執(zhí)行過程中可以動態(tài)的修改變量的類型。同時不同類型變量在運算時會自動進行隱式的類型轉(zhuǎn)換。以下是一些常見的隱式轉(zhuǎn)換示例:
var foo = 2020; // typeof foo -> "number" var foo = "SpreadJS" // typeof foo -> "string" var foo = true + 1; // foo = 2 typeof foo -> " number" var foo = true + false; // foo = 1 typeof foo -> " number" var foo = '5' - '2'; // foo = 3 typeof foo -> " number" var foo = 20 + 20 + "SpreadJS" // foo = "40SpreadJS" typeof foo -> "string" var foo = "SpreadJS" + 20 + 20 // foo = "40SpreadJS" typeof foo -> " string"
依據(jù)最新的 ECMAScript 標準將數(shù)據(jù)類型定義了 8 種:
其中為原始類型:Boolean、Null、Undefined、Number、BigInt、String、Symbol 和對象類型:object
關(guān)于原始類型需要知道的幾個知識點:
- 原始類型的值是按值訪問的
即在賦值和修改值時是通過值傳遞的方式來完成的,對變量賦值或者修改值會在內(nèi)存中重新分配空間。
例如:
var a, b, x, y; a = " SpreadJS"; b = " GrapeCity"; x = a; y = b; console.log(a, b, x, y); // result: SpreadJS GrapeCity SpreadJS GrapeCity
a和x, b和y之間賦值是完全獨立的拷貝,互不干涉,如果我們將其中任何一個變量的值重新改變,其他相同值的變量也不會受到任何影響。
- 嚴格相等===和非嚴格相等==
對于原始類型,==只進行值比較,如果是不同類型則會在轉(zhuǎn)換后再比較,===則會比較數(shù)據(jù)類型。
例如:
undefined === null //fasle undefined == null //true true === 1 //fasle true == 1 //true null == 0 //false
- Null 和 Undefined
null和undefined在使用中幾乎沒有區(qū)別,在使用非嚴格相等比較時結(jié)果也為true,它們的區(qū)別就是在于進行數(shù)值轉(zhuǎn)換時它們的字面意義不同,undefined代表未定義,轉(zhuǎn)為數(shù)值為NaN,而null為空、轉(zhuǎn)為數(shù)值時為0。
例如:
Number(undefined) //NaN Number(null) //0 1 + undefined //NaN 1 + null //1
雖然兩者差別不大,并不會嚴格按照上面的區(qū)分去使用,但在實際項目應(yīng)用中,對于空值的判斷兩者則都需要考慮。
- NaN
NaN 即 Not a Number ,表示了非數(shù)字類型,任何和NaN的操作返回值都是NaN,NaN不等于NaN。其中有一個全局方法 isNaN(),它的作用是檢查一個值是否能被 Number() 成功轉(zhuǎn)換。 如果能轉(zhuǎn)換成功,就返回 false,否則返回 true 。
例如:
NaN == NaN; // fasle
isNaN('123') // false 能轉(zhuǎn)換
isNaN('abc') // true 不能轉(zhuǎn)換
- 浮點數(shù)精度誤差
在JavaScript中,整數(shù)和浮點數(shù)都屬Number數(shù)據(jù)類型,所有數(shù)字都是以64位浮點數(shù)形式存儲的,也就是說JavaScript底層沒有整數(shù),1和1.0是相同的。
下面舉幾個例子來說明:
// 加法 0.1 + 0.2 = 0.30000000000000004 0.1 + 0.7 = 0.7999999999999999 0.2 + 0.4 = 0.6000000000000001 // 減法 0.3 - 0.2 = 0.09999999999999998 1.5 - 1.2 = 0.30000000000000004 // 乘法 0.8 * 3 = 2.4000000000000004 19.9 * 100 = 1989.9999999999998 // 除法 0.3 / 0.1 = 2.9999999999999996 0.69 / 10 = 0.06899999999999999 // 比較 0.1 + 0.2 === 0.3 // false (0.3 - 0.2) === (0.2 - 0.1) // false
類似這樣看起來不會算錯的問題,在某些系統(tǒng)尤其是涉及財務(wù)的系統(tǒng)中會是一個嚴重的問題,這里就不展開解釋發(fā)生誤差的原因了,大家可自行研究,我們這只對解決方案簡單的列一下,1. 可以通過引用類似Math.js、decimal.js、big.js這樣的類庫。2.對于對數(shù)字精度要求不高的系統(tǒng),可以格式化并保留x位小數(shù)來處理。3. 計算時,將小數(shù)部分和整數(shù)部分分開計算再合并,等。
關(guān)于引用類型需要知道的幾個知識點:
- 引用類型的值是按引用訪問的
在操作對象時,實際上是在操作對象的引用而不是實際的對象。給變量賦值改變的是對象的引用關(guān)系。
例如:
var obj1 = {a:1};
var obj2 = obj1;
obj1.a = 2;
console.log(obj2.a) // result: 2.obj1和obj2為同一對象
obj1 = {a:3};
console.log(obj2.a) // result: 2.obj1指向新對象,obj2不變
- 引用類型===和==意義相同都為引用的比較
即是否為同一對象,各類型之間的非嚴格相等==比較類型轉(zhuǎn)換可參考下表
|
被比較值 B |
|||||||
|
Undefined |
Null |
Number |
String |
Boolean |
Object |
||
|
被比較值 A |
Undefined |
true |
true |
false |
false |
false |
IsFalsy(B) |
|
Null |
true |
true |
false |
false |
false |
IsFalsy(B) |
|
|
Number |
false |
false |
A === B |
A === ToNumber(B) |
A=== ToNumber(B) |
A== ToPrimitive(B) |
|
|
String |
false |
false |
ToNumber(A) === B |
A === B |
ToNumber(A) === ToNumber(B) |
ToPrimitive(B) == A |
|
|
Boolean |
false |
false |
ToNumber(A) === B |
ToNumber(A) === ToNumber(B) |
A === B |
ToNumber(A) == ToPrimitive(B) |
|
|
Object |
false |
false |
ToPrimitive(A) == B |
ToPrimitive(A) == B |
ToPrimitive(A) == ToNumber(B) |
A === B |
|
類型檢測
JavaScript中類型檢測方法有很多,有例如:typeof、instanceof、Object.prototype.toString、constructor、duck type這幾種。
雖然方法很多,但判斷思路就是兩種:1根據(jù)數(shù)據(jù)類型判斷 2 根據(jù)構(gòu)造函數(shù)判斷。
- typeof
typeof可以判斷數(shù)據(jù)類型,依據(jù)之前的介紹,javascript變量類型分為值類型和引用類型,typeof應(yīng)用場景只可以區(qū)分值類型的數(shù)據(jù)類型,例如:
typeof 42 // "number"
typeof {} // "object"
typeof undefined // " undefined"
- instanceof
和typeof一樣,instanceof用于判斷引用類型的數(shù)據(jù)類型。
例子:
(function(){}) instanceof Function
其他的還有Object.prototype.toString、constructor、duck type,在這就不一一介紹。
在了解了JavaScript的基礎(chǔ)數(shù)據(jù)類型知識后,后面我們會繼續(xù)為大家借著介紹CSS相關(guān)的內(nèi)容。
以上就是萌新HTML5 入門指南(二)的詳細內(nèi)容,更多關(guān)于萌新html5 入門的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
這篇文章主要介紹了給萌新的HTML5 入門指南,幫助萌新更好的理解和學(xué)習(xí)html5的相關(guān)知識,感興趣的朋友可以了解下2020-11-06
關(guān)于webview適配H5上傳照片或者視頻文件的方法
這篇文章主要介紹了關(guān)于webview適配H5上傳照片或者視頻文件的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小2020-11-04
腳本簡介HTML5文件上傳ui樣式特效是一款基于HTML5 SVG實現(xiàn)的文件上傳ui樣式特效,非常不錯,喜歡的朋友快來下載吧2020-11-03
這篇文章主要介紹了淺析HTML5 meta viewport參數(shù)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)HTML5,感興趣的朋友可以了解下2020-10-28
gsap基于svg制作輸入框郵箱號碼驗證,提交訂閱信封飛出表單ui特效,非常不錯喜歡的朋友快來下載源碼吧2020-10-26
這篇文章主要介紹了HTML5布局和HTML5標簽的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-26
這篇文章主要介紹了HTML5實現(xiàn)移動端點擊翻牌功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-23
html5 拖拽及用 js 實現(xiàn)拖拽功能的示例代碼
這篇文章主要介紹了html5 拖拽及用 js 實現(xiàn)拖拽,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-23
這篇文章主要介紹了html5小程序飛入購物車(拋物線繪制運動軌跡點),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著2020-10-19
這篇文章主要介紹了HTML5逐步分析實現(xiàn)拖放功能的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-30







