成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

你不知道的JavaScript :值

0x584a / 2833人閱讀

摘要:你不知道的系列第二章值值數(shù)組里面的數(shù)組可以容納任何類(lèi)型的值。數(shù)字中,沒(méi)有真正意義上的整數(shù),目前只有數(shù)字類(lèi)型。較小的數(shù)值二進(jìn)制浮點(diǎn)數(shù)最大的問(wèn)題從數(shù)學(xué)的角度來(lái)說(shuō),此處應(yīng)該是,但是二進(jìn)制浮點(diǎn)數(shù)中與并不是十分準(zhǔn)確,他們相加等于,所以結(jié)果為。

你不知道的JavaScript系列---第二章:值

2.1 數(shù)組

JavaScript里面的數(shù)組可以容納任何類(lèi)型的值。

"稀疏"數(shù)組(含有空白或空缺單元的數(shù)組)

var a = []
a[0] = 1
a[2] = [3]
a[1] // undefined
a.length // 3

其中,a[1]隱式賦值為undefined

索引
數(shù)組通過(guò)數(shù)字進(jìn)行索引,但JavaScript中的數(shù)組也是對(duì)象,也可以通過(guò)字符串鍵值進(jìn)行索引(但不計(jì)算在數(shù)組長(zhǎng)度內(nèi))

var a = []
a[0] = 1
a["foobar"] = 2

a.length // 1
a["foobar"] // 2
a.foobar // 2

當(dāng)字符串鍵值可以強(qiáng)制性轉(zhuǎn)換為十進(jìn)制數(shù)字的話(huà),它就會(huì)被當(dāng)做數(shù)字索引處理

var a = []
a["12"] = 1
a.length // 13

當(dāng)然我們不建議這么做(在數(shù)組中加入字符串鍵值/屬性),通常要存放字符串鍵值/屬性,盡量使用對(duì)象,數(shù)組存放數(shù)字索引值

類(lèi)數(shù)組
即一系列通過(guò)數(shù)字索引的值,如:es6之前的arguments對(duì)象(類(lèi)數(shù)組),可以通過(guò)工具函數(shù)將它轉(zhuǎn)換為真正的數(shù)組

function foo () {
    var arr = Array.prototype.slice.call(arguments)
    arr.push("amm")
    console.log(arr)
}
foo("foo","bar") // ["foo","bar","amm"]

ES6中的Array.from(...)也可以實(shí)現(xiàn)同樣功能

...
var arr = Array.from(arguments)
...

2.2 字符串

字符串經(jīng)常被當(dāng)成字符數(shù)組,但它與數(shù)組又有極大的不同,我感覺(jué)連類(lèi)數(shù)組也算不上,只是看上去相似而已。
例如下面兩個(gè)值

var a = "foo"
var b = ["f","o","o"]

但是它們兩的確很相似,都有l(wèi)ength屬性,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中,字符串是不可變的,數(shù)組可變,并且a[1]并不是合法語(yǔ)法(老版本IE不支持),正確的應(yīng)該是a.charAt(1)
字符串不可變是指字符串的成員函數(shù)不會(huì)改變其原始值,而是創(chuàng)建并返回一個(gè)新的字符串,而數(shù)組的成員函數(shù)都是在其原始值上進(jìn)行操作。

var c = a.toUpperCase()
a === c // fasle
a // foo
c // FOO

b.push("!")
b // ["f","o","o", "!"]
2.3 數(shù)字

JavaScript中,沒(méi)有真正意義上的整數(shù),目前只有數(shù)字類(lèi)型(number)。

2.3.1 較小的數(shù)值

二進(jìn)制浮點(diǎn)數(shù)最大的問(wèn)題:

0.1 + 0.2 === 0.3 // false

