Q:Base64是一種基于64個可打印字符來表示二進制數(shù)據(jù)的一種方法
因為網(wǎng)絡上傳輸?shù)淖址蝗强纱蛴∽址热缍M制文件顾犹,圖片等庭砍,Base64就是為了解決此問題
Base64在URL,Cookie,網(wǎng)頁傳輸二進制文件中等到應用
字符有 A-Z,a-z,0-9,+,/共64個可打印字符
4個Base64(3bit)字符串可以表示3個標準的ascll字符(8bit)
不足三個字符的話拾并,直接最后添加"="揍堰,"=="填充符
轉(zhuǎn)換步驟
- 將轉(zhuǎn)換的字符串每三個字節(jié)分為一組鹏浅,每個字節(jié)占8bit嗅义,共有24個二進制位
- 將上面的24個二進制位每6個一組,分四組
- 在每組前面添加兩個0隐砸,6個bit變?yōu)?個bit之碗,共4個字節(jié)
- 根據(jù)Base64編碼表獲得對應的值
Base64主要用在傳輸,存儲季希,表示二進制領(lǐng)域褪那,不能算的上加密,只是無法直接看到明文
base64編碼圖片 優(yōu)點: - 減少http請求
- 可對數(shù)據(jù)簡單加密
- 沒有跨域問題式塌,無需考慮圖片緩存
Q:能否模擬實現(xiàn)JS的bind方法
1.bind是Function原型鏈中的一個方法博敬,修改this的執(zhí)行,綁定第一個參數(shù)峰尝,返回值是一個新的函數(shù)
2.bind返回的函數(shù)可以通過new 調(diào)用偏窝,這時提供的this指向new生成的全新對象
var obj = {
name: 'mingge'
}
function fn(a,b){
console.log(this.name)
console.log(a+b)
}
var bindfn = fn.bind(obj,3)
bindfn(5) // 'mingge' 8
// 實現(xiàn)代碼
Function.prototype.bind = Function.prototype.bind || function(targetObj){
if(typeof this !== 'function'){throw new TypeError('must be function')}
var self = this
var args = [].slice.call(arguments,1)
// 返回一個新的函數(shù)
// 實現(xiàn) bound 可以使用new 調(diào)用
var bound = function(){
var newArgs = [].slice.call(arguments)
var finalArgs = args.concat(newArgs)
if(this instanceof bound){
if(self.prototype){
bound.prototype = Object.create(self.prototype)
}
// 如果返回的不是引用類型的值,就返回this
// 生成的新對象會綁定到函數(shù)調(diào)用的this上
var result = self.apply(this, finalArgs)
var isObject = typeof result === 'object' && result !== null
var isFunction = typeof result === 'function'
if(isObject || ifFunction) {return result}
return this
}
return self.apply(targetObj, finalArgs )
}
return bound
}
Q:能否模擬實現(xiàn)JS的new操作符
new 做了什么
- 創(chuàng)建一個全新的對象
- 這個對象會被執(zhí)行[[prototype]]鏈接,指向原型對象
- 生成的新對象會綁定到構(gòu)造函數(shù)內(nèi)部的this
- 通過new 創(chuàng)建的每個對象將最終被[[prototype]]鏈接到這個函數(shù)的prototype對象上
- 如果函數(shù)沒有返回對象類型object祭往,那么new表達式中的函數(shù)調(diào)用會自動返回這個新的對象
/**
*模擬實現(xiàn)new操作符
*@param {Function} ctor [構(gòu)造函數(shù)]
*@return{引用類型}*/
function new(ctor) {
if(typeof ctor !== 'function'){
throw new Error('must be a function')
}
// 實現(xiàn)ES6 new.target 的指向構(gòu)造函數(shù)
new.target = ctor
//1.創(chuàng)建一個新對象
//2.并且執(zhí)行[[prototype]]鏈接
//4.通過new創(chuàng)建的每個對象將最終被[[prototype]]鏈接到這個函數(shù)的原型對象上
var newObj = Object.create(ctor.prototype)
var args = [].slice.call(arguments,1)//去掉ctor的全部參數(shù)
// 3.將生成的新對象實例會綁定到構(gòu)造函數(shù)內(nèi)部的this
// 并獲取到返回結(jié)果
var result = ctor.apply(newObj, args)
var isObject = typeof result === 'object' && result !== null
var isFunction = typeof result === 'function'
if(isObject || isFunction){
return result
}
return newObj
}