成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

那些被遺忘的javascript細(xì)節(jié)

CoyPan / 1216人閱讀

摘要:第一章變量?jī)?nèi)置類型空值未定義布爾值數(shù)字字符串對(duì)象符號(hào)新增正確的返回結(jié)果應(yīng)該是但這個(gè)由來(lái)已久在中已經(jīng)存在了將近年也許永遠(yuǎn)也不會(huì)修復(fù)因?yàn)檫@涉及太多現(xiàn)有的系統(tǒng)修復(fù)它會(huì)產(chǎn)生更多的是基本類型中唯一的假值函數(shù)是的一個(gè)內(nèi)置函數(shù)實(shí)際上是的一個(gè)子類型函數(shù)是

Author: bugall
Wechat: bugallF
Email: [email protected]
Github: https://github.com/bugall

第一章-變量
1.內(nèi)置類型
 空值(null)
 未定義(undefined)
 布爾值(boolean)
 數(shù)字(number)
 字符串(string)
 對(duì)象(object)
 符號(hào)(symbol,ES6新增)
2.null==="object"
typeof null === "object" //true

    正確的返回結(jié)果應(yīng)該是"null",但這個(gè)bug由來(lái)已久,
在javascript中已經(jīng)存在了將近20年,也許永遠(yuǎn)也不會(huì)修復(fù)
因?yàn)檫@涉及太多現(xiàn)有的web系統(tǒng),修復(fù)它會(huì)產(chǎn)生更多的bug
3.null是基本類型中唯一的假值
var a = null;
(!a && typeof a === "object"); //true
4.function(函數(shù))是javascript的一個(gè)內(nèi)置函數(shù)
實(shí)際上function是object的一個(gè)“子類型”,
函數(shù)是"可調(diào)用對(duì)象",它有一個(gè)內(nèi)部屬性[[Call]],
該屬性使其可以被調(diào)用
5.數(shù)組是對(duì)象,是object的一個(gè)子類型
typeof [1,2,3] === "object"; //true
6.javascript中的變量沒(méi)有類型,只有值才有類型
變量可以隨時(shí)持有任何類型的值
7.undefined與undeclared
變量在作用域中聲明但是沒(méi)有復(fù)制為"undefined",
變量在作用域中未聲明"undeclared"
第二章-值
1.數(shù)組可以容納任意類型的值
2.delete操作后不會(huì)影響數(shù)組的長(zhǎng)度
使用delete運(yùn)算符可以將單元從數(shù)組中刪除,
但是單元?jiǎng)h除后數(shù)組的length屬性并不會(huì)發(fā)生變化
3.稀疏數(shù)組的length受最大值影響
var a = [];
a[0] = 1;
a[2] = 3;
a[1]; //undefined
a.length; //3
4.數(shù)組中數(shù)字和字符作為索引時(shí),數(shù)組長(zhǎng)度只統(tǒng)計(jì)數(shù)字部分
var a = [];
a[0] = 1;
a["bugall"] = 2;
a.length; //1
a["bugall"] = 2;
a.bugall = 2;
5.如果字符串鍵值能夠被強(qiáng)制類型轉(zhuǎn)換為十進(jìn)制數(shù)字的話,
它會(huì)被當(dāng)做數(shù)組索引處理
var a = [];
a["13"] = 42;
a.length; //14
6.javascript只有一種數(shù)值類型:number
javascript中的數(shù)字類型是基于IEEE 754標(biāo)準(zhǔn)實(shí)現(xiàn)的,
該標(biāo)準(zhǔn)通常也被稱為“浮點(diǎn)數(shù)”,javascript使用的是
"雙精度"格式64位二進(jìn)制
7.42.toFixed(2) //SyntaxError
42..toFixed(2) = 42.00,42.toFixed(2)
是無(wú)效語(yǔ)法,因?yàn)?被視為常量42.的一部分
8.0.1+0.2 === 0.3 //false
二進(jìn)制浮點(diǎn)數(shù)中0.1和0.2并不是十分精確,它們相加的結(jié)果并非剛好等于0.3,而是一個(gè)
非常接近的數(shù)字0.3000000000000000002
9. 如何判斷兩個(gè)小數(shù)是否相等
function numbersCloseEnoughToEqual(n1,n2){
    return Math.abs(n1-n2)
10. 整數(shù)的安全范圍
數(shù)字的呈現(xiàn)方式?jīng)Q定了“整數(shù)”的安全值范圍遠(yuǎn)遠(yuǎn)小于
Number.MAX_VALUE,最大是2^53-1
11. 整形檢測(cè)
Number.isInterger(42) //true
Number.isInterger(42.000) //true
Number.isInterger(42.001) //false
12.不是值的值
undefined類型只有一個(gè)值,即undefined,
null類型也只有一個(gè)值,即null,它們的名稱是類型也是值
13.不是數(shù)字的數(shù)字
如果數(shù)學(xué)運(yùn)算的操作不是數(shù)字類型,就無(wú)法返回一
個(gè)有效的數(shù)字,這種情況下返回值為NaN
var a = 2 / "foo"  //NaN
typeof a === "number"  //true
NaN是執(zhí)行數(shù)學(xué)運(yùn)算沒(méi)有成功返回的結(jié)果,
NaN是一個(gè)特殊值,它和自身不相等,是唯一一個(gè)非自反的值
NaN != NaN //true
14. isNaN理解為is not a number || is NaN
前者一直是我錯(cuò)誤的理解,正確的理解應(yīng)該是is NaN,
判斷數(shù)學(xué)運(yùn)算是否錯(cuò)誤,返回錯(cuò)誤的值
var a = 2 / "foo"
var b = "foo"
a; //NaN
b; //"foo"
isNaN(a) //true
isNaN(b) //true
這是不同的結(jié)果,一個(gè)是運(yùn)算出錯(cuò),一個(gè)是字符串
代碼中盡可能得少出現(xiàn)isNaN()
15. 簡(jiǎn)單值都是通過(guò)值類型傳遞
null,undefined,string,number,boolean
16. 復(fù)合類型-對(duì)象都是通過(guò)引用傳遞
我們無(wú)法更改使用值傳遞還是引用傳遞,一切根據(jù)值的類型確定
第三章 對(duì)象
1. 匿名還是在堆棧追蹤中不會(huì)顯示出有意義的函數(shù)名,使的調(diào)試很困難
2. 函數(shù)聲明,與函數(shù)表達(dá)式
    function a(){...} //函數(shù)聲明
    var a = function(){...} //函數(shù)表達(dá)式