從數(shù)學(xué)的角度來(lái)說(shuō),此處應(yīng)該是true,但是二進(jìn)制浮點(diǎn)數(shù)中0.1與0.2并不是十分準(zhǔn)確,他們相加等于0.30000000000000004,所以結(jié)果為false。
那么我們?nèi)绾蝸?lái)判斷0.1 + 0.2 和 0.3 是否相等呢?
最常見(jiàn)的方法是設(shè)置一個(gè)機(jī)器誤差,對(duì)于JavaScript中的數(shù)字來(lái)說(shuō),這個(gè)值通常是2^-52.
ES6開(kāi)始,該值定義在Number.EPSILON中,在指定誤差范圍內(nèi),比較兩個(gè)數(shù)是否相等:

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 特殊數(shù)值

JavaScript中有幾個(gè)特殊的值,需要開(kāi)發(fā)者特別注意和小心使用。

不是數(shù)字的數(shù)字
NaN:not a number(不是一個(gè)數(shù)字:無(wú)效數(shù)值、失敗數(shù)值、壞數(shù)值)

const a = 2 / "foo" // NaN
typeOf a === number // true

在這里NaN是指執(zhí)行數(shù)學(xué)運(yùn)算沒(méi)有成功,這是失敗后返回的結(jié)果
也許你會(huì)認(rèn)為,判斷一個(gè)數(shù)字是否是NaN,只需要將它與NaN作比較就行,如:

2 / "foo" === NaN //false

NaN是一個(gè)特殊值,它與自身不相等,唯一一個(gè)非自反(x === x 不成立)的值。而
NaN != NaNtrue
那么我們可以使用工具函數(shù)Number.isNaN(...)來(lái)判斷一個(gè)值是否是NaN。

零值
JavaScript中有一個(gè)常規(guī)的0和一個(gè)-0

var a = 0 / -1 // -0
var b = 0 * -3 // -0

加減法不會(huì)得到-0
那么如何區(qū)分他們呢?

function isNegZero(n) {
    n= Number(n)
    return (n === 0) && (1 / n === -Infinity)
}
isNegZero(-0) // true
isNegZero(0 / -2) // true
isNegZero(0) //false

Infinity:無(wú)窮數(shù)
那么為什么要存在一個(gè)-0?有些應(yīng)用程序中的數(shù)據(jù)需要以級(jí)數(shù)形式來(lái)表示(如動(dòng)畫(huà)幀的移動(dòng)速度),數(shù)字的符號(hào)位代表特殊信息(如移動(dòng)的方向)

2.4 值和引用

對(duì)于賦值與參數(shù)的傳遞可以通過(guò)對(duì)值復(fù)制,或者引用復(fù)制來(lái)完成,取決于具體的語(yǔ)法。
那么在JavaScript中,我們看一個(gè)例子:

var a = 2
var b = a // b 是 a 的一個(gè)副本
b ++
a // 2 
b // 3

var c = [1, 2, 3]
var d = c // d 是 [1, 2, 3] 的一個(gè)引用
d.push(4)
c // [1, 2, 3, 4]
d // [1, 2, 3, 4]

簡(jiǎn)單值(基本類(lèi)型)總是用過(guò)值復(fù)制的方式賦值/傳遞
復(fù)合值————對(duì)象和函數(shù),則是通過(guò)引用復(fù)制的方式來(lái)復(fù)制/傳遞


在JavaScript中,引用指向的是值本身而非變量,所以一個(gè)引用無(wú)法改變另一個(gè)引用的指向:

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中不存在指針,就不存在這個(gè)情況!


那么下列情況,你也許也會(huì)明白了:

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]

在函數(shù)參數(shù)傳遞時(shí),實(shí)際上是將a的引用的一個(gè)復(fù)制品賦值給x,通過(guò)復(fù)制的引用即x更改數(shù)組的值,也會(huì)影響到a,所以a被改變?yōu)?b>[1,2,3,4],但是將x指向到另一個(gè)引用[4,5,6],是不會(huì)影響到a的指向的,所以a還是[1,2,3,4]

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94990.html

