前言作者:陳大魚頭
github: KRISACHAN
剛剛看了掘金上一篇文章《作為技術面試官,為什么把你pass了》,里面第一題就是用es5實現const,據作者反饋 這一題所有的面試者都沒有回答出來,感覺挺可惜的,其實這是一道比較簡單的題目,但是由于涉及到了一些Object對象屬性描述符的知識,這些描述符往往用到的場景不多,所以不容易記住。
屬性描述符: 對象里目前的屬性描述符有兩種:數據描述符:具有值的屬性
存取描述符:由getter與setter函數對描述的屬性
描述符功能:configurable:當前對象元素的屬性描述符是否可改,是否可刪除
enumerable:當前對象元素是否可枚舉
value: 當前對象元素的值
writable:當前對象元素的值是否可修改
get:讀取元素屬性值時的操作
set:修改元素屬性值時的操作
描述符可同時具有的鍵值:configurable | enumerable | value | writable | get | set | |
---|---|---|---|---|---|---|
數據描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
由于ES5環境沒有block的概念,所以是無法百分百實現const,只能是掛載到某個對象下,要么是全局的window,要么就是自定義一個object來當容器
var __const = function __const (data, value) {
window.data = value // 把要定義的data掛載到window下,并賦值value
Object.defineProperty(window, data, { // 利用Object.defineProperty的能力劫持當前對象,并修改其屬性描述符
enumerable: false,
configurable: false,
get: function () {
return value
},
set: function (data) {
if (data !== value) { // 當要對當前屬性進行賦值時,則拋出錯誤!
throw new TypeError("Assignment to constant variable.")
} else {
return value
}
}
})
}
__const("a", 10)
console.log(a)
delete a
console.log(a)
for (let item in window) { // 因為const定義的屬性在global下也是不存在的,所以用到了enumerable: false來模擬這一功能
if (item === "a") { // 因為不可枚舉,所以不執行
console.log(window[item])
}
}
a = 20 // 報錯
題外話
Vue目前雙向綁定的核心實現思路就是利用Object.defineProperty對get跟set進行劫持,監聽用戶對屬性進行調用以及賦值時的具體情況,從而實現的雙向綁定~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/6907.html
摘要:允許在塊級作用域內聲明函數。上面代碼中,存在全局變量,但是塊級作用域內又聲明了一個局部變量,導致后者綁定這個塊級作用域,所以在聲明變量前,對賦值會報錯。 ES5的作用域 變量起作用的范圍,js中能創建作用域的只能是函數 { let a = 1; var b = 2; } console.log(a); // a is not defined console.log(b); //...
摘要:在搭建過程中,還是會踩很多坑的。如果還不熟悉的話,建議自己搭建一次。開篇 原文地址:www.ccode.live/lentoo/list… 前段時間,看到群里一些小伙伴面試的時候被面試官問到這類題目。平時大家開發vue項目的時候,相信大部分人都是使用 vue-cli腳手架生成的項目架構,然后 npm run install 安裝依賴,npm run serve啟動項目然后就開始寫業務代碼...
摘要:外層作用域不報錯正常輸出塊級作用域與函數聲明規定,函數只能在頂層作用域和函數作用域之中聲明,不能在塊級作用域聲明。規定,塊級作用域之中,函數聲明語句的行為類似于,在塊級作用域之外不可引用。同時,函數聲明還會提升到所在的塊級作用域的頭部。 前言:最近開始看阮一峰老師的《ECMAScript 6 入門》(以下簡稱原...
閱讀 2075·2021-11-24 09:39
閱讀 790·2021-09-30 09:48
閱讀 982·2021-09-22 15:29
閱讀 2419·2019-08-30 14:17
閱讀 1892·2019-08-30 13:50
閱讀 1346·2019-08-30 13:47
閱讀 986·2019-08-30 13:19
閱讀 3425·2019-08-29 16:43