摘要:第一章變量?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
空值(null) 未定義(undefined) 布爾值(boolean) 數(shù)字(number) 字符串(string) 對(duì)象(object) 符號(hào)(symbol,ES6新增)
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
var a = null; (!a && typeof a === "object"); //true
實(shí)際上function是object的一個(gè)“子類型”, 函數(shù)是"可調(diào)用對(duì)象",它有一個(gè)內(nèi)部屬性[[Call]], 該屬性使其可以被調(diào)用
typeof [1,2,3] === "object"; //true
變量可以隨時(shí)持有任何類型的值
變量在作用域中聲明但是沒(méi)有復(fù)制為"undefined", 變量在作用域中未聲明"undeclared"第二章-值
使用delete運(yùn)算符可以將單元從數(shù)組中刪除, 但是單元?jiǎng)h除后數(shù)組的length屬性并不會(huì)發(fā)生變化
var a = []; a[0] = 1; a[2] = 3; a[1]; //undefined a.length; //3
var a = []; a[0] = 1; a["bugall"] = 2; a.length; //1 a["bugall"] = 2; a.bugall = 2;
var a = []; a["13"] = 42; a.length; //14
javascript中的數(shù)字類型是基于IEEE 754標(biāo)準(zhǔn)實(shí)現(xiàn)的, 該標(biāo)準(zhǔn)通常也被稱為“浮點(diǎn)數(shù)”,javascript使用的是 "雙精度"格式64位二進(jìn)制
42..toFixed(2) = 42.00,42.toFixed(2) 是無(wú)效語(yǔ)法,因?yàn)?被視為常量42.的一部分
二進(jìn)制浮點(diǎn)數(shù)中0.1和0.2并不是十分精確,它們相加的結(jié)果并非剛好等于0.3,而是一個(gè) 非常接近的數(shù)字0.3000000000000000002
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-111. 整形檢測(cè)
Number.isInterger(42) //true Number.isInterger(42.000) //true Number.isInterger(42.001) //false12.不是值的值
undefined類型只有一個(gè)值,即undefined, null類型也只有一個(gè)值,即null,它們的名稱是類型也是值13.不是數(shù)字的數(shù)字
如果數(shù)學(xué)運(yùn)算的操作不是數(shù)字類型,就無(wú)法返回一 個(gè)有效的數(shù)字,這種情況下返回值為NaNvar a = 2 / "foo" //NaN typeof a === "number" //trueNaN是執(zhí)行數(shù)學(xué)運(yùn)算沒(méi)有成功返回的結(jié)果, NaN是一個(gè)特殊值,它和自身不相等,是唯一一個(gè)非自反的值 NaN != NaN //true14. 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,boolean16. 復(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) //36. 使用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() //216. 使用嚴(yán)格模式下,不能使用全局對(duì)象用于默認(rèn)綁定
function foo(){ "use strict" console.log(this.a) } var a = 2 foo() //TypeError: this is undefined17. 對(duì)象引用鏈中,只有最后一層在調(diào)用位置中起作用
function foo(){ console.log(this.a) } var obj2 = { a:42, foo:foo } var obj1 = { a:2, obj2:obj2 } obj1.obj2.foo() //4218. 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) //221. 隱式綁定與顯示綁定,顯示綁定優(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) //222. 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的值是323. call apply bind的區(qū)別
call,apply屬于顯示綁定 bind屬于硬綁定,硬綁定屬于顯示綁定的一種24. 硬綁定的缺點(diǎn)
硬綁定會(huì)降低函數(shù)的靈活性,使用硬綁定之后就 無(wú)法使用隱式綁定或是顯式綁定來(lái)修改this25. 如果判斷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
摘要:命名函數(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...
摘要:認(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)有基本的原則指...
摘要:作為解決方案的和和是解決短時(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...
摘要:也就是說(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ì)研讀算法的每一步,甚至去證...
摘要:絕大多數(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ù)中超越人類,...
閱讀 3807·2021-11-17 09:33
閱讀 2025·2021-10-26 09:51
閱讀 1541·2021-09-29 09:44
閱讀 1693·2019-08-30 15:55
閱讀 1457·2019-08-30 15:52
閱讀 2337·2019-08-30 15:43
閱讀 3444·2019-08-29 17:00
閱讀 2311·2019-08-29 16:23