摘要:第一章變量內(nèi)置類型空值未定義布爾值數(shù)字字符串對象符號新增正確的返回結(jié)果應(yīng)該是但這個由來已久在中已經(jīng)存在了將近年也許永遠(yuǎn)也不會修復(fù)因為這涉及太多現(xiàn)有的系統(tǒng)修復(fù)它會產(chǎn)生更多的是基本類型中唯一的假值函數(shù)是的一個內(nèi)置函數(shù)實際上是的一個子類型函數(shù)是
第一章-變量Author: bugall
Wechat: bugallF
Email: 769088641@qq.com
Github: https://github.com/bugall
空值(null) 未定義(undefined) 布爾值(boolean) 數(shù)字(number) 字符串(string) 對象(object) 符號(symbol,ES6新增)
typeof null === "object" //true 正確的返回結(jié)果應(yīng)該是"null",但這個bug由來已久, 在javascript中已經(jīng)存在了將近20年,也許永遠(yuǎn)也不會修復(fù) 因為這涉及太多現(xiàn)有的web系統(tǒng),修復(fù)它會產(chǎn)生更多的bug
var a = null; (!a && typeof a === "object"); //true
實際上function是object的一個“子類型”, 函數(shù)是"可調(diào)用對象",它有一個內(nèi)部屬性[[Call]], 該屬性使其可以被調(diào)用
typeof [1,2,3] === "object"; //true
變量可以隨時持有任何類型的值
變量在作用域中聲明但是沒有復(fù)制為"undefined", 變量在作用域中未聲明"undeclared"第二章-值
使用delete運算符可以將單元從數(shù)組中刪除, 但是單元刪除后數(shù)組的length屬性并不會發(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)實現(xiàn)的, 該標(biāo)準(zhǔn)通常也被稱為“浮點數(shù)”,javascript使用的是 "雙精度"格式64位二進(jìn)制
42..toFixed(2) = 42.00,42.toFixed(2) 是無效語法,因為.被視為常量42.的一部分
二進(jìn)制浮點數(shù)中0.1和0.2并不是十分精確,它們相加的結(jié)果并非剛好等于0.3,而是一個 非常接近的數(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. 整形檢測
Number.isInterger(42) //true Number.isInterger(42.000) //true Number.isInterger(42.001) //false12.不是值的值
undefined類型只有一個值,即undefined, null類型也只有一個值,即null,它們的名稱是類型也是值13.不是數(shù)字的數(shù)字
如果數(shù)學(xué)運算的操作不是數(shù)字類型,就無法返回一 個有效的數(shù)字,這種情況下返回值為NaNvar a = 2 / "foo" //NaN typeof a === "number" //trueNaN是執(zhí)行數(shù)學(xué)運算沒有成功返回的結(jié)果, NaN是一個特殊值,它和自身不相等,是唯一一個非自反的值 NaN != NaN //true14. isNaN理解為is not a number || is NaN
前者一直是我錯誤的理解,正確的理解應(yīng)該是is NaN, 判斷數(shù)學(xué)運算是否錯誤,返回錯誤的值var a = 2 / "foo" var b = "foo" a; //NaN b; //"foo" isNaN(a) //true isNaN(b) //true 這是不同的結(jié)果,一個是運算出錯,一個是字符串代碼中盡可能得少出現(xiàn)isNaN()15. 簡單值都是通過值類型傳遞
null,undefined,string,number,boolean16. 復(fù)合類型-對象都是通過引用傳遞
我們無法更改使用值傳遞還是引用傳遞,一切根據(jù)值的類型確定第三章 對象1. 匿名還是在堆棧追蹤中不會顯示出有意義的函數(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ù)被包含在一對()括號內(nèi)部,因此成為一個函數(shù)表達(dá)式, 通過在末尾加上另一個()可以立即執(zhí)行這個函數(shù)。 第一個()將函數(shù)變成表達(dá)式3. 變量聲明應(yīng)該距離使用的地方越近越好
4. 最小力度的作用域,最小的作用域氣泡原則
5. 變量提升
console.log(a) //undefined var a = 3; console.log(a) //36. 使用var定義變量的時候,它寫在哪里都是一樣的,因為它們最終都會屬于外部作用域
console.log(a) //undefined if(false){ var a = 3; }7. 使用let進(jìn)行聲明不會在塊作用域中進(jìn)行提升
{ console.log(a) //ReferenceError var a = 3 console.log(a) //3 }8. 任何聲明在某個作用域內(nèi)的變量,都將附屬與這個作用域
9. 函數(shù)聲明會被提升,但是函數(shù)表達(dá)式不會被提升
foo() //bugall function foo(){ console.log("bugall") } a() // ReferenceError var a = foo(){ console.log("bugall") }10. 函數(shù)聲明和變量聲明都會被提升,但是函數(shù)會首先被提升,然后才是變量
11. 閉包可以組織GC回收(GC的回收機制采用引用計數(shù))
function a(){ var n = "bugall" function b(){ console.log(n) } return b } foo() //"bugall" 以為b()覆蓋了a()里的變量n,所以a的資源就無法釋放,而這個引用就叫做閉包12. 作用域是基于調(diào)用棧的,而不是代碼中得作用域嵌套
13. 箭頭函數(shù)用當(dāng)前的詞法作用域覆蓋了this得本來結(jié)構(gòu)
var obj = { name = "bugall", sayName = function(){ console.log(this.name) }) } var name = "not bugall" obj.cool() //bugall ,this的作用域是obj對象 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的詞法作用域沒有變14. 匿名函數(shù)無法指向自身
function foo(){ foo.count = 4; //foo指向自身 } setTimeout(function(){ //匿名函數(shù)因為沒有名字,無法指定在堆棧上得確定位置,所以不能引用自身 })15. 函數(shù)的this默認(rèn)綁定是全局
function foo(){ console.log(this.a) } var a = 2 foo() //216. 使用嚴(yán)格模式下,不能使用全局對象用于默認(rèn)綁定
function foo(){ "use strict" console.log(this.a) } var a = 2 foo() //TypeError: this is undefined17. 對象引用鏈中,只有最后一層在調(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實現(xiàn)this的顯示綁定
function foo(){ console.log(this.a) } var obj = { a:2 } foo.call(obj) //2 我們在調(diào)用foo的時候強制把它的this綁定到obj上19. bind 返回一個硬編碼的新函數(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(...)會返回一個硬編碼的新函數(shù), 它會把你指定的參數(shù)設(shè)置為this的上下文并調(diào)用原始函數(shù)20. javascript中的new
在javascript中,構(gòu)造函數(shù)只是一些使用new操作符 時被調(diào)用的函數(shù),他們并不會屬于某個類,也不會實例化一個類, 實際上它們甚至都不能說是一個特殊的函數(shù)類型,他們只是 被new操作符調(diào)用的普通函數(shù)而已。 使用new來調(diào)用函數(shù)的時候,會自動執(zhí)行下面的操作 1. 創(chuàng)建(或者說構(gòu)造)一個全新的對象 2. 這個新對象會被執(zhí)行[[prototype]]連接 3. 這個新對象會被綁定到函數(shù)調(diào)用的this 4. 如果函數(shù)沒有返回其他對象,那么new表達(dá)式中的函數(shù)調(diào)用會自動返回這個新對象function foo(a){ this.a=a } var bar = new foo(2) console.log(bar.a) //221. 隱式綁定與顯示綁定,顯示綁定優(yōu)先級最高
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)先級高于隱式綁定
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)并沒有像我們預(yù)期的那樣把obj1.a修改為3 相反,new修改了硬綁定(到obj1的)調(diào)用bar(...)中的this,因為使用了new綁定得到 一個名字為baz的新對象,并且baz.a的值是323. call apply bind的區(qū)別
call,apply屬于顯示綁定 bind屬于硬綁定,硬綁定屬于顯示綁定的一種24. 硬綁定的缺點
硬綁定會降低函數(shù)的靈活性,使用硬綁定之后就 無法使用隱式綁定或是顯式綁定來修改this25. 如果判斷this綁定
1. 函數(shù)是否在new中調(diào)用(new綁定),如果是的話this綁定的是新創(chuàng)建的對象 var bar = new foo() 2. 函數(shù)是否通過call,apply(顯示綁定)或者硬綁定調(diào)用, 如果是的話,this綁定的是指定的對象 var bar = foo.call(obj2) 3. 函數(shù)是否在某個上下文對象中調(diào)用(隱式綁定),如果是的話,this綁定的是那個上下文對象 var var = obj1.foo() 4. 如果都不是的話,使用默認(rèn)綁定,如果在嚴(yán)格模式下,就綁定到undefined,否則綁定到全局對象 var bar = foo()25. 當(dāng)null,undefined作為this的綁定對象傳入call,apply,bind的時候,實際應(yīng)用的是默認(rèn)綁定
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91193.html
摘要:命名函數(shù)的賦值表達(dá)式另外一個特殊的情況是將命名函數(shù)賦值給一個變量。這是由于的命名處理所致,函數(shù)名在函數(shù)內(nèi)總是可見的。當(dāng)需要向回調(diào)函數(shù)傳遞參數(shù)時,可以創(chuàng)建一個匿名函數(shù),在函數(shù)內(nèi)執(zhí)行真實的回調(diào)函數(shù)。 1.hasOwnProperty相關(guān) 為了判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性,我們需要使用繼承自 Object.prototype 的 hasOwnProperty方法。has...
摘要:認(rèn)為,深度神經(jīng)網(wǎng)絡(luò)根據(jù)一種被稱為信息瓶頸的過程在學(xué)習(xí),他和兩位合作者最早在年對這一過程進(jìn)行了純理論方面的描述。另外一些研究人員則持懷疑態(tài)度,認(rèn)為信息瓶頸理論不能完全解釋深學(xué)習(xí)的成功。 利用深度神經(jīng)網(wǎng)絡(luò)的機器已經(jīng)學(xué)會了交談、開車,在玩視頻游戲和下圍棋時擊敗了世界冠軍,還能做夢、畫畫,幫助進(jìn)行科學(xué)發(fā)現(xiàn),但同時它們也深深地讓其發(fā)明者困惑,誰也沒有料到所謂的深度學(xué)習(xí)算法能做得這么好。沒有基本的原則指...
摘要:作為解決方案的和和是解決短時記憶問題的解決方案,它們具有稱為門的內(nèi)部機制,可以調(diào)節(jié)信息流。隨后,它可以沿著長鏈序列傳遞相關(guān)信息以進(jìn)行預(yù)測,幾乎所有基于遞歸神經(jīng)網(wǎng)絡(luò)的技術(shù)成果都是通過這兩個網(wǎng)絡(luò)實現(xiàn)的。和采用門結(jié)構(gòu)來克服短時記憶的影響。 短時記憶RNN 會受到短時記憶的影響。如果一條序列足夠長,那它們將很難將信息從較早的時間步傳送到后面的時間步。 因此,如果你正在嘗試處理一段文本進(jìn)行預(yù)測,RNN...
摘要:也就是說我們只是知其然,并沒有知其所以然。相反,那些牛人就不會忘記自己設(shè)計的算法。劉未鵬在知其所以然三為什么算法這么難中探索了編碼的思維歷程,值得一看。之后,將當(dāng)前入棧,更新棧內(nèi)的遞增序列。 原文地址 相信大部分同學(xué)曾經(jīng)都學(xué)習(xí)過快速排序、Huffman、KMP、Dijkstra等經(jīng)典算法,初次學(xué)習(xí)時我們驚嘆于算法的巧妙,同時被設(shè)計者的智慧所折服。于是,我們仔細(xì)研讀算法的每一步,甚至去證...
摘要:絕大多數(shù)人忽略了深度學(xué)習(xí)只占機器學(xué)習(xí)領(lǐng)域的,而機器學(xué)習(xí)又只占到了人工智能領(lǐng)域的。一個深度學(xué)習(xí)專家無法與人工智能專家劃上等號。但是,深度學(xué)習(xí)并不是人類可以創(chuàng)造的人工智能科技的終點。深度學(xué)習(xí)的公正性并非來自其自身,而是人類篩選和準(zhǔn)備的數(shù)據(jù)。 人工智能的這一波熱潮毫無疑問是由深度學(xué)習(xí)引發(fā)的,自吳恩達(dá)等人 2011 年發(fā)表「識別貓」研究后,深度學(xué)習(xí)及其引發(fā)的技術(shù)已經(jīng)在圖像識別、游戲等任務(wù)中超越人類,...
閱讀 3803·2021-11-17 09:33
閱讀 2020·2021-10-26 09:51
閱讀 1538·2021-09-29 09:44
閱讀 1688·2019-08-30 15:55
閱讀 1455·2019-08-30 15:52
閱讀 2333·2019-08-30 15:43
閱讀 3442·2019-08-29 17:00
閱讀 2310·2019-08-29 16:23