2. 立即執(zhí)行函數(shù)表達(dá)式
(function foo(){
    var a=3;
    console.log(a) //3
})()
由于函數(shù)被包含在一對(duì)()括號(hào)內(nèi)部,因此成為一個(gè)函數(shù)表達(dá)式,
通過(guò)在末尾加上另一個(gè)()可以立即執(zhí)行這個(gè)函數(shù)。
第一個(gè)()將函數(shù)變成表達(dá)式
3. 變量聲明應(yīng)該距離使用的地方越近越好
4. 最小力度的作用域,最小的作用域氣泡原則
5. 變量提升
console.log(a) //undefined
var a = 3;
console.log(a) //3
6. 使用var定義變量的時(shí)候,它寫(xiě)在哪里都是一樣的,因?yàn)樗鼈冏罱K都會(huì)屬于外部作用域
console.log(a) //undefined
if(false){
    var a = 3;
}
7. 使用let進(jìn)行聲明不會(huì)在塊作用域中進(jìn)行提升
{
    console.log(a) //ReferenceError
    var a = 3
    console.log(a) //3
}
8. 任何聲明在某個(gè)作用域內(nèi)的變量,都將附屬與這個(gè)作用域
9. 函數(shù)聲明會(huì)被提升,但是函數(shù)表達(dá)式不會(huì)被提升
foo() //bugall
function foo(){
    console.log("bugall")
}

