国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

CoyPan / 1215人閱讀

摘要:第一章變量內(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

第一章-變量
1.內(nèi)置類型
 空值(null)
 未定義(undefined)
 布爾值(boolean)
 數(shù)字(number)
 字符串(string)
 對象(object)
 符號(symbol,ES6新增)
2.null==="object"
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
3.null是基本類型中唯一的假值
var a = null;
(!a && typeof a === "object"); //true
4.function(函數(shù))是javascript的一個內(nèi)置函數(shù)
實際上function是object的一個“子類型”,
函數(shù)是"可調(diào)用對象",它有一個內(nèi)部屬性[[Call]],
該屬性使其可以被調(diào)用
5.數(shù)組是對象,是object的一個子類型
typeof [1,2,3] === "object"; //true
6.javascript中的變量沒有類型,只有值才有類型
變量可以隨時持有任何類型的值
7.undefined與undeclared
變量在作用域中聲明但是沒有復(fù)制為"undefined",
變量在作用域中未聲明"undeclared"
第二章-值
1.數(shù)組可以容納任意類型的值
2.delete操作后不會影響數(shù)組的長度
使用delete運算符可以將單元從數(shù)組中刪除,
但是單元刪除后數(shù)組的length屬性并不會發(fā)生變化
3.稀疏數(shù)組的length受最大值影響
var a = [];
a[0] = 1;
a[2] = 3;
a[1]; //undefined
a.length; //3
4.數(shù)組中數(shù)字和字符作為索引時,數(shù)組長度只統(tǒng)計數(shù)字部分
var a = [];
a[0] = 1;
a["bugall"] = 2;
a.length; //1
a["bugall"] = 2;
a.bugall = 2;
5.如果字符串鍵值能夠被強制類型轉(zhuǎn)換為十進(jìn)制數(shù)字的話,
它會被當(dāng)做數(shù)組索引處理
var a = [];
a["13"] = 42;
a.length; //14
6.javascript只有一種數(shù)值類型:number
javascript中的數(shù)字類型是基于IEEE 754標(biāo)準(zhǔn)實現(xiàn)的,
該標(biāo)準(zhǔn)通常也被稱為“浮點數(shù)”,javascript使用的是
"雙精度"格式64位二進(jìn)制
7.42.toFixed(2) //SyntaxError
42..toFixed(2) = 42.00,42.toFixed(2)
是無效語法,因為.被視為常量42.的一部分
8.0.1+0.2 === 0.3 //false
二進(jìn)制浮點數(shù)中0.1和0.2并不是十分精確,它們相加的結(jié)果并非剛好等于0.3,而是一個
非常接近的數(shù)字0.3000000000000000002
9. 如何判斷兩個小數(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. 整形檢測
Number.isInterger(42) //true
Number.isInterger(42.000) //true
Number.isInterger(42.001) //false
12.不是值的值
undefined類型只有一個值,即undefined,
null類型也只有一個值,即null,它們的名稱是類型也是值
13.不是數(shù)字的數(shù)字
如果數(shù)學(xué)運算的操作不是數(shù)字類型,就無法返回一
個有效的數(shù)字,這種情況下返回值為NaN
var a = 2 / "foo"  //NaN
typeof a === "number"  //true
NaN是執(zhí)行數(shù)學(xué)運算沒有成功返回的結(jié)果,
NaN是一個特殊值,它和自身不相等,是唯一一個非自反的值
NaN != NaN //true
14. 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,boolean
16. 復(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) //3
6. 使用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() //2
16. 使用嚴(yán)格模式下,不能使用全局對象用于默認(rèn)綁定
function foo(){
    "use strict"
    console.log(this.a)
}
var a = 2
foo() //TypeError: this is undefined
17. 對象引用鏈中,只有最后一層在調(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實現(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) //2
21. 隱式綁定與顯示綁定,顯示綁定優(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) //2
22. 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的值是3
23. call apply bind的區(qū)別
call,apply屬于顯示綁定
bind屬于硬綁定,硬綁定屬于顯示綁定的一種

24. 硬綁定的缺點
硬綁定會降低函數(shù)的靈活性,使用硬綁定之后就
無法使用隱式綁定或是顯式綁定來修改this
25. 如果判斷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

相關(guān)文章

  • 〔總結(jié)〕容易遺忘JS知識點整理

    摘要:命名函數(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...

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

    摘要:認(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í)算法能做得這么好。沒有基本的原則指...

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

    摘要:作為解決方案的和和是解決短時記憶問題的解決方案,它們具有稱為門的內(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...

    MrZONT 評論0 收藏0
  • 知其所以然之永不遺忘算法

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

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

    摘要:絕大多數(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ù)中超越人類,...

    hedzr 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<