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

資訊專欄INFORMATION COLUMN

那些被遺忘的javascript細節

CoyPan / 1211人閱讀

摘要:第一章變量內置類型空值未定義布爾值數字字符串對象符號新增正確的返回結果應該是但這個由來已久在中已經存在了將近年也許永遠也不會修復因為這涉及太多現有的系統修復它會產生更多的是基本類型中唯一的假值函數是的一個內置函數實際上是的一個子類型函數是

Author: bugall
Wechat: bugallF
Email: 769088641@qq.com
Github: https://github.com/bugall

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

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

a() // ReferenceError
var a = foo(){
    console.log("bugall")
}
10. 函數聲明和變量聲明都會被提升,但是函數會首先被提升,然后才是變量
11. 閉包可以組織GC回收(GC的回收機制采用引用計數)
function a(){
    var n = "bugall"
    function b(){
        console.log(n)
    }
    return b
}
foo() //"bugall"
以為b()覆蓋了a()里的變量n,所以a的資源就無法釋放,而這個引用就叫做閉包
12. 作用域是基于調用棧的,而不是代碼中得作用域嵌套
13. 箭頭函數用當前的詞法作用域覆蓋了this得本來結構
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變成了當前作用域

用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. 匿名函數無法指向自身
function foo(){
    foo.count = 4; //foo指向自身
}

setTimeout(function(){
    //匿名函數因為沒有名字,無法指定在堆棧上得確定位置,所以不能引用自身
})
15. 函數的this默認綁定是全局
function foo(){
    console.log(this.a)
}
var a = 2
foo() //2
16. 使用嚴格模式下,不能使用全局對象用于默認綁定
function foo(){
    "use strict"
    console.log(this.a)
}
var a = 2
foo() //TypeError: this is undefined
17. 對象引用鏈中,只有最后一層在調用位置中起作用
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實現this的顯示綁定
function foo(){
    console.log(this.a)
}
var obj = {
    a:2
}
foo.call(obj) //2
我們在調用foo的時候強制把它的this綁定到obj上
19. bind 返回一個硬編碼的新函數
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(...)會返回一個硬編碼的新函數,
它會把你指定的參數設置為this的上下文并調用原始函數
20. javascript中的new
在javascript中,構造函數只是一些使用new操作符
時被調用的函數,他們并不會屬于某個類,也不會實例化一個類,
實際上它們甚至都不能說是一個特殊的函數類型,他們只是
被new操作符調用的普通函數而已。
使用new來調用函數的時候,會自動執行下面的操作
1. 創建(或者說構造)一個全新的對象
2. 這個新對象會被執行[[prototype]]連接
3. 這個新對象會被綁定到函數調用的this
4. 如果函數沒有返回其他對象,那么new表達式中的函數調用會自動返回這個新對象
function foo(a){
    this.a=a
}
var bar = new foo(2)
console.log(bar.a) //2
21. 隱式綁定與顯示綁定,顯示綁定優先級最高
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綁定優先級高于隱式綁定
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)并沒有像我們預期的那樣把obj1.a修改為3
相反,new修改了硬綁定(到obj1的)調用bar(...)中的this,因為使用了new綁定得到
一個名字為baz的新對象,并且baz.a的值是3
23. call apply bind的區別
call,apply屬于顯示綁定
bind屬于硬綁定,硬綁定屬于顯示綁定的一種

24. 硬綁定的缺點
硬綁定會降低函數的靈活性,使用硬綁定之后就
無法使用隱式綁定或是顯式綁定來修改this
25. 如果判斷this綁定
1. 函數是否在new中調用(new綁定),如果是的話this綁定的是新創建的對象
var bar = new foo()

2. 函數是否通過call,apply(顯示綁定)或者硬綁定調用,
如果是的話,this綁定的是指定的對象
var bar = foo.call(obj2)

3. 函數是否在某個上下文對象中調用(隱式綁定),如果是的話,this綁定的是那個上下文對象
var var = obj1.foo()

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91193.html

相關文章

  • 〔總結〕容易遺忘JS知識點整理

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

    explorer_ddf 評論0 收藏0
  • “信息瓶頸”理論揭示深度學習本質,Hinton說他要看1萬遍

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

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

    摘要:作為解決方案的和和是解決短時記憶問題的解決方案,它們具有稱為門的內部機制,可以調節信息流。隨后,它可以沿著長鏈序列傳遞相關信息以進行預測,幾乎所有基于遞歸神經網絡的技術成果都是通過這兩個網絡實現的。和采用門結構來克服短時記憶的影響。 短時記憶RNN 會受到短時記憶的影響。如果一條序列足夠長,那它們將很難將信息從較早的時間步傳送到后面的時間步。 因此,如果你正在嘗試處理一段文本進行預測,RNN...

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

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

    B0B0 評論0 收藏0
  • 深度學習:遠非人工智能全部和未來

    摘要:絕大多數人忽略了深度學習只占機器學習領域的,而機器學習又只占到了人工智能領域的。一個深度學習專家無法與人工智能專家劃上等號。但是,深度學習并不是人類可以創造的人工智能科技的終點。深度學習的公正性并非來自其自身,而是人類篩選和準備的數據。 人工智能的這一波熱潮毫無疑問是由深度學習引發的,自吳恩達等人 2011 年發表「識別貓」研究后,深度學習及其引發的技術已經在圖像識別、游戲等任務中超越人類,...

    hedzr 評論0 收藏0

發表評論

0條評論

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