JavaScript常見知識點積累,包括數據類型、數值轉換、對象、原型與原型鏈、做用域與閉包等等,持續整理更新,若有錯誤請指正,甚是感激html
本文連接:JavaScript那些磨人的小妖精git
做者:狐狸家的魚github
GitHub:八至數組
一共有七種數據類型,主要爲兩大類:原始類型、對象類型數據結構
number
:用於任何類型的數字,包括整數或浮點數string
:字符串boolean
:邏輯類型,true
和false
null
:未知的值undefined
:未定義的值symbol
:建立對象的惟一標識符(ES6
新增)object
:複雜的數據結構用來比較兩個操做數的構造函數。閉包
顯示轉換主要涉及三種轉換:app
ToPrimitive()
ToNumber()
ToString()
內置類型的構造函數隱式轉換函數
''+10==='10'//true
將一個值加上空字符串能夠轉換爲字符串類型+'10' === 10//true
使用一元的加號操做符,把字符串轉換爲數字!!'foo'; // true !!''; // false !!'0'; // true !!'1'; // true !!'-1' // true !!{}; // true !!true; // true
+-*/
)、指數(**
)、餘數(%
)、自增(++
)、自減(--
)、數值、負數值>
)、小於(<
)、大於或等於(>=
)、小於或等於(<=
)、相等(==
)、嚴格相等(===
)、不相等(!=
)、嚴格不相等(!==
)!
)、且(&&
)、或(||
)、三元(? :
)Array
對象容許存儲鍵值化的集合,能夠存儲任何類型的元素this
pop/push
、shift/unshift
unshift
:在數組首部添加一個元素shift
:取出並返回第一個元素push
:在末尾添加一個元素pop
:取出並返回最後一個元素splice()
/slice()
arr.splice(index[], deleteCount, elem1, ..., elemN])
deleteCoun
t 設置爲 0,splice
方法就可以插入元素而不用刪除 arr.slice(start, end)
concat()
arr.concat(arg1, arg2...)
sort()
indexOf/lastIndexOf
和 includes
arr.indexOf(item, from)
從索引 from
查詢 item
,若是找到返回索引,不然返回 -1
arr.lastIndexOf(item, from)
和上面相同,只是從尾部開始查詢arr.includes(item, from)
從索引 from
查詢 item
,若是找到則返回 true
find
和 findIndex
let result = arr.find(function(item, index, array) { // 若是查詢到返回 true });
item
是元素index
是它的索引array
是數組自己返回true
中止查詢,返回item
,沒有查詢到結果則返回undefined
。spa
arr.findIndex
與之同樣,不過返回的是元素索引而不是元素自己。
filter()
返回全部匹配元素組成的數組
let results = arr.filter(function(item, index, array) { // 在元素經過過濾器時返回 true });
map()
迭代並返回數組中每一個元素調用函數並返回符合結果的數組
let result = arr.map(function(item, index, array) { // 返回新值而不是當前元素 })
sort()
:數組排序reverse()
:顛倒數組,而後返回它forEach
容許爲數組的每一個元素運行一個函數
arr.forEach(function(item, index, array) { // ... do something with item });
for(let i=0; i<arr.length; i++)
for...of
:不能獲取當前元素的索引,只能訪問 items
for...in
(不推薦)forEach
Object
)getter
和setter
屬性分爲兩種:數據屬性和訪問器屬性。
當讀取屬性值時,用getter
,當設置屬性值時,使用setter
。
obj.property
obj["property]
delete obj.property
key in obj
for(let key in obj)
Object.assign
或者_.cloneDeep(obj)prototype
每一個函數都有一個prototype
屬性,指向對象。
function foo() typeof foo.prototype; //Object
對於構造函數來講,生成實例的時候,該prototype
屬性會自動成爲實例對象的原型
做用
對象的屬性和方法定義在原型上,那麼全部實例對象都能共享,節省內存。
function Person(name){ this.name = name; } person.prototype.sex = 'male'; let jack = new Person('jack'); let mark = new Person('mark'); jack.sex;//'male' mark.sex;//'male'
構造函數Person
的prototype
屬性,就是實例對象jack
和mark
的原型對象,它倆都共享了該屬性。
原型對象的屬性不是實例對象自身的屬性。修改原型對象時,會體如今全部實例對象上,由於原型對象是共享的。
若是實例對象自身有某個屬性或方法,實例對象不會取原型對象上獲取。 若是
造成一個原型鏈:對象到原型,原型到原型...
prototype
Object.prototype
,繼承它的屬性Obejct.prototype
的原型是null
,也就是沒有本身的原型,原型鏈的盡頭就是null
Object.getPrototypeOf(Object.prototype) // null
JavaScript
引擎先尋找對象自己的屬性,若是找不到,就到它的原型去找,若是仍是找不到,就到原型的原型去找。若是直到最頂層的Object.prototype
仍是找不到,則返回undefined
。overriding
)Object.create()
:j接受一個對象做爲參數,而後以它的原型返回一個實例對象,徹底繼承原型對象的屬性Object.setPrototypeOf
:爲參數對象設置原型,返回該參數對象。接受兩次參數,第一個爲現有對象,第二個爲原型對象Object.getPrototypeOf
:返回參數對象的原型Object.prototype.isPrototypeOf()
:判斷該對象是否爲參數對象的原型Object.prototype._proto_
:返回該對象的原型。_proto_
屬性指向當前對象的原型對象,即構造函數的prototypr
屬性let Person = function(){}; let people = new Person(); Object.getPrototypeOf(people);//Person.prototype
obj
的原型對象有三種方法:
obj._proto_
obj.constructor.prototype
Objct.getPrototyprOf(obj)
Object.getOwnPropertyNames
:返回一個數組,元素是參數對象自己全部屬性的鍵名Object.prototype.hasOwnProperty()
:返回布爾值,判斷某個屬性在對象自身仍是在原型鏈上hasOwnPrototype
屬性(推薦用於遍歷對象屬性)hasOwnProperty
是 JavaScript
中惟一一個處理屬性可是不查找原型鏈的函數constructor
屬性prototype
對象有一個constructor
屬性,默認指向prototype
對象所在的構造函數function Person(){}; Person.prototype.constructor;//Person
constructor
屬性定義在prototype
對象上面,意味着能夠被全部實例對象繼承constructor
屬性instanceof
運算符instanceof
運算符只能用於對象,不適用原始類型的值undefined
和null
,instanceOf
運算符老是返回false
let copyObj = origin => { return Obejct.create( Object.getPrototypeOf(origin), Obejct.getOwnPropertyDescriptors(origin) ); }
this
關鍵字1.涵義
this
在構造函數中,表示實例對象this
就是屬性或方法「當前」所在的對象this
的指向是可變的,由於屬性所在的當前對象可變this
的實質就是在函數體內部,指代函數當前運行環境this
指向全局環境obj
環境執行,指向obj
function Person(){ return "我是" + this.name; } let jack = { name:"jack", resume:Person }; let mark = { name:"mark", resume:Person }; jack.resume();//"我是jack" mark.resume();//"我是mark"
2.使用場合
this
,它指向的是頂層對象window
this
:當使用Function.prototype
的call
/apply
方法時,函數內的ths
·會被顯示設置爲函數調用的第一個參數3.綁定this的方法
call()
:能夠指定函數內部this
的指向(即函數執行時所在的做用域),函數在指定做用域中調用該函數,
null
和undefined
傳入全局對象call
方法let obj = {}; let person = function (){ return this; } person();//window person.call(obj);//obj
全局環境運行函數person
時,this
指向全局環境(window
),call
方法改變this
指向對象obj
apply
:與call
類型,惟一不一樣就是它接收一個數組做爲函數執行時的參數function.apply(thisValue, [...arr]);
第一個參數是this
指向的對象,爲null
或undefined
時,傳入全局對象。
第二個參數是數組,其元素依次做爲參數傳入原函數。
bind()
:將函數體內的this
綁定到某個對象,而後返回一個新函數let person = function(name, sex){ return "我叫" + name + "," + sex; } let obj = { name:"jack", sex:21 } let new = person.bind(obj); new();//我叫jack,21
4.this使用注意點
this
this
this
this
只有等到調用時纔會有值this
,在箭頭函數內部訪問的都是來自外部的this
值