摘要:你不知道的系列第二章值值數組里面的數組可以容納任何類型的值。數字中,沒有真正意義上的整數,目前只有數字類型。較小的數值二進制浮點數最大的問題從數學的角度來說,此處應該是,但是二進制浮點數中與并不是十分準確,他們相加等于,所以結果為。
你不知道的JavaScript系列---第二章:值
值 2.1 數組JavaScript里面的數組可以容納任何類型的值。
"稀疏"數組(含有空白或空缺單元的數組)
var a = [] a[0] = 1 a[2] = [3] a[1] // undefined a.length // 3
其中,a[1]被隱式賦值為undefined
索引
數組通過數字進行索引,但JavaScript中的數組也是對象,也可以通過字符串鍵值進行索引(但不計算在數組長度內)
var a = [] a[0] = 1 a["foobar"] = 2 a.length // 1 a["foobar"] // 2 a.foobar // 2
當字符串鍵值可以強制性轉換為十進制數字的話,它就會被當做數字索引處理
var a = [] a["12"] = 1 a.length // 13
當然我們不建議這么做(在數組中加入字符串鍵值/屬性),通常要存放字符串鍵值/屬性,盡量使用對象,數組存放數字索引值
類數組
即一系列通過數字索引的值,如:es6之前的arguments對象(類數組),可以通過工具函數將它轉換為真正的數組
function foo () { var arr = Array.prototype.slice.call(arguments) arr.push("amm") console.log(arr) } foo("foo","bar") // ["foo","bar","amm"]
ES6中的Array.from(...)也可以實現同樣功能
... var arr = Array.from(arguments) ...2.2 字符串
字符串經常被當成字符數組,但它與數組又有極大的不同,我感覺連類數組也算不上,只是看上去相似而已。
例如下面兩個值
var a = "foo" var b = ["f","o","o"]
但是它們兩的確很相似,都有length屬性,indexOf(...)以及concat(...)方法
a.length // 3 b.length // 3 a.indexOf("o") // 1 b.indexOf("o") // 1 var c = a.concat("bar") // foobar var d = b.concat(["b","a","r"]) // ["f","o","o","b","a","r"] a === c // false b === d // false a // foo b // ["f","o","o"]
但是它們又有很多不同
a[1] = "O" b[1] = "0" a // foo b // ["f","O","o"]
在JavaScript中,字符串是不可變的,數組可變,并且a[1]并不是合法語法(老版本IE不支持),正確的應該是a.charAt(1)
字符串不可變是指字符串的成員函數不會改變其原始值,而是創建并返回一個新的字符串,而數組的成員函數都是在其原始值上進行操作。
var c = a.toUpperCase() a === c // fasle a // foo c // FOO b.push("!") b // ["f","o","o", "!"]2.3 數字
JavaScript中,沒有真正意義上的整數,目前只有數字類型(number)。
2.3.1 較小的數值二進制浮點數最大的問題:
0.1 + 0.2 === 0.3 // false
從數學的角度來說,此處應該是true,但是二進制浮點數中0.1與0.2并不是十分準確,他們相加等于0.30000000000000004,所以結果為false。
那么我們如何來判斷0.1 + 0.2 和 0.3 是否相等呢?
最常見的方法是設置一個機器誤差,對于JavaScript中的數字來說,這個值通常是2^-52.
從ES6開始,該值定義在Number.EPSILON中,在指定誤差范圍內,比較兩個數是否相等:
function numbersCloseEnoughEqual(n1, n2) { return Math.abs( n1 - n2 ) < Number.EPSILON } const a = 0.1 + 0.2 const b = 0.3 numbersCloseEnoughEqual(a, b) // true numbersCloseEnoughEqual(0.0000001, 0.0000002)2.3.2 特殊數值
JavaScript中有幾個特殊的值,需要開發者特別注意和小心使用。
不是數字的數字
NaN:not a number(不是一個數字:無效數值、失敗數值、壞數值)
const a = 2 / "foo" // NaN typeOf a === number // true
在這里NaN是指執行數學運算沒有成功,這是失敗后返回的結果
也許你會認為,判斷一個數字是否是NaN,只需要將它與NaN作比較就行,如:
2 / "foo" === NaN //false
NaN是一個特殊值,它與自身不相等,唯一一個非自反(x === x 不成立)的值。而
NaN != NaN 為 true。
那么我們可以使用工具函數Number.isNaN(...)來判斷一個值是否是NaN。
零值
JavaScript中有一個常規的0和一個-0
var a = 0 / -1 // -0 var b = 0 * -3 // -0
加減法不會得到-0
那么如何區分他們呢?
function isNegZero(n) { n= Number(n) return (n === 0) && (1 / n === -Infinity) } isNegZero(-0) // true isNegZero(0 / -2) // true isNegZero(0) //false
Infinity:無窮數
那么為什么要存在一個-0?有些應用程序中的數據需要以級數形式來表示(如動畫幀的移動速度),數字的符號位代表特殊信息(如移動的方向)
對于賦值與參數的傳遞可以通過對值復制,或者引用復制來完成,取決于具體的語法。
那么在JavaScript中,我們看一個例子:
var a = 2 var b = a // b 是 a 的一個副本 b ++ a // 2 b // 3 var c = [1, 2, 3] var d = c // d 是 [1, 2, 3] 的一個引用 d.push(4) c // [1, 2, 3, 4] d // [1, 2, 3, 4]
簡單值(基本類型)總是用過值復制的方式賦值/傳遞
復合值————對象和函數,則是通過引用復制的方式來復制/傳遞
在JavaScript中,引用指向的是值本身而非變量,所以一個引用無法改變另一個引用的指向:
var a = [1,2,3] var b = a a // [1,2,3] b // [1,2,3] // 然后 b = [4,5,6] a // [1,2,3] b // [4,5,6]
b=[4,5,6]并不影響a的指向[1,2,3],除非b指向的是a的指針,但JavaScript中不存在指針,就不存在這個情況!
那么下列情況,你也許也會明白了:
function foo(x){ x.push(4) x // [1,2,3,4] x = [4,5,6] x.push(7) x // [4,5,6,7] } var a = [1,2,3] foo(a) a // [1,2,3,4]
在函數參數傳遞時,實際上是將a的引用的一個復制品賦值給x,通過復制的引用即x更改數組的值,也會影響到a,所以a被改變為[1,2,3,4],但是將x指向到另一個引用[4,5,6],是不會影響到a的指向的,所以a還是[1,2,3,4]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94990.html
摘要:強制類型轉換本章介紹了的數據類型之間的轉換即強制類型轉換包括顯式和隱式。強制類型轉換常常為人詬病但實際上很多時候它們是非常有用的。隱式強制類型轉換則沒有那么明顯是其他操作的副作用。在處理強制類型轉換的時候要十分小心尤其是隱式強制類型轉換。 前言 《你不知道的 javascript》是一個前端學習必讀的系列,讓不求甚解的JavaScript開發者迎難而上,深入語言內部,弄清楚JavaSc...
摘要:這時候控制臺看到的是對象的快照,然而點開看詳情的話是這段代碼在運行的時候,瀏覽器可能會認為需要把控制臺延遲到后臺,這種情況下,等到瀏覽器控制臺輸出對象內容時,可能已經運行,因此會在點開的時候顯示,這是的異步化造成的。 本書屬于基礎類書籍,會有比較多的基礎知識,所以這里僅記錄平常不怎么容易注意到的知識點,不會全記,供大家和自己翻閱; 上中下三本的讀書筆記: 《你不知道的JavaScri...
下一篇:《你不知道的javascript》筆記_對象&原型 寫在前面 上一篇博客我們知道詞法作用域是由變量書寫的位置決定的,那this又是在哪里確定的呢?如何能夠精準的判斷this的指向?這篇博客會逐條闡述 書中有這樣幾句話: this是在運行時進行綁定的,并不是在編寫時綁定,它的上下文取決于函數調用時的各種條件this的綁定和函數聲明的位置沒有任何關系,只取決于函數的調用方式當一個函數被調用時...
摘要:你不知道的系列第一章類型類型一中的類型中的變量是不存在類型的,只有具體的值才有類型。 你不知道的JavaScript系列---第一章:類型 類型 一、JavaScript中的類型 JavaScript中的變量是不存在類型的,只有具體的值才有類型。 Js不像其他高級語言,如java等,聲明了一個int類型的變量,就必須存放int類型的值,Js中的變量可以存放其允許的所有類型的值,如: ...
摘要:第三章原生函數有很多原生函數,為基本的數據類型值提供了封裝對象,,,等。我們可以通過來查看所有返回的對象的內置屬性這個屬性無法直接訪問。這個符號能有奇妙的功能,可以視為。通常用來把轉換為數字,用來將轉換為字符串,用來將取整。 第三章 原生函數JS有很多原生函數,為基本的數據類型值提供了封裝對象,String,Number,Boolean等。我們可以通過{}.call.toStri...
閱讀 1225·2021-11-11 16:54
閱讀 1738·2021-10-13 09:40
閱讀 933·2021-10-08 10:05
閱讀 3498·2021-09-22 15:50
閱讀 3701·2021-09-22 15:41
閱讀 1782·2021-09-22 15:08
閱讀 2338·2021-09-07 10:24
閱讀 3571·2019-08-30 12:52