a() // ReferenceError
var a = foo(){
    console.log("bugall")
}
10. 函數(shù)聲明和變量聲明都會(huì)被提升,但是函數(shù)會(huì)首先被提升,然后才是變量
11. 閉包可以組織GC回收(GC的回收機(jī)制采用引用計(jì)數(shù))
function a(){
    var n = "bugall"
    function b(){
        console.log(n)
    }
    return b
}
foo() //"bugall"
以為b()覆蓋了a()里的變量n,所以a的資源就無(wú)法釋放,而這個(gè)引用就叫做閉包
12. 作用域是基于調(diào)用棧的,而不是代碼中得作用域嵌套
13. 箭頭函數(shù)用當(dāng)前的詞法作用域覆蓋了this得本來(lái)結(jié)構(gòu)
var obj = {
    name = "bugall",
    sayName = function(){
        console.log(this.name)
    })
}
var name = "not bugall"
obj.cool() //bugall ,this的作用域是obj對(duì)象
setTimeount(obj.cool,100) //not bugall,this變成了當(dāng)前作用域

用this的形式
var obj = {
    name = "bugall",
    sayName = function(()=>{
        console.log(this.name)
    })
}
var name = "not bugall"
obj.cool() //bugall ,this的詞法作用域是obj
setTimeount(obj.cool,100) //bugall, this的詞法作用域沒(méi)有變
14. 匿名函數(shù)無(wú)法指向自身
function foo(){
    foo.count = 4; //foo指向自身
}

setTimeout(function(){
    //匿名函數(shù)因?yàn)闆](méi)有名字,無(wú)法指定在堆棧上得確定位置,所以不能引用自身
})
15. 函數(shù)的this默認(rèn)綁定是全局
function foo(){
    console.log(this.a)
}
var a = 2
foo() //2
16. 使用嚴(yán)格模式下,不能使用全局對(duì)象用于默認(rèn)綁定
function foo(){
    "use strict"
    console.log(this.a)
}
var a = 2
foo() //TypeError: this is undefined
17. 對(duì)象引用鏈中,只有最后一層在調(diào)用位置中起作用
function foo(){
    console.log(this.a)
}
var obj2 = {
    a:42,
    foo:foo
}
var obj1 = {
    a:2,
    obj2:obj2
}
obj1.obj2.foo() //42
18. call || apply實(shí)現(xiàn)this的顯示綁定
function foo(){
    console.log(this.a)
}
var obj = {
    a:2
}
foo.call(obj) //2
我們?cè)谡{(diào)用foo的時(shí)候強(qiáng)制把它的this綁定到obj上
19. bind 返回一個(gè)硬編碼的新函數(shù)
function foo(something){
    console.log(this.a,somethis)
    return this.a + something
}
var obj = {
    a:2
}
var bar = foo.bind(obj)
var b = bar(3) // 2 3
console.log(b) //5
bind(...)會(huì)返回一個(gè)硬編碼的新函數(shù),
它會(huì)把你指定的參數(shù)設(shè)置為this的上下文并調(diào)用原始函數(shù)
20. javascript中的new
在javascript中,構(gòu)造函數(shù)只是一些使用new操作符
時(shí)被調(diào)用的函數(shù),他們并不會(huì)屬于某個(gè)類,也不會(huì)實(shí)例化一個(gè)類,
實(shí)際上它們甚至都不能說(shuō)是一個(gè)特殊的函數(shù)類型,他們只是
被new操作符調(diào)用的普通函數(shù)而已。
使用new來(lái)調(diào)用函數(shù)的時(shí)候,會(huì)自動(dòng)執(zhí)行下面的操作
1. 創(chuàng)建(或者說(shuō)構(gòu)造)一個(gè)全新的對(duì)象
2. 這個(gè)新對(duì)象會(huì)被執(zhí)行[[prototype]]連接
3. 這個(gè)新對(duì)象會(huì)被綁定到函數(shù)調(diào)用的this
4. 如果函數(shù)沒(méi)有返回其他對(duì)象,那么new表達(dá)式中的函數(shù)調(diào)用會(huì)自動(dòng)返回這個(gè)新對(duì)象
function foo(a){
    this.a=a
}
var bar = new foo(2)
console.log(bar.a) //2
21. 隱式綁定與顯示綁定,顯示綁定優(yōu)先級(jí)最高
function foo(){
    console.log(this.a)
}
var obj1 = {
    a:2,
    foo:foo
}
var obj2 = {
    a:3,
    foo:foo
}
obj1.foo() //2
obj2.foo() //3
obj1.foo.call(obj2) //3
obj2.foo.call(obj1) //2
22. new綁定與隱式綁定,new綁定優(yōu)先級(jí)高于隱式綁定
function foo(somethis){
    this.a = somethis
}
var obj1 = {
    foo:foo
}
var obj2 = {}
obj1.foo(2)
console.log(obj1.a)//2

obj1.foo.call(obj2,3)
console.log(obj2.a) //3

var bar = new obj1.foo(4)
console.log(obj1.a) //2
console.log(bar.a) //4
bar被綁定到obj1上,但是new bar(3)并沒(méi)有像我們預(yù)期的那樣把obj1.a修改為3
相反,new修改了硬綁定(到obj1的)調(diào)用bar(...)中的this,因?yàn)槭褂昧薾ew綁定得到
一個(gè)名字為baz的新對(duì)象,并且baz.a的值是3
23. call apply bind的區(qū)別
call,apply屬于顯示綁定
bind屬于硬綁定,硬綁定屬于顯示綁定的一種

