ES5、ES6、ES7、ES8
ES5、ES6、ES7、ES8
ES5
在JS文件或是函數的頂部添加"use strict"即可啟用嚴格模式。
在嚴格模式下運行腳本,不少導致提醒或bug行為的事情會拋出錯誤,例如:
(1)變量聲明必須用var
在常規模式下,如果我們聲明一個變量時省略了var關鍵字,解析引擎會自動將其聲明為全局變量,但在嚴格模式下,會直接拋出異常,不會為我們轉為全局變量
function strict() {'use strict';myVariable = 3; //Uncaught ReferenceError: myVariable is not defined }(2)禁止刪除變量和對象中不可刪除的屬性
通過var聲明的變量是不可刪除的,在常規模式下,試圖刪除會靜默失敗,但在嚴格模式下會顯式拋出異常;同樣的,試圖刪除對象中不可刪除的屬性也會顯式報錯:
'use strict'; var a = 3; delete a; //Uncaught SyntaxError: ...delete Object.prototype; //Uncaught TypeError: ...var animal = {}; Object.defineProperty(animal, 'name', { configurable: false, value: 'GOT' });delete animal.name; //Uncaught TypeError: ...(3) 禁止對象屬性重名
常規模式下,如果我們在對象中定義重復的屬性,后定義的值會覆蓋先定義的那個,ES5的嚴格模式規定,對象中不允許定義重復的屬性,否則會顯式報錯。
'use strict'; var animal = { name: 'BABY' name: 'HUA' }; console.log(person.name); // Uncaught SyntaxError: Unexpected identifier(4)禁止函數參數同名
嚴格模式要求命名函數的參數必須唯一。
'use strict'; var b = 0; function sum(a, a, c) { //Uncaught SyntaxError: ...return a + b + c; }console.log(sum(1, 2, 3)); // Uncaught SyntaxError: Duplicate parameter name not allowed in this context只能在腳本的頂級或者函數內部聲明函數。在if語句中聲明函數會報錯:
'use strict'; if (true) {function show() {// ...} }(5)禁止使用八進制數字
以0開頭的八進制數字常常會讓開發者迷惑,嚴格模式禁止以0開頭的八機制表示法,另外,ES6已經支持新的語法標準,八進制以0o來表示,這樣一來就與16進制的0x形成統一的語法格式
'use strict'; var a = 017; //Uncaught SyntaxError: Octal literals are not allowed in strict mode.var b = 0o17; //ES6 Octal syntax: 8 + 7 = 15(6) 禁止使用with語句.
'use strict';var name = 'GOT';var animal = getAminal();with(animal) { //Uncaught SyntaxError: Strict mode code may not include a with statementname = newName; }(7)強制為eval創建新作用域
常規模式下,使用eval函數可能會影響當前作用域或全局作用域,給程序的運行結果帶來不確定性,嚴格模式為JavaScript程序創建了第三種作用域:eval作用域。eval函數中的字符串只能在eval作用域內運行,其結果不會影響外層作用域,下面這兩種形式都可以使eval在嚴格模式下運行
'use strict'; function show() {eval("var x = 10"); alert(x); // Uncaught ReferenceError: x is not defined } show();(8)eval和arguments
嚴格模式下,禁止使用eval和arguments作為標識符,也不允許讀寫他們的值;
'use strict'; var eval = 19; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode var arguments = 'hello';(9)抑制this
非嚴格模式下,apply和call方法,null或undefined轉成全局對象;嚴格模式下,函數的this始終是指定的值;
'use strict'; var a = 'hello'; function show() {alert(this.a); // Uncaught TypeError: Cannot read property 'a' of null } show.call(null);2. JSON對象
JSON用于js原生對象和json字符串之間的轉換。
JSON.parse(text [, reviver])JSON.parse接受文本(JSON格式)并轉換成一個ECMAScript值。將json字符串轉成js原生對象;
var str = '{"result":true, "count":42}'; var jsonObj = JSON.parse(str); console.log(jsonObj); // {result: true, count: 42} console.log(typeof jsonObj); // objectJSON.stringify()
將一個js原生對象轉化為json字符串;
4. Object對象方法擴展
Object.defineProperty()
Object.defineProperty(obj, prop, descriptor)
descriptor:
數據描述符:
configurable: false,
enumerable: false,
value,
writable: false
存取描述符:
configurable: false,
enumerable: false,
set: undefined,
get: undefined
默認情況下,使用 Object.defineProperty() 添加的屬性值(不是修改定義的屬性)是不可修改(immutable)的,不可枚舉的,不可刪除的
通過賦值操作添加的普通屬性是可枚舉的,在枚舉對象屬性時會被枚舉到(for…in 或 Object.keys 方法),可以改變這些屬性的值,也可以刪除這些屬性。
configurable
當且僅當該屬性的 configurable 鍵值為 true 時,該屬性的描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。
默認為 false。
enumerable
當且僅當該屬性的 enumerable 鍵值為 true 時,該屬性才會出現在對象的枚舉屬性中。
默認為 false。
5. 數組的擴展
6. Function的擴展
ES6
let和const命令
變量的解構賦值
字符串的擴展
正則的擴展
數值的擴展
函數的擴展
數組的擴展
對象的擴展
Symbol
Set和Map數據結構
Proxy和Reflect
Iterator和for…of…
總結
以上是生活随笔為你收集整理的ES5、ES6、ES7、ES8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVASCRIPT发展历程
- 下一篇: ajax、jsonp简单封装