相關(guān)文章

  • 精讀《你不知道javascript(中卷)》

    摘要:強(qiáng)制類(lèi)型轉(zhuǎn)換本章介紹了的數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換即強(qiáng)制類(lèi)型轉(zhuǎn)換包括顯式和隱式。強(qiáng)制類(lèi)型轉(zhuǎn)換常常為人詬病但實(shí)際上很多時(shí)候它們是非常有用的。隱式強(qiáng)制類(lèi)型轉(zhuǎn)換則沒(méi)有那么明顯是其他操作的副作用。在處理強(qiáng)制類(lèi)型轉(zhuǎn)換的時(shí)候要十分小心尤其是隱式強(qiáng)制類(lèi)型轉(zhuǎn)換。 前言 《你不知道的 javascript》是一個(gè)前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開(kāi)發(fā)者迎難而上,深入語(yǔ)言?xún)?nèi)部,弄清楚JavaSc...

    李世贊 評(píng)論0 收藏0
  • 你不知道JavaScript》 (中) 閱讀摘要

    摘要:這時(shí)候控制臺(tái)看到的是對(duì)象的快照,然而點(diǎn)開(kāi)看詳情的話(huà)是這段代碼在運(yùn)行的時(shí)候,瀏覽器可能會(huì)認(rèn)為需要把控制臺(tái)延遲到后臺(tái),這種情況下,等到瀏覽器控制臺(tái)輸出對(duì)象內(nèi)容時(shí),可能已經(jīng)運(yùn)行,因此會(huì)在點(diǎn)開(kāi)的時(shí)候顯示,這是的異步化造成的。 本書(shū)屬于基礎(chǔ)類(lèi)書(shū)籍,會(huì)有比較多的基礎(chǔ)知識(shí),所以這里僅記錄平常不怎么容易注意到的知識(shí)點(diǎn),不會(huì)全記,供大家和自己翻閱; 上中下三本的讀書(shū)筆記: 《你不知道的JavaScri...

    stackvoid 評(píng)論0 收藏0
  • 你不知道javascript》筆記_this

    下一篇:《你不知道的javascript》筆記_對(duì)象&原型 寫(xiě)在前面 上一篇博客我們知道詞法作用域是由變量書(shū)寫(xiě)的位置決定的,那this又是在哪里確定的呢?如何能夠精準(zhǔn)的判斷this的指向?這篇博客會(huì)逐條闡述 書(shū)中有這樣幾句話(huà): this是在運(yùn)行時(shí)進(jìn)行綁定的,并不是在編寫(xiě)時(shí)綁定,它的上下文取決于函數(shù)調(diào)用時(shí)的各種條件this的綁定和函數(shù)聲明的位置沒(méi)有任何關(guān)系,只取決于函數(shù)的調(diào)用方式當(dāng)一個(gè)函數(shù)被調(diào)用時(shí)...

    cpupro 評(píng)論0 收藏0
  • 你不知道JavaScript : 類(lèi)型

    摘要:你不知道的系列第一章類(lèi)型類(lèi)型一中的類(lèi)型中的變量是不存在類(lèi)型的,只有具體的值才有類(lèi)型。 你不知道的JavaScript系列---第一章:類(lèi)型 類(lèi)型 一、JavaScript中的類(lèi)型 JavaScript中的變量是不存在類(lèi)型的,只有具體的值才有類(lèi)型。 Js不像其他高級(jí)語(yǔ)言,如java等,聲明了一個(gè)int類(lèi)型的變量,就必須存放int類(lèi)型的值,Js中的變量可以存放其允許的所有類(lèi)型的值,如: ...

    史占廣 評(píng)論0 收藏0
  • 你不知道JavaScript(二)

    摘要:第三章原生函數(shù)有很多原生函數(shù),為基本的數(shù)據(jù)類(lèi)型值提供了封裝對(duì)象,,,等。我們可以通過(guò)來(lái)查看所有返回的對(duì)象的內(nèi)置屬性這個(gè)屬性無(wú)法直接訪(fǎng)問(wèn)。這個(gè)符號(hào)能有奇妙的功能,可以視為。通常用來(lái)把轉(zhuǎn)換為數(shù)字,用來(lái)將轉(zhuǎn)換為字符串,用來(lái)將取整。 第三章 原生函數(shù)JS有很多原生函數(shù),為基本的數(shù)據(jù)類(lèi)型值提供了封裝對(duì)象,String,Number,Boolean等。我們可以通過(guò){}.call.toStri...

    macg0406 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<