24. 硬綁定的缺點(diǎn)
硬綁定會(huì)降低函數(shù)的靈活性,使用硬綁定之后就
無(wú)法使用隱式綁定或是顯式綁定來(lái)修改this
25. 如果判斷this綁定
1. 函數(shù)是否在new中調(diào)用(new綁定),如果是的話this綁定的是新創(chuàng)建的對(duì)象
var bar = new foo()

2. 函數(shù)是否通過(guò)call,apply(顯示綁定)或者硬綁定調(diào)用,
如果是的話,this綁定的是指定的對(duì)象
var bar = foo.call(obj2)

3. 函數(shù)是否在某個(gè)上下文對(duì)象中調(diào)用(隱式綁定),如果是的話,this綁定的是那個(gè)上下文對(duì)象
var var = obj1.foo()

4. 如果都不是的話,使用默認(rèn)綁定,如果在嚴(yán)格模式下,就綁定到undefined,否則綁定到全局對(duì)象
var bar = foo()
25. 當(dāng)null,undefined作為this的綁定對(duì)象傳入call,apply,bind的時(shí)候,實(shí)際應(yīng)用的是默認(rèn)綁定

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91193.html

相關(guān)文章

  • 〔總結(jié)〕容易遺忘JS知識(shí)點(diǎn)整理

    摘要:命名函數(shù)的賦值表達(dá)式另外一個(gè)特殊的情況是將命名函數(shù)賦值給一個(gè)變量。這是由于的命名處理所致,函數(shù)名在函數(shù)內(nèi)總是可見(jiàn)的。當(dāng)需要向回調(diào)函數(shù)傳遞參數(shù)時(shí),可以創(chuàng)建一個(gè)匿名函數(shù),在函數(shù)內(nèi)執(zhí)行真實(shí)的回調(diào)函數(shù)。 1.hasOwnProperty相關(guān) 為了判斷一個(gè)對(duì)象是否包含自定義屬性而不是原型鏈上的屬性,我們需要使用繼承自 Object.prototype 的 hasOwnProperty方法。has...

    explorer_ddf 評(píng)論0 收藏0
  • “信息瓶頸”理論揭示深度學(xué)習(xí)本質(zhì),Hinton說(shuō)他要看1萬(wàn)遍

    摘要:認(rèn)為,深度神經(jīng)網(wǎng)絡(luò)根據(jù)一種被稱為信息瓶頸的過(guò)程在學(xué)習(xí),他和兩位合作者最早在年對(duì)這一過(guò)程進(jìn)行了純理論方面的描述。另外一些研究人員則持懷疑態(tài)度,認(rèn)為信息瓶頸理論不能完全解釋深學(xué)習(xí)的成功。 利用深度神經(jīng)網(wǎng)絡(luò)的機(jī)器已經(jīng)學(xué)會(huì)了交談、開(kāi)車(chē),在玩視頻游戲和下圍棋時(shí)擊敗了世界冠軍,還能做夢(mèng)、畫(huà)畫(huà),幫助進(jìn)行科學(xué)發(fā)現(xiàn),但同時(shí)它們也深深地讓其發(fā)明者困惑,誰(shuí)也沒(méi)有料到所謂的深度學(xué)習(xí)算法能做得這么好。沒(méi)有基本的原則指...

    wuyumin 評(píng)論0 收藏0
  • 難以置信!LSTM和GRU解析從未如此清晰

    摘要:作為解決方案的和和是解決短時(shí)記憶問(wèn)題的解決方案,它們具有稱為門(mén)的內(nèi)部機(jī)制,可以調(diào)節(jié)信息流。隨后,它可以沿著長(zhǎng)鏈序列傳遞相關(guān)信息以進(jìn)行預(yù)測(cè),幾乎所有基于遞歸神經(jīng)網(wǎng)絡(luò)的技術(shù)成果都是通過(guò)這兩個(gè)網(wǎng)絡(luò)實(shí)現(xiàn)的。和采用門(mén)結(jié)構(gòu)來(lái)克服短時(shí)記憶的影響。 短時(shí)記憶RNN 會(huì)受到短時(shí)記憶的影響。如果一條序列足夠長(zhǎng),那它們將很難將信息從較早的時(shí)間步傳送到后面的時(shí)間步。 因此,如果你正在嘗試處理一段文本進(jìn)行預(yù)測(cè),RNN...

    MrZONT 評(píng)論0 收藏0
  • 知其所以然之永不遺忘算法

    摘要:也就是說(shuō)我們只是知其然,并沒(méi)有知其所以然。相反,那些牛人就不會(huì)忘記自己設(shè)計(jì)的算法。劉未鵬在知其所以然三為什么算法這么難中探索了編碼的思維歷程,值得一看。之后,將當(dāng)前入棧,更新棧內(nèi)的遞增序列。 原文地址 相信大部分同學(xué)曾經(jīng)都學(xué)習(xí)過(guò)快速排序、Huffman、KMP、Dijkstra等經(jīng)典算法,初次學(xué)習(xí)時(shí)我們驚嘆于算法的巧妙,同時(shí)被設(shè)計(jì)者的智慧所折服。于是,我們仔細(xì)研讀算法的每一步,甚至去證...

    B0B0 評(píng)論0 收藏0
  • 深度學(xué)習(xí):遠(yuǎn)非人工智能全部和未來(lái)

    摘要:絕大多數(shù)人忽略了深度學(xué)習(xí)只占機(jī)器學(xué)習(xí)領(lǐng)域的,而機(jī)器學(xué)習(xí)又只占到了人工智能領(lǐng)域的。一個(gè)深度學(xué)習(xí)專家無(wú)法與人工智能專家劃上等號(hào)。但是,深度學(xué)習(xí)并不是人類可以創(chuàng)造的人工智能科技的終點(diǎn)。深度學(xué)習(xí)的公正性并非來(lái)自其自身,而是人類篩選和準(zhǔn)備的數(shù)據(jù)。 人工智能的這一波熱潮毫無(wú)疑問(wèn)是由深度學(xué)習(xí)引發(fā)的,自吳恩達(dá)等人 2011 年發(fā)表「識(shí)別貓」研究后,深度學(xué)習(xí)及其引發(fā)的技術(shù)已經(jīng)在圖像識(shí)別、游戲等任務(wù)中超越人類,...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<