前端葵花寶典祕籍,爲你保駕護航金三銀四html
Github來源: | 求星星 ✨ | 給個❤️關注,❤️點贊,❤️鼓勵一下做者前端
種草一句話:越努力,越幸運!以如今大多數人的努力程度之低,根本輪不到能夠拼天賦。vue
分享一下前端面試祕籍,但願可以幫助更多的小夥伴。加我😚便可交流問題(不是大佬,互相學習,創造良好的學習環境)。如下哪些你不懂呢?node
一面的問題不是很難,可是要獲得面試官比較高的評價,仍是須要必定的表達能力和對技術比較本質的認識的,若是在回答問題的時候可以作一些適當的擴展,天然會讓面試官對你有不同的評價。webpack
回答問題的步驟:先回答問題本質,在回答具體細節,最後作一些平時編程中的擴展。面試官會以爲你確實是在這個技術上面下過功夫的。git
問題都比較直接,答案也是知道就知道,不知道就不知道。這些問題一部分是基礎,一部分是根據你的專業技能的來提問的。程序員
在面試中有一些回答不出來很正常,可是若是可以作到出乎面試官的意料,也是面試官對你很重要的加分項。github
會問項目多一點,對本身作過的項目必定要深刻,包括使用使用到的技術原理、爲何要使用這些技術。web
項目中某個比較重要的點是如何實現的(須要深刻技術的原理),遇到的最大困難是什麼(有哪些),你怎麼解決的?若是須要擴展某個功能,如何下降系統的耦合度,若是針對某個功能進行優化,你會怎麼設計和優化。面試
主要看你的潛力(就是有沒有培養的價值),可是從你平時的學習中仍然是能夠看得出來的。
誠信至上,因此在簡歷中不要存在任何虛假信息,企圖經過虛假信息獲得面試機會的後果得不償失。對本身的是否一個明確的職業規劃,表達能力、與同事相處的能力以及對工做的態度。
arguments[]
函數參數數組arguments[]
數組只定義在函數體中。
在函數體中,arguments
指代該函數的Arguments
對象。該對象擁有數值屬性,可當作數組來用,含有傳入到該函數的全部參數。arguments
標識符本質上是一個局部變量,在每一個函數中會自動聲明並初始化該變量。
arguments
僅在函數體中時,才指代Arguments
對象,在全局代碼中爲undefined
。
Arguments
函數的參數和其餘屬性。
Arguments
對象只定義函數體中,從技術上來講,Arguments
對象不是數組,但它擁有數值屬性和length
屬性。
數值類型可當作是數組元素,length
屬性則表示數組元素的個數,這些數組元素是傳遞給該方法的參數值。元素0是第一個參數,元素1是第二個參數等等。
全部做爲參數傳入的值都會變成Arguments
對象的數組元素,即便在函數聲明中沒有指定參數名。
callee
和length
屬性。
Arguments
對象arguments
是一個對應於傳遞給函數的參數的類數組對象。
示例:
function func1(a, b, c) {
console.log(arguments[0]);
// expected output: 1
console.log(arguments[1]);
// expected output: 2
console.log(arguments[2]);
// expected output: 3
}
func1(1, 2, 3);
複製代碼
能夠被轉換爲一個真正的Array:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
const args = [...arguments];
複製代碼
Arguments
對象的主要用途:
Arguments.callee當前正在執行的函數
arguments.callee
,指代當前正在執行的函數,經過它能夠引用匿名函數自身。該屬性只定義在函數體中。
示例:
// 在匿名函數內使用callee屬性來引用匿名函數自身
var fn = function(x) {
if(x<2) return 1;
else return x * arguments.callee(x-1)
}
var y = fn(5); // 120
複製代碼
Arguments.length傳給函數的參數個數
arguments.length
,Arguments
對象的length
屬性表示給當前函數的參數個數。該屬性只能定義在函數體中。
該屬性表示的是實際傳入的參數個數,不是聲明的參數個數。
示例:
alert("實參長度:" +arguments.length);
alert("形參長度: " +arguments.callee.length);
// 使用Arguments對象來檢查傳入參數個數的正確性
function check(args) {
var actual = args.length; // 實際的參數個數
var expected = args.callee.length; // 期待的參數個數
if( actual != expected ) {
throw new Error("參數個數有誤,指望值:" + expected + ";實際值:" + actual);
}
}
function fn(x,y,z) {
check(arguments); // 檢查參數個數的正確性
return x+y+z;
}
複製代碼
Object.keys()
Object.keys()
方法會返回一個由一個給定對象的自身可枚舉屬性組成的數組,數組中屬性名的排列順序和正常循環遍歷該對象時返回的順序一致 。
語法
Object.keys(obj)
複製代碼
參數
obj
要返回其枚舉自身屬性的對象。
返回值
一個表示給定對象的全部可枚舉屬性的字符串數組。
示例:
// simple array
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']
// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']
// getFoo is a property which isn't enumerable
var myObj = Object.create({}, {
getFoo: {
value: function () { return this.foo; }
}
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']
複製代碼
Object.getOwnPropertyNames()
Object.getOwnPropertyNames()
方法返回一個由指定對象的全部自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol
值做爲名稱的屬性)組成的數組。
語法Object.getOwnPropertyNames(obj)
參數
obj
一個對象,其自身的可枚舉和不可枚舉屬性的名稱被返回。
返回值
在給定對象上找到的自身屬性對應的字符串數組。
示例:
var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"]
// 類數組對象
var obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"]
// 使用Array.forEach輸出屬性名和屬性值
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) {
console.log(val + " -> " + obj[val]);
});
// 輸出
// 0 -> a
// 1 -> b
// 2 -> c
//不可枚舉屬性
var my_obj = Object.create({}, {
getFoo: {
value: function() { return this.foo; },
enumerable: false
}
});
my_obj.foo = 1;
console.log(Object.getOwnPropertyNames(my_obj).sort()); // ["foo", "getFoo"]
複製代碼
Object.create()
Object.create()
方法建立一個新對象,使用現有的對象來提供新建立的對象的__proto__
。
const person = {
isHuman: false,
printIntroduction: function() {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
};
const me = Object.create(person);
me.name = 'Matthew'; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten
me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"
複製代碼
語法Object.create(proto,[propertiesObject])
參數
proto
新建立對象的原型對象。
propertiesObject
可選。須要傳入一個對象,該傳入對象的自有可枚舉屬性(即其自身定義的屬性,而不是其原型鏈上的枚舉屬性)將爲新建立的對象添加指定的屬性值和對應的屬性描述符。
返回值
一個新對象,帶着指定的原型對象和屬性。
例外
若是propertiesObject
參數是 null
或非原始包裝對象,則拋出一個 TypeError
異常。
用 Object.create
實現類式繼承
// Shape - 父類(superclass)
function Shape() {
this.x = 0;
this.y = 0;
}
// 父類的方法
Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
console.info('Shape moved.');
};
// Rectangle - 子類(subclass)
function Rectangle() {
Shape.call(this); // call super constructor.
}
// 子類續承父類
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
console.log('Is rect an instance of Rectangle?',
rect instanceof Rectangle); // true
console.log('Is rect an instance of Shape?',
rect instanceof Shape); // true
rect.move(1, 1); // Outputs, 'Shape moved.'
複製代碼
若是你但願能繼承到多個對象,則可使用混入的方式。
function MyClass() {
SuperClass.call(this);
OtherSuperClass.call(this);
}
// 繼承一個類
MyClass.prototype = Object.create(SuperClass.prototype);
// 混合其它
Object.assign(MyClass.prototype, OtherSuperClass.prototype);
// 從新指定constructor
MyClass.prototype.constructor = MyClass;
MyClass.prototype.myMethod = function() {
// do a thing
};
複製代碼
Object.assign
會把 OtherSuperClass
原型上的函數拷貝到 MyClass
原型上,使 MyClass
的全部實例均可用 OtherSuperClass
的方法。
使用 Object.create 的 propertyObject
參數
var o;
// 建立一個原型爲null的空對象
o = Object.create(null);
o = {};
// 以字面量方式建立的空對象就至關於:
o = Object.create(Object.prototype);
o = Object.create(Object.prototype, {
// foo會成爲所建立對象的數據屬性
foo: {
writable:true,
configurable:true,
value: "hello"
},
// bar會成爲所建立對象的訪問器屬性
bar: {
configurable: false,
get: function() { return 10 },
set: function(value) {
console.log("Setting `o.bar` to", value);
}
}
});
function Constructor(){}
o = new Constructor();
// 上面的一句就至關於:
o = Object.create(Constructor.prototype);
// 固然,若是在Constructor函數中有一些初始化代碼,Object.create不能執行那些代碼
// 建立一個以另外一個空對象爲原型,且擁有一個屬性p的對象
o = Object.create({}, { p: { value: 42 } })
// 省略了的屬性特性默認爲false,因此屬性p是不可寫,不可枚舉,不可配置的:
o.p = 24
o.p
//42
o.q = 12
for (var prop in o) {
console.log(prop)
}
//"q"
delete o.p
//false
//建立一個可寫的,可枚舉的,可配置的屬性p
o2 = Object.create({}, {
p: {
value: 42,
writable: true,
enumerable: true,
configurable: true
}
});
複製代碼
Flow
是facebook
出品的JavaScript
靜態類型檢查工具。Vue
的源碼利用了flow
作了靜態類型檢查。flow的工做方式:
一般類型檢查分爲2種:第一種:類型推斷;第二種:類型註解。
什麼是類型推斷呢?
經過變量的使用上下文來推斷出變量類型。
什麼是類型註解呢?
事先註解好想要的類型,flow會基於這些註解來判斷。
在Vuejs的主目錄下有.flowconfig
文件,是flow
的配置文件,[libs]
部分是用來描述包含指定庫定義的目錄。
flow
文件夾目錄:
compiler.js
編譯相關component.js
組件數據結構global-api.js
global api結構modules.js
第三方庫定義options.js
選項相關ssr.js
服務端渲染相關vnode.js
虛擬node相關瞭解Vue.js源碼目錄src下:
compiler
編譯相關core
核心代碼platforms
不一樣平臺的支持server
服務端渲染sfc
-.vue
文件解析shared
共享代碼Vuejs源碼是基於Rollup構建的。
推薦:Vue 初始化過程
init流程圖
Vue的本質:其實就是一個用Function實現的Class,經過它的原型prototype以及它自己擴展的一系列的方法和屬性。
對數據渲染的過程有了更深的一層理解,從new Vue()
開始,建立了一個vue是對象,會先進行init初始化——>$mount()——>compile(若已是render則該過程不須要)——>render——>建立VNode——>patch過程——>生成真實的DOM
null
若是想要任意類型T
能夠爲null
或者是undefined
,只需寫爲?T
的格式。
var foo: string = null
// 能夠是字符串,也能夠是null
複製代碼
key是給每一個vnode的惟一的id,能夠依靠key,更準確,更快的拿到oldVnode中對應的vnode節點。
['1','2','3'].map(parseInt)
答案是[1,NaN,NaN]
,爲何不是[1,2,3]
呢?
map函數的第一個參數callback,這個callback一共能夠接收三個參數,其中第一個參數表明當前被處理的元素,而第二個參數表明該元素的索引。
arr.map(callback: (value:T, index: number, array: T[]) => U, thisArg?:any);
複製代碼
parseInt(string, radix);
複製代碼
parseINT('1', 0)
表示 radix 爲0時,且string參數不以"0x"和"0"開頭時,按照10爲基數進行處理,返回爲1。
parseInt('2',1)
,基數爲1,(1進制),表示的數中,最大值小於2,因此沒法解析,返回爲NaN。
防抖,字面意思放置的手抖再次觸發。
onReachBottom() {
this.timer && clearTimeout(this.timer)
this.timer = setTimeout(this.getMoreList, 300)
},
複製代碼
觸發高頻事件後n秒後函數只會執行一次,若是n秒內高頻事件再次被觸發,則須要從新計算時間。
// 掘金:魔王哪吒
// 實現input實時搜索
function debounce(fn) {
let timeout = null
// 建立一個標記用來存放定時器的返回值
return function() {
clearTimeout(timeout)
// 每當用戶輸入的時候把前一個setTimeout clear掉
timeout = setTimeout(() => {
// 建立一個新的setTimeout,這樣就能保證輸入字符串後的interval間隔內若是還有字符輸入的話,就不會執行fn函數
fn.apply(this, arguments);
},500)
}
}
function sayHi() {
console.log('防抖成功')
}
var inp = document.getElementById('inp');
inp.addEventListener('input',debounce(sayHi)); // 防抖
複製代碼
節流,字面節約流量,高頻事件觸發,但在n秒內只會執行一次,因此節流會稀釋函數的執 行頻率。
// 掘金:魔王哪吒
function throttle(fn) {
let canRun = true; // 經過閉包保持一個標記
return function() {
if(!canRun) return
// 在函數開頭判斷標記是否爲true,不爲true則return
canRun = false // 當即設置爲false
setTimeout(() => {
fn.apply(this,argument);
// 最後在setTimeout執行完畢後再把標記設置爲true表示能夠執行下一次循環了,當定時器沒有執行的時候標記爲false
canRun = true
},500)
}
}
function sayHi(e) {
console.log(e.target.innerWidth, e.target.innerHeight)
}
window.addEventListener('resize', throttle(sayHi));
複製代碼
set,對象容許你存儲任何類型的惟一值,不管是原始值或者是對象引用
weakset,成員都是對象,成員都是弱引用,能夠被垃圾回收機制回收,能夠用來保存DOM節點,不容易形成內存泄漏。
Map,本質上是鍵值對的集合,相似集合,能夠遍歷,方法不少,能夠跟各類數據格式轉換。
WeakMap,只接收對象爲鍵名(null除外),不接收其餘類型的值做爲鍵名,鍵名是弱引用,鍵值能夠是任意的,鍵名所指向的對象能夠被垃圾回收,此時鍵名是無效的,不能遍歷,方法有get,set,has,delete
深度優先遍歷
指從某個頂點出發,首先訪問這個頂點,而後找出剛訪問 這個結點的第一個未被訪問的鄰結點,而後再以此鄰結點爲頂點,繼續找它的 下一個頂點進行訪問。重複此步驟,直至全部結點都被訪問完爲止。
廣度優先遍歷
是從某個頂點出發,首先訪問這個頂點,而後找出剛訪問這個結點全部未被訪問的鄰結點,訪問完後再訪問這些結點中第一個鄰結點的全部結點,重複此方法,直到全部結點都被訪問完爲止。
//1.深度優先遍歷的遞歸寫法
function deepTraveral(node) {
let nodes = []
if(node != null) {
nodes.push[node]
let childrens = node.children
for(let i=0; i<childrens.length; i++) deepTraversal(childrens[i])
}
return nodes
}
複製代碼
//2.深度優先遍歷的非遞歸寫法
function deepTraversal(node) {
let nodes = []
if(node != null) {
let stack = []
// 用來存放未來要訪問的節點
stack.push(node)
while(stack.length != 0) {
let item = stack.pop()
// 正在訪問的節點
nodes.push(item)
let childrens = item.children
for(let i = childrens.length-1; i>=0; i--) stack.push(childrens[i])
// 將如今訪問點的節點的子節點存入stack,供未來訪問
}
}
return nodes
}
複製代碼
//3.廣度優先遍歷的遞歸寫法
function wideTraversal(node) {
let nodes = [], i = 0
if(node != null) {
nodes.push(node)
wideTraversal(node.nextElementSibling)
node = nodes[i++]
wideTraversal(node.firstElementChild)
}
return nodes
}
複製代碼
//4.廣度優先遍歷的非遞歸寫法
function wideTraversal(node) {
let nodes = [], i=0
while(node != null) {
nodes.push(node)
node = nodes[i++];
let childrens = node.children
for(let i=0; i<childrens.length; i++) {
nodes.push(childrens[i])
}
}
return nodes
}
複製代碼
Object.prototype.toString()
toString()
方法返回一個表示該對象的字符串。
function Dog(name) {
this.name = name;
}
const dog1 = new Dog('掘金魔王哪吒');
Dog.prototype.toString = function dogToString() {
return `${this.name}`;
};
console.log(dog1.toString());
// expected output: "掘金魔王哪吒"
複製代碼
語法
obj.toString()
// 返回值
// 一個表示該對象的字符串。
複製代碼
每一個對象都有一個 toString()
方法,當該對象被表示爲一個文本值時,或者一個對象以預期的字符串方式引用時自動調用。默認狀況下,toString()
方法被每一個 Object
對象繼承。若是此方法在自定義對象中未被覆蓋,toString()
返回 "[object type]"
,其中 type
是對象的類型。
var o = new Object();
o.toString(); // returns [object Object]
複製代碼
使用
toString()
檢測對象類型
能夠經過 toString()
來獲取每一個對象的類型。爲了每一個對象都能經過 Object.prototype.toString()
來檢測,須要以 Function.prototype.call()
或者 Function.prototype.apply()
的形式來調用,傳遞要檢查的對象做爲第一個參數,稱爲 thisArg
。
示例:
var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
//Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
複製代碼
Function.prototype.call()
call()
方法使用一個指定的 this
值和單獨給出的一個或多個參數來調用一個函數。
call()
方法接受的是一個參數列表
示例:
// 掘金:魔王哪吒
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
console.log(new Food('cheese', 5).name);
// expected output: "cheese"
複製代碼
語法
function.call(thisArg, arg1, arg2, ...)
複製代碼
thisArg
可選的。在 function
函數運行時使用的 this
值。請注意,this可能不是該方法看到的實際值:若是這個函數處於非嚴格模式下,則指定爲 null 或 undefined
時會自動替換爲指向全局對象,原始值會被包裝。
arg1, arg2, ...
指定的參數列表。
返回值
使用調用者提供的 this
值和參數調用該函數的返回值。若該方法沒有返回值,則返回 undefined
。
描述
call()
容許爲不一樣的對象分配和調用屬於一個對象的函數/方法。
call()
提供新的 this
值給當前調用的函數/方法。你可使用 call
來實現繼承:寫一個方法,而後讓另一個新的對象來繼承它(而不是在新對象中再寫一次這個方法)。
使用 call 方法調用父構造函數
示例:
// 掘金:魔王哪吒
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
複製代碼
Function.prototype.apply()
apply()
方法調用一個具備給定this
值的函數,以及以一個數組(或類數組對象)的形式提供的參數。
語法
// 掘金:魔王哪吒
func.apply(thisArg, [argsArray])
複製代碼
參數
thisArg
必選的。在 func 函數運行時使用的 this 值。請注意,this可能不是該方法看到的實際值:若是這個函數處於非嚴格模式下,則指定爲 null 或 undefined
時會自動替換爲指向全局對象,原始值會被包裝。
argsArray
可選的。一個數組或者類數組對象,其中的數組元素將做爲單獨的參數傳給 func 函數。若是該參數的值爲 null 或 undefined
,則表示不須要傳入任何參數。從ECMAScript 5
開始可使用類數組對象。
返回值
調用有指定this
值和參數的函數的結果。
描述
在調用一個存在的函數時,你能夠爲其指定一個 this 對象。 this 指當前對象,也就是正在調用這個函數的對象。 使用 apply, 你能夠只寫一次這個方法而後在另外一個對象中繼承它,而不用在新對象中重複寫該方法。
用 apply 將數組各項添加到另外一個數組
// 掘金:魔王哪吒
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]
複製代碼
Function.prototype.bind()
bind()
方法建立一個新的函數,在 bind()
被調用時,這個新函數的 this
被指定爲 bind()
的第一個參數,而其他參數將做爲新函數的參數,供調用時使用。
// 掘金:魔王哪吒
const module = {
x: 42,
getX: function() {
return this.x;
}
};
const unboundGetX = module.getX;
console.log(unboundGetX()); // The function gets invoked at the global scope
// expected output: undefined
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX());
// expected output: 42
複製代碼
語法
// 掘金:魔王哪吒
function.bind(thisArg[, arg1[, arg2[, ...]]])
複製代碼
返回值
返回一個原函數的拷貝,並擁有指定的 this 值和初始參數。
建立綁定函數
// 掘金:魔王哪吒
this.x = 9; // 在瀏覽器中,this 指向全局的 "window" 對象
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 81
var retrieveX = module.getX;
retrieveX();
// 返回 9 - 由於函數是在全局做用域中調用的
// 建立一個新函數,把 'this' 綁定到 module 對象
// 新手可能會將全局變量 x 與 module 的屬性 x 混淆
var boundGetX = retrieveX.bind(module);
boundGetX(); // 81
複製代碼
在默認狀況下,使用 window.setTimeout()
時,this
關鍵字會指向 window
(或 global
)對象。當類的方法中須要 this
指向類的實例時,你可能須要顯式地把 this
綁定到回調函數,就不會丟失該實例的引用。
將一個相似於數組的對象轉換成一個真正的數組
// 掘金:魔王哪吒
var slice = Array.prototype.slice;
// ...
slice.apply(arguments);
複製代碼
Array.prototype.slice()
slice()
方法返回一個新的數組對象,這一對象是一個由 begin 和 end
決定的原數組的淺拷貝(包括 begin
,不包括end
)。原始數組不會被改變。
// 掘金:魔王哪吒
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]
console.log(animals.slice(1, 5));
// expected output: Array ["bison", "camel", "duck", "elephant"]
複製代碼
語法
// 掘金:魔王哪吒
arr.slice([begin[, end]])
複製代碼
返回值
一個含有被提取元素的新數組。
描述
slice 不會修改原數組,只會返回一個淺複製了原數組中的元素的一個新數組。原數組的元素會按照下述規則拷貝:
若是該元素是個對象引用 (不是實際的對象),slice 會拷貝這個對象引用到新的數組裏。兩個對象引用都引用了同一個對象。若是被引用的對象發生改變,則新的和原來的數組中的這個元素也會發生改變。
對於字符串、數字及布爾值來講(不是 String、Number 或者 Boolean 對象),slice 會拷貝這些值到新的數組裏。在別的數組裏修改這些字符串或數字或是布爾值,將不會影響另外一個數組。
若是向兩個數組任一中添加了新元素,則另外一個不會受到影響。
類數組(Array-like)對象
slice 方法能夠用來將一個類數組(Array-like
)對象/集合轉換成一個新數組。你只需將該方法綁定到這個對象上。 一個函數中的 arguments 就是一個類數組對象的例子。
// 掘金:魔王哪吒
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
複製代碼
除了使用 Array.prototype.slice.call(arguments)
,你也能夠簡單的使用 [].slice.call(arguments)
來代替。
可使用 bind 來簡化該過程
// 掘金:魔王哪吒
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
function list() {
return slice(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
複製代碼
環狀數據
// 掘金:魔王哪吒
const obj = {
foo: {
name: 'foo',
bar: {
name: 'bar'
baz: {
name: 'baz',
aChild: null //待會讓它指向obj.foo
}
}
}
}
obj.foo.bar.baz.aChild = obj.foo // foo->bar->baz->aChild->foo 造成環
JSON.stringify(obj) // => TypeError: Converting circular structure to JSON
複製代碼
拷貝這樣封閉的環狀數據結構,會致使死循環
先說說什麼是深拷貝與淺拷貝
淺拷貝:也就是拷貝A對象裏面的數據,可是不拷貝A對象裏面的子對象
深拷貝:會克隆出一個對象,數據相同,可是引用地址不一樣(就是拷貝A對象裏面的數據,並且拷貝它裏面的子對象)
淺拷貝和深拷貝的區別
推薦: 請分別用深度優先思想和廣度優先思想實現一個拷貝函數? 每日一題系列(六)
推薦:企業微信開放平臺註冊流程
<button open-type="getUserInfo"/>
複製代碼
補充:app
生成簽名證書
testalias 和 test.keystore中的'test'
都是能夠修改的,能夠替換爲本身項目中的名字。輸入下面的keytool -genkey
命令就能夠生成證書了
keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore
複製代碼
用簽名生成工具生成簽名
uniapp的mainfest.json
文件配置中,appid必須是'_UNI_'
開頭,因此你的配置文件中得是'_UNI_'
開頭的。
推薦:小程序靜默登陸方案設計
推薦:小程序用戶登陸架構設計
登陸方案
Cookie + Session
登陸Token
登陸SSO
單點登陸OAuth
第三方登陸SSO
單點登陸,適用於中大型企業,想要統一內部全部產品的登陸方式的狀況。
// 掘金:魔王哪吒
flex
margin: 0 auto
複製代碼
document.documentElement.clientWidth
: 可見區域寬度;document.documentElement.clientHeight
: 可見區域高度。canvas.width = document.documentElement.clientWidth
canvas.height = document.documentElement.clientHeight
screen.availWidth
:屏幕可用寬度;screen.availHeight
:屏幕可見高度。canvas.width = screen.availWidth;
canvas.height = screen.availHeight;
screen.width:屏幕顯示寬度
screen.height:屏幕顯示高度
canvas.width = screen.width
canvas.height = screen.height
window.innerWidth:窗口的寬度
window.innerHeight:窗口的高度
canvas.width = window.innerWidth
canvas.height = window.innerHeight
Vue源碼根目錄下文件夾:
build
打包相關的配置文件,根據不一樣的入口,打包爲不一樣的文件dist
打包以後文件所在位置examples
部分示例flow
,因Vue使用了Flow
來進行靜態類型檢查,這裏是定義了聲明一些靜態類型packages
,分別生成其餘的npm
包src
,主要源碼所在位置compiler
模板解析的相關文件codegen
根據ast
生成render
函數directives
通用生成render
函數以前須要處理的指令parser
模板解析core
核心代碼components
全局組件global-api
全局方法instance
實例相關內容,包括實例方法,生命週期,事件等observer
雙向數據綁定相關文件util
工具方法vdom
虛擬dom
相關entries
入口文件,也就是build
文件夾下config.js
中配置的入口文件platforms
平臺相關的內容web
,web
端獨有文件compiler
編譯階段須要處理的指令和模塊runtime
運行階段須要處理的組件,指令和模塊server
服務端渲染相關util
工具庫weex
,weex
端獨有文件shared
共享的工具方法test
測試用例先看package.json
文件,有項目的依賴,有開發環境,生產環境等編譯的啓動腳本,有項目的許可信息等。來看看:npm run dev
:
// 掘金:魔王哪吒
"dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev"
複製代碼
rollup
是一個相似於webpack的打包工具,入口文件:/src/entries/web-runtime-with-compiler.js
// 掘金:魔王哪吒
/src/entries/web-runtime-with-compiler.js
--> /src/entries/web-runtime.js
--> /src/core/index.js
--> /src/core/instance/index.js
複製代碼
定義Vue對象它的構造函數及其簡單:
// 掘金:魔王哪吒
function Vue (options) {
// 判斷是否是生產環境
if (process.env.NODE_ENV !== 'production' &&
!(this instanceof Vue)) {
//若是不是經過new關鍵字來建立對象的話
warn('Vue is a constructor and should be called with the `new` keyword')
}
this._init(options)
}
複製代碼
Vue的靜態方法和實例方法:
// src/core/index.js
Vue.version = '__VERSION__'
// src/entries/web-runtime-with-compiler.js
Vue.compile = compileToFunctions
// 把模板template轉換爲render函數
// src/core/global-api
// 在目錄結構中,Vue的靜態方法大多都是在該文件夾中定義的
// src/core/global-api/index.js
Vue.config
Vue.util
Vue.set
Vue.delete
Vue.nextTick
Vue.options = {
components: {KeepAlive: KeepAlive}
directives: {},
filters: {},
_base: Vue
}
// src/core/global-api/use.js
Vue.use
// src/core/global-api/mixin.js
Vue.mixin
// src/core/global-api/extend.js
Vue.extend
// src/core/global-api/assets.js
Vue.component
Vue.directive
Vue.filter
複製代碼
vm._uid // 自增的id
vm._isVue // 標示是vue對象,避免被observe
vm._renderProxy // Proxy代理對象
vm._self // 當前vm實例
vm.$parent // 用於自定義子組件中,指向父組件的實例
vm.$root // 指向根vm實例
vm.$children // 當前組件的子組件實例數組
vm.$refs
vm._watcher = null
vm._inactive = null
vm._directInactive = false
vm._isMounted = false // 標識是否已掛載
vm._isDestroyed = false // 標識是否已銷燬
vm._isBeingDestroyed = false // 標識是否正在銷燬
vm._events // 當前元素上綁定的自定義事件
vm._hasHookEvent // 標示是否有hook:開頭的事件
vm.$vnode // 當前自定義組件在父組件中的vnode,等同於vm.$options._parentVnode
vm._vnode // 當前組件的vnode
vm._staticTrees // 當前組件模板內分析出的靜態內容的render函數數組
vm.$el // 當前組件對應的根元素
vm.$slots // 定義在父組件中的slots,是個對象鍵爲name,值爲響應的數組
vm.$scopedSlots = emptyObject
// 內部render函數使用的建立vnode的方法
vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
// 用戶自定義render方法時,傳入的參數
vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)
vm._props // 被observe的存儲props數據的對象
vm._data // 被observe的存儲data數據的對象
vm._computedWatchers // 保存計算屬性建立的watcher對象
複製代碼
鉤子函數:
beforeCreate
,建立以前created
,建立beforeMount
,掛載前mounted
,掛載beforeUpdate
,更新前updated
,更新activated
,觸發deactivated
,停用beforeDestroy
,銷燬前destroyed
,毀壞// vm.$options
declare type ComponentOptions = {
// data
data: Object | Function | void; // 傳入的data數據
props?: { [key: string]: PropOptions }; // props傳入的數據
propsData?: ?Object; // 對於自定義組件,父級經過`props`傳過來的數據
computed?: { // 傳入的計算屬性
[key: string]: Function | {
get?: Function;
set?: Function;
cache?: boolean
}
};
methods?: { [key: string]: Function }; // 傳入的方法
watch?: { [key: string]: Function | string }; // 傳入的watch
// DOM
el?: string | Element; // 傳入的el字符串
template?: string; // 傳入的模板字符串
render: (h: () => VNode) => VNode; // 傳入的render函數
renderError?: (h: () => VNode, err: Error) => VNode;
staticRenderFns?: Array<() => VNode>;
// 鉤子函數
beforeCreate?: Function;
created?: Function;
beforeMount?: Function;
mounted?: Function;
beforeUpdate?: Function;
updated?: Function;
activated?: Function;
deactivated?: Function;
beforeDestroy?: Function;
destroyed?: Function;
// assets
directives?: { [key: string]: Object }; // 指令
components?: { [key: string]: Class<Component> }; // 子組件的定義
transitions?: { [key: string]: Object };
filters?: { [key: string]: Function }; // 過濾器
// context
provide?: { [key: string | Symbol]: any } | () => { [key: string | Symbol]: any };
inject?: { [key: string]: string | Symbol } | Array<string>;
// component v-model customization
model?: {
prop?: string;
event?: string;
};
// misc
parent?: Component; // 父組件實例
mixins?: Array<Object>; // mixins傳入的數據
name?: string; // 當前的組件名
extends?: Class<Component> | Object; // extends傳入的數據
delimiters?: [string, string]; // 模板分隔符
// 私有屬性,均爲內部建立自定義組件的對象時使用
_isComponent?: true; // 是不是組件
_propKeys?: Array<string>; // props傳入對象的鍵數組
_parentVnode?: VNode; // 當前組件,在父組件中的VNode對象
_parentListeners?: ?Object; // 當前組件,在父組件上綁定的事件
_renderChildren?: ?Array<VNode>; // 父組件中定義在當前元素內的子元素的VNode數組(slot)
_componentTag: ?string; // 自定義標籤名
_scopeId: ?string;
_base: Class<Component>; // Vue
_parentElm: ?Node; // 當前自定義組件的父級dom結點
_refElm: ?Node; // 當前元素的nextSlibing元素,即當前dom要插入到_parentElm結點下的_refElm前
}
複製代碼
const func = (): number => 1;
// 聲明一個泛型類型別名,返回值與泛型類型相同,入參類型不限制。
type Reverse<T> = (arg: any) => T;
// 聲明一個泛型方法,入參arg繼承泛型約束,返回空對象並斷言其類型爲T
function returnResultType<T>(arg: Reverse<T>): T {
return {} as T;
}
// 調用returnResultType,傳入方法(arg: any) => 3,得到result返回值
const result = returnResultType((arg:any) => 3);
// 獲取result類型並重名爲ResultType
type ResultType = typeof result;
複製代碼
構造函數:
new Array()
new Array(size)
new Array(element0, element1, ..., elementn)
複製代碼
size
設定的數組元素個數。返回數組的length
屬性等於size
。element0,..,elementn
,當Array()
構造函數用這些參數調用時,新建立的數組實例會用指定的參數值來初始化,並將length
屬性設置爲參數個數。Array()
時,返回的數組爲空,length
屬性爲0。concat()
,把元素銜接到數組中。every()
,測試斷言函數是否對每一個數組元素都爲真。filter()
,返回知足斷言函數的數組元素。forEach()
,爲數組的每個元素調用指定函數。indexOf()
,在數組中查找匹配元素。join()
,將數組的全部元素轉換爲字符串,並銜接起來。lastIndexOf()
,在數組中反向查找。map()
,從數組的元素中,計算出新的數組元素。pop()
,移除數組最後一個元素。push()
,把元素添加到數組尾部。reduce()
,從數組的元素中,計算出一個值。reduceRight()
,從右到左縮減數組。reverse()
,在原數組中顛倒元素的順序。shift()
,移除數組的第一個元素。slice()
,返回數組的一部分。some()
,測試是否至少有一個數組元素能讓斷言函數爲真。sort()
,在原數組中對數組元素進行排序。splice()
,插入,刪除,或替換數組元素。toLocaleString()
,將數組轉換爲本地字符串。toString()
,將數組轉換爲字符串。unshift()
,在數組頭部插入元素。Array.concat()
array.concat(value, ...)
複製代碼
返回值,一個新數組,包含array
的元素,以及銜接的新元素。
concat()
會將參數銜接到array
中獲得一個新數組並返回,它不會修改array
,若是傳給concat()
的某個參數自己是一個數組,則會將該數組的元素銜接到array
中,而不是數組自己。
var a = [1,2,3];
a.concat(4,5); // [1,2,3,4,5];
複製代碼
Array.every()
測試斷言函數是否對每一個元素爲真array.every(predicate)
array.every(predicate,o)
複製代碼
參數:
predicate
,用來測試數組元素的斷言函數。
o
,調用predicate
時的可選this
值。
返回值:若是對array
的每個元素調用predicate
時都返回真值,則返回true
,若是有任何一個元素調用predicate
時返回假值,則返回false
。
every()
方法用來測試數組的全部元素是否都知足某些條件。若是predicate
的每一次調用都返回true
,則every()
返回true
,不然,爲false
。
當遍歷的數組爲空時,every()
返回true
[1,2,3].every(function(x) { return x<5 ;}) // true
[1,2,3].every(function(x) { return x<3 ;}) // false
[].every(function(x) {return false;}); // true []老是返回true
複製代碼
Array.filter()
返回經過斷言的數組元素array.map(predicate)
array.map(predicate, o)
predicate
,用來判斷array
中的元素是否須要包含在返回數組中的調用函數o
,調用predicate
時的可選this
值返回值:
一個新數組,只包含那些讓predicate
返回真值的數組元素
filter()
會建立一個新數組,包含那些讓predicate
函數返回真值的array
的元素。filter()
方法不會修改arrry
自己,注意predicate
函數有可能會修改。
返回新建立的數組。
Array.forEach()
爲每個數組元素調用一個函數array.forEach(f)
array.forEach(f,o)
複製代碼
參數
f 爲array的每個元素調用的函數
o 調用f時的可選this值
複製代碼
返回值:該方法無返回值,注意forEach()
沒有返回值,特別注意,它不會返回array
。
forEach(), map(), filter(), every(), some()
接受函數做爲第一個參數,並接受可選的第二個參數。在函數體內,this值等於o。
若是沒有指定第二個參數,this值在非嚴格模式下是全局對象,在嚴格模式下則爲null
。
var a = [1,2,3];
a.forEach(function(x,i,a){ a[i]++; }); // [2,3,4]
複製代碼
Array.indexOf()
查找數組array.indexOf(value)
array.indexOf(value,start)
複製代碼
參數:
value 要在array中查找的值
start 開始查找的可選數組序號,能夠省略,則爲0
複製代碼
返回值,所在index,若是不存在匹配元素時,返回-1
判斷是否相等使用的是"==="操做符
['a', 'b', 'c'].indexOf('b'); // 1
['a', 'b', 'c'].indexOf('d', 1); // -1
複製代碼
Array.join()
,將數組元素銜接爲字符串array.join()
array.join(separator)
複製代碼
separator
,在返回的字符串中,用來分隔數組的某個元素與下一個元素的可選字符或字符串。若是省略,默認是英文逗號。返回值,一個字符串。
a = new Array(1,2,3,"test");
s = a.join("+"); // 1+2+3+test
複製代碼
Array.lastIndexOf()
反向查找數組array.lastIndexOf(value);
array.lastIndexOf(value,start);
複製代碼
value
,要在array
中查找的值start
,開始查找的可選數組序號,若是省略,則從最後一個元素開始查找Array.length
數組大小length
屬性表示數組中的元素個數
若是設置的
length
大於原值,數組會變大,新添加到末尾處的元素的值爲undefined
。
Array.map()
從數組元素中計算新值array.map(f);
array.map(f,o);
複製代碼
f
爲array的每個元素調用的函數,它的返回值會成爲返回數組的元素。o
-f
調用時的可選this
值。返回值:一個新數組,由函數f
計算出的元素組成。
[1,2,3].map(function(x) { return x*x }); // [1,4,9]
複製代碼
Array.pop()
移除並返回數組的最後一個元素array.pop()
複製代碼
返回值:array
的最後一個元素
pop()
會移除array
的最後一個元素,縮短數組的長度,並返回所移除元素的值。若是數組已經爲空,pop()
不會修改該數組,返回值爲undefined
。
pop()
和push()
,先進後出的棧功能:
var stack = []; // stack: []
stack.push(1,2); // stack: [1,2] 返回2
stack.pop(); // stack: [1] 返回2
stack.push([4,5]); // stack: [1, [4,5]] 返回2
stack.pop(); // stack: [1] 返回[4,5]
stack.pop(); // stack: [] 返回1
複製代碼
Array.push()
給數組追加元素array.push(value,...);
複製代碼
返回值:把指定值追加到數組後數組的新長度。(它會直接修改array,而不會建立一個新的數組)
push()
和pop()
,先進後出的棧功能。
Array.reduce()
從數組元素中計算一個值array.reduce(f);
array.reduce(f,initial);
複製代碼
f
一個函數,能夠合併兩個值,並返回一個「縮減」的新值。initial
,用來縮減數組的可選初始值,若是指定該參數,reduce()
的行爲會像把該參數插入array
的頭部同樣。返回值:數組的化簡值
示例:
[1,2,3,4].reduce(function(x,y) { return x*y; }) // 24
複製代碼
Array.reduceRight()
從右到左縮減數組array.reduceRight(f)
array.reduceRight(f, initial)
複製代碼
f
一個函數,能夠合併兩個值,並返回一個「縮減」的新值。initial
用來縮減數組的可選初始值,若是指定該參數,reduceRight()
的行爲會像是把該參數插入aray
的尾部同樣。返回值:數組的縮減值,該值是最後一次調用f
時的返回值。
[2,10,60].reduceRight(function(x,y) { return x/y; }) // 3
複製代碼
Array.reverse()
顛倒數組中的元素順序array.reverse()
複製代碼
Array
對象的reverse()
方法能夠顛倒數組元素的順序。它會在原數組中進行操做,而不會建立一個新數組。
a = new Array(1,2,3);
a.reverse();
複製代碼
Array.shift()
移除數組的第一個元素array.shift()
複製代碼
返回值:數組原來的第一個元素。
若是數組爲空,
shift()
什麼也不幹,返回undefined
值,沒有建立新數組。
var a = [1,[2,3],4];
a.shift(); // 1
複製代碼
Array.slice()
返回數組的一部分array.slice(start, end)
複製代碼
返回值:一個新數組,包含array中從start一直到end之間的全部元素(包含start指定的元素,但不包含end指定的元素),若是沒有指定end,返回的數組包含從start到array尾部的全部元素。
var a = [1,2,3,4,5];
a.slice(0,3); // 返回 [1,2,3]
a.slice(3); // 返回 [4,5]
複製代碼
Array.some()
測試是否有元素知足斷言函數array.some(predicate)
array.some(predicate,o)
複製代碼
predicate
用來測試數組元素的斷言函數o
調用predicate
時的可選this
值返回值:若是array
中有至少一個元素調用predicate
時返回真值,則返回true,若是全部元素調用predicate
時都返回假值,則返回false。
[1,2,3].some(function(x) { return x>5; }); //false
[1,2,3].some(function(x) { return x>2; }); // true
[].some(function(x) { return false; }); // false
複製代碼
Array.sort()
對數組元素進行排序array.sort()
array.sort(orderfunc)
複製代碼
orderfunc
用來指定如何排序的可選函數返回值:該數組的引用。注意是在原數組中進行排序,沒有新鍵數組。數組中的undefined元素會始終排列在數組末尾。
function numberorder(a,b) {return a-b;}
a = new Array(3,2,4);
a.sort(); // 字母排序
a.sort(numberorder); // 數值排序
複製代碼
Array.splice()
插入,刪除或替換數組元素array.splice(start,deleteCount,value,...)
複製代碼
start
開始插入和刪除處的數組元素的序號。deleteCount
要刪除的元素個數,從start
開始,幷包含start
處的元素,若是指定爲0,表示插入元素,而不用刪除任何元素。value,...
要插入數組中的零個或多個值,從start
序號開始插入。返回值:
若是從數組中刪除了元素,則返回一個新數組,包含這些刪除的元素,splice()
會直接修改數組。
var a = [1,2,3,4,5,6];
a.splice(1,2);
複製代碼
Array.toLocaleString()
將數組轉換爲本地字符串array.toLocaleString()
複製代碼
返回值:數組的本地化字符串表示。(異常,調用該方法時,若是對象不是數組,會拋出異常。)
Array.toString()
將數組轉化成字符串array.toString()
複製代碼
返回值:array
的字符串表示。(異常,調用該方法時,若是對象不是數組,會拋出異常。)
Array.unshift()
在數組頭部插入元素array.unshift(value,...)
複製代碼
參數:value,...
,要插入array
頭部的一個或多個值。
返回值:數組的新長度。unshift()
不會建立新數組,而是直接修改數組自己。
var a = [];
a.unshift(1); // a:[1];
複製代碼
Boolean
對布爾值的支持構造函數:
new Boolean(value) // 構造函數
Boolean(value) // 轉換函數
複製代碼
參數:value
,Boolean
對象存放的值,或要轉換成布爾值的值。
Boolean()
會將參數轉換成布爾值,並返回一個包含該值的Boolean
對象。0,NaN,null,空字符串""和undefined
都會轉成false。toString()
根據Boolean
對象表明的布爾值返回"true"或"false"
字符串。valueOf()
返回Boolean
對象中存放的原始布爾值。Boolean
對象時一個封裝布爾值的對象。Boolean.toString,將布爾值轉換成字符串
b.toString()
複製代碼
Boolean.valueOf(),Boolean對象的布爾值
new Date()
new Date(milliseconds)
new Date(datestring)
new Date(year, month, day, hours, minutes, seconds, ms)
複製代碼
不帶參數時,Date()
構造函數將根據當前日期和時間建立一個Date
對象。
Date.getDate()
返回一個Date對象的月份中的日期值
返回:給定Date對象date的月份中的日期值,使用本地時間。返回值1~31之間
Date.getDay() ,返回值0(星期天)~6(星期一)
Date.getFullYear(),返回值是一個完整的4位數字的年份
Date.getHours(),返回一個Date對象的小時值,返回值0~23
Date.getMilliseconds(),返回一個Date對象的毫秒值
Date.getMinutes(),返回一個Date對象的分鐘值,返回值在0~59之間
Date.getMonth(),返回一個Date對象的月份值,0(1月)~11(12月)之間
Date.getSeconds(),返回一個Date對象的秒鐘值,0~59之間
Date.getTime(),將一個Date對象以毫秒形式返回
Date.getYear(),返回一個Date對象的年份值
Date.now(),以毫秒的形式返回當前時間
Date.parse(),解析一個日期或時間字符串
Date.setDate()設置一個Date對象的一月中的日期值
Date.setFullYear()設置一個Date的年份值
Date.setHours()設置一個Date的小時,分鐘,秒以及毫秒值
Date.setMilliseconds()設置一個日期的毫秒值
Date.setMinutes()設置一個Date的分鐘,秒鐘,以及毫秒值
Date.setMonth()設置一個Date的月份以及日期值
Date.setSeconds()設置一個Date的秒鐘以及毫秒值
Date.setTime()使用毫秒值設置一個時間
Date.setYear()設置一個Date的年份值
decodeURI(uri)
// uri
一個包含已編碼的URI或其餘待解碼的文本的字符串
複製代碼
轉義一個URI中的字符
// 構造函數
new Function(argument_names..., body)
// arguments_names...
任意多個字符串參數
// body
指定函數體的字符串
// 返回
新建立的Function對象
// 異常
SyntaxError
表示在body參數或某個argument_names參數中存在JavaScript語法錯誤
複製代碼
屬性
arguments[]
傳遞給函數的參數數組,不推薦使用
caller
調用該函數的Function對象的引用,若是是全局調用,則該屬性爲null,不推薦使用
複製代碼
方法:
apply()
將函數做爲指定對象的方法來調用。傳遞給它的是指定的參數數組。
bind()
返回一個新函數。
call()
將函數做爲指定對象的方法來調用。傳遞給它的是指定的參數。
toString()
返回函數的字符串表示。
複製代碼
Function.apply()
function.apply(調用function的對象/函數體中this/若是參數爲null,則使用全局對象,一個值數組)
// 返回
調用函數function的返回值
// 異常
若是調用該函數的對象不是函數,或者參數args不是數組和Arguments對象,會拋出異常
複製代碼
示例:
Object.prototype.toString.apply(o);
var data=[1,2,3,4,5,34];
Math.max.apply(null,data);
複製代碼
Function.bind(),返回一個做爲方法調用的函數
function.bind(o)
function.bind(o,args...)
// o
要綁定到函數上的對象
// args...
要綁定到函數上的零個或多個參數值
// 返回
一個新函數
複製代碼
示例:
var g = f.bind(o, 1,2);
f.call(o, 1,2,3);
複製代碼
Function.arguments[]傳遞給函數的參數,不建議使用
Function.call()將函數做爲對象的方法調用
function.call(thisobj, args...)
// thisobj
調用function的對象,在函數體中,thisobj是關鍵字this的值,若是這個參數爲null,則使用全局對象
// args..
任意多個參數
// 返回
調用函數function的返回值
複製代碼
示例:
Object.prototype.toString().call(o);
複製代碼
Function.caller()調用當前函數的函數,該屬性不是必需的,不該該使用它
Function.length()聲明的參數的個數
Function.prototype()對象類的原型
Function.toString()將函數轉換成字符串
返回:表示函數的字符串
全局屬性
全局對象不是一個類,注意,全部全局變量也都是全局對象的屬性:
Infinity
表示正無窮大的數值NaN
表示不是數值的值undefined
表示undefined
值全局函數
decodeURI()
解碼使用encodeURI()
轉義的字符串decodeURIComponent()
解碼使用encodeURIComponent()
轉義的字符串encodeURI()
經過轉義特定字符對URI編碼encodeURIComponent()
經過轉義特定字符對URI的組成部分編碼escape()
用轉義序列替換特定字符來對字符串編碼eval()
執行JavaScript代碼字符串,返回結果isFinite()
判斷一個值是否無窮大isNaN()
判斷一個值是不是非數值parseFloat()
從字符串中解析數值parseInt()
從字符串中解析整數unescape()
解碼使用escape()
編碼的字符串全局對象
Array
Boolean
Date
Error
EvalError
Function
JSON
Math
Number
Object
String
TypeError
URIError
NaN是一個全局屬性,指向一個特殊的非數字值。NaN
屬性不可用for/in
循環枚舉,也不能用delete
操做符刪除。NaN
不是常量,不可將它設置爲任何其餘值。
檢查一個值是不是數字,使用isNaN(),NaN老是與其餘值不相等,它自己也不相等。
new Object()
new Object(value)
複製代碼
屬性:constructor,引用當前對象的構造函數。
方法:
檢查對象是否擁有一個指定名字的本地定義的屬性
檢查當前對象是否是指定對象的原型
檢查指定名字的屬性是否存在而且能夠用for/in循環枚舉
返回該對象的一個本地化的字符串表示
返回該對象的一個字符串表示
返回當前對象的原始值,若是存在原始值的話。
靜態方法:
使用指定的原型及屬性建立一個新的對象
建立或配置指定對象的一個或多個屬性
建立或配置指定對象的某個屬性
將指定對象設置爲不可改變
查詢指定對象的指定屬性的特性
返回要給包含指定對象的全部非繼承屬性名的數組,包含不可枚舉屬性
返回指定對象的原型
檢查當前對象是否能添加到新的屬性中
檢查當前對象是否已凍結
檢查指定對象是否爲封閉的
返回一個包含指定對象的全部非繼承可枚舉屬性名的數組
阻止像指定對象添加新的屬性
阻止向指定對象添加新屬性或刪除現有屬性
Object類是JavaScript語言的內置數據類型。它是全部其餘JavaScript對象的超類,所以,Object類的全部方法和行爲都被其餘對象繼承了。
全部對象的constructor屬性都指向用作當前對象的構造函數的那個函數。若是使用Array()
構造函數建立一個數組a,則a.constructor是一個Array
:
a = new Array(1,2,3); //建立一個對象
a.constructor == Array // 值爲true
複製代碼
檢測是不是一個數組:
function isArray(x) {
return ((typeof x == "object") && (x.constructor == Array));
}
複製代碼
constructor
屬性常常用於檢測未知對象的類型。給定一個未知的值,可使用typeof
操做符來檢查它是一個原始值仍是一個對象。
若是它是一個對象,則可使用constructor
屬性來檢查對象的類型。
Object.create(proto)
Object.create(proto,descriptors)
複製代碼
參數:
// proto
新建立對象的原型,可爲null
// descriptors
一個可選對象,把屬性名映射到屬性描述符
// 返回
一個新建立的對象,繼承自proto,同時擁有descriptiors所描述的屬性
複製代碼
示例:
// 建立一個對象,有x,y屬性,同時繼承屬性z
var p = Object.create({z:0},{
x: {value:1,writable: false, enumerable: true, configurable: true},
y: {value:2,writable: false, enumerable: true, configurable: true},
});
複製代碼
Object.defineProperties();
建立或配置對象的多個屬性
// o
要在其上建立或配置屬性的對象
// descriptors
將屬性名映射到屬性描述符的對象
// 返回
對象o
複製代碼
示例:
// 把只讀屬性x和y添加到新建立的對象中
var p = Object.defineProperties({},{
x: {value:1,writable: false, enumerable: true, configurable: true},
y: {value:2,writable: false, enumerable: true, configurable: true},
});
複製代碼
Object.defineProperty()
建立或配置對象的一個屬性
Object.defineProperty(o, name, desc)
複製代碼
參數:
// o
將在其上建立或配置屬性的對象
// name
將建立或配置的屬性的名字
// desc
一個屬性描述符對象,描述要建立的新屬性或現有屬性的修改
// 返回
對象o
複製代碼
示例:
function constant(o, n, v) {
// 定義一個值爲v的常量o.n
Object.defineProperty(o, n, {value: v, writable: false, enumerable: true, configurable: false});
}
複製代碼
Object.freeze()
將一個對象設置爲不可改變,凍結對象是一個永久性的操做,一旦凍結,就不能解凍。Object.freeze()只設置數據屬性的可寫特性,那些有對應setter函數的屬性不會受到影響,Object.freeze()不會影響繼承屬性。
Object.getOwnPropertyDescriptor()
查詢一個屬性的特性
Object.getOwnPropertyDescriptor(o,name)
複製代碼
參數:
// o
待查詢其屬性特性的對象
// name
待查詢的屬性名
// 返回
指定對象指定屬性的一個屬性描述符對象,若是不存在指定屬性則返回undefined
// 描述
屬性描述符是一個對象,描述該屬性的特性和值
複製代碼
數據屬性有一個值以及三個性質:
訪問器屬性有一個getter和setter方法,以及可枚舉性和可配置性。
數據屬性的描述符:
{
value:
writable:
enumerable:
configurable:
}
複製代碼
訪問器屬性的描述符:
{
get:
set:
enumerable:
configurable:
}
複製代碼
Object.getOwnPropertyNames()
返回非繼承屬性的名字
Object.getOwnPropertyNames(o);
// o 一個對象
複製代碼
返回,一個包含o的多有非繼承屬性的名字的數組,包含那些不可枚舉的屬性
Object.getOwnPropertyNames([]) // ["length"]: "length" 不可枚舉
複製代碼
Object.getPrototypeOf()
返回一個對象的原型
var p = {}, // 一個原始對象
Object.getPrototypeOf(p); // Object.prototype
var o = Object.create(p); // 一個繼承p的對象
Object.getPrototypeOf(o); // p
複製代碼
Object.hasOwnProperty()
檢查一個屬性是不是繼承的
示例:
var o = new Object(); // 建立一個對象
o.x = 3.14; // 定義一個非繼承的本地屬性
o.hasOwnProperty("x"); //返回true,x是o的本地屬性
o.hasOwnProperty("y"); // false , o沒有屬性y
o.hasOwnProperty("toString"); //返回false,該屬性是繼承屬性
複製代碼
Object.isExtensible()
判斷某個對象上是否能夠添加新屬性
示例:
var o = {}; // 新建立一個對象
Object.isExtensible(o); // true,它是可擴展的
Object.preventExtensions(o); // 將它設置爲不可擴展的
Object.isExtensible(o); // false
複製代碼
Object.isFrozen()判斷對象是否不可改變
Object.isPrototypeOf()判斷當前對象是否爲另外一個對象的原型
var o = new Object();
Object.prototype.isPrototypeOf(o); // true: o是一個對象
Function.prototype.isPrototypeOf(o.toString); // true,toString是一個函數
Array.prototype.isPrototypeOf([1,2,3]); // true
o.constructor == Object // true
複製代碼
Object.isSealed()判斷一個對象的屬性是否可添加或刪除
Object.keys()返回自有的可枚舉的屬性名
Object.keys({x:1,y:2}); // ["x","y"]
複製代碼
Object.preventExtensions()
禁止在一個對象上添加新的屬性
Object.propertyIsEnumerable()
檢測某個屬性是否在for/in
循環中可見
var o = new Object();
o.x=12;
o.propertyIsEnumerable("x"); // true
o.propertyIsEnumerable("y"); // false
o.propertyIsEnumerable("toString"); // false
複製代碼
Object.seal()阻止添加或刪除對象的屬性
Object.toLocaleString()返回對象的本地化的字符串表示
Object.toString()定義一個對象的字符串表示形式
Object.valueOf()給定對象的原始值
parseFloat()將一個字符串轉爲數字
parseInt()將一個字符串轉爲整數
String()字符串支持
方法:
取出一個字符串中指定位置的字符
返回一個字符串中指定位置的字符的編碼
將一個或多個值鏈接成一個字符串
在指定字符串中尋找一個字符或字串
在指定字符串中向後尋找一個字符或字串
使用本地定義的順序比較字符串
使用正則表達式執行查找與替換操做
在一個字符串中查找匹配某個正則表達式的字串
返回字符串的一個切片或子串
在指定的分隔符字符串或正則表達式處斷開,將一個字符串分隔爲由字符串組成的數組
提取字符串的一個字串,subString()的一個變體
提取字符串的一個字串
返回原始的字符串值
返回原始的字符串值
❤️關注+點贊+收藏+評論+轉發❤️
我是Jeskson
(達達前端),感謝各位人才的:點贊、收藏和評論,咱們下期見!(如本文內容有地方講解有誤,歡迎指出☞謝謝,一塊兒學習了)
文章持續更新,能夠微信搜一搜「 程序員哆啦A夢 」第一時間閱讀,回覆【資料】有我準備的一線大廠資料,本文 www.dadaqianduan.cn/#/ 已經收錄
github
收錄,歡迎Star
:github.com/webVueBlog/…