摘要:它用來比較兩個值是否嚴格相等,與嚴格比較運算符的行為基本一致。兩個對象的地址不一樣與嚴格比較運算符的不同之處只有兩個一是不等于,二是等于自身基本用法方法用于對象的合并,將源對象的所有可枚舉屬性,賦值到目標對象。
這是ES6的入門篇教程的筆記,網址:鏈接描述,以下內容中粗體+斜體表示大標題,粗體是小標題,還有一些重點;斜體表示對于自身,還需要下功夫學習的內容。這里面有一些自己的見解,所以若是發現問題,歡迎指出~
上一篇es5的到最后令人崩潰,看來深層的東西還是不太熟,希望這次不要這樣了!!!
1、屬性的簡潔表示法
ES6允許直接寫入變量和函數,作為對象的屬性和方法,這樣的書寫更加簡潔。
const foo = "bar"; const baz = {foo}; baz // {foo: "bar"} // 等同于 const baz = {foo: foo}; // 在對象之中,直接寫變量,這時,屬性名為變量名,屬性值為變量值
除了屬性簡寫,方法也可以簡寫。
const o = { method() { return "Hello!"; } }; // 等同于 const o = { method: function() { return "Hello!"; } }; // 一個實際的例子 let birth = "2000/01/01"; const Person = { name: "張三", birth, // 等同于 birth: birth hello() { console.log("我的名字是", this.name); } // 等同于hello: function ()... }; module.exports = { getItem, setItem, clear }; // 等同于 module.exports = { getItem: getItem, setItem: setItem, clear: clear };
2、屬性名表達式
JavaScript定義對象的屬性,有兩種方法。
obj.foo = true; // 直接用標識符作為屬性名 obj["a" + "bc"] = 123; // 用表達式作為屬性名,這時要將表達式放在方括號之內 // ES6允許字面量定義對象時,用表達式作為對象的屬性名,即把表達式放在**方括號**內 let propKey = "foo"; let obj = { [propKey]: true, ["a" + "bc"]: 123 };
需要注意的是,屬性名表達式與簡潔表示法,不能同時使用,會報錯。
// 報錯 const foo = "bar"; const bar = "abc"; const baz = { [foo] }; // 正確 const foo = "bar"; const baz = { [foo]: "abc" }; // 還需要注意的是,屬性名表達式如果是一個對象,默認情況下會自動將對象轉為字符串[object Object],這一點需要特別的小心
屬性的遍歷
ES6一共有5種方法可以遍歷對象的屬性。
(1)for...in
for...in 循環遍歷對象自身和繼承的可枚舉屬性(不含Symbol屬性)。
(2)Object.keys(obj)
Object.keys返回一個數組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性)的鍵名。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames(obj)返回一個數組,包含對象自身的所有屬性(不含Symbol屬性,但是包括不可枚舉屬性)的鍵名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一個數組,包含對象自身的所有Symbol屬性的鍵名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回一個數組,包含對象自身的所有鍵名,不管Symbol或字符串,也不管是否可枚舉。
擴展運算符
如果擴展運算符后面是一個空對象,則沒有任何效果。
{...{}, a: 1} // { a: 1 } // 如果擴展運算符后面不是對象,則會自動將其轉為對象 {...1} // {} // 數組是特殊的對象,所以對象的擴展運算符也可以用于數組 let foo = { ...["a", "b", "c"] }; foo // {0: "a", 1: "b", 2: "c" }
對象的擴展運算符等同于使用Object.assign()方法。(Object.assign方法只對頂層屬性賦值,并沒有繼續做遞歸,所以它并不是真正的深拷貝。)
let aClone= { ...a }; // 等同于 let aClone = Object.assign({}, a);對象的新增方法
1、Object.is()
ES5比較兩個值是否相等,只有兩個運算符:相等運算符(==)和嚴格相等運算符(===)。兩者都有缺點,(==)會自動轉換數據類型,(===)的NaN不等于自身,以及+0等于-0。JavaScript缺乏一種運算,在所有環境中,只要兩個值是一樣的,它們就應該相等。
ES6提出“Same-value equality”(同值相等)算法,用來解決這個問題。
Object.is就是部署這個算法的新方法。它用來比較兩個值是否嚴格相等,與嚴格比較運算符(===)的行為基本一致。
Object.is("foo", "foo"); // true Object.is({}, {}); // false 兩個對象的地址不一樣 // 與嚴格比較運算符的不同之處只有兩個:一是+0不等于-0,二是NaN等于自身 +0 === -0 // true NaN === NaN // false Object.is(+0, -0); // false Object.is(NaN, NaN); // true
2、Object.assign()
基本用法
Object.assign方法用于對象的合并,將源對象(source)的所有可枚舉屬性,賦值到目標對象(target)。
Object.assign方法的第一個參數是目標對象,后面的參數都是源對象。
const target = { a: 1, b: 1 }; const source1 = { b: 2, c: 2 }; // 目標對象與源對象有同名屬性b const source2 = { c: 3 }; // 多個源對象有同名屬性 Object.assign(target, source1, source2); target; // {a: 1, b: 2, c: 3} 后面的屬性會覆蓋前面的屬性 // 如果參數不是對象,則會先轉成對象,然后返回。 // 由于undefined和null無法轉成對象,所以如果它們作為參數,就會報錯。 Object.assign(undefined); // 報錯 Object.assign(null); // 報錯 // 如果非對象參數出現在源對象的位置(即非首參數),那么處理規則有所不同。首先,這些參數都會轉成對象,如果無法轉成對象,就會跳過。也就是說,如果undefined和null不在首參數,就不會報錯。 let obj = {a: 1}; Object.assign(obj, undefined) === obj; // true Object.assign(obj, null) === obj; // true
注:
(1)淺拷貝
Object.assgin方法實行的是淺拷貝,而不是深拷貝。也就是說,如果源對象某個屬性的值是對象,那么目標對拷貝得到的是這個對象的引用。(對于這個深表懷疑,我覺得Object.assign并不是真正意義上的淺拷貝,其他資料說的是,對其頂層屬性賦值。)
(2)同名屬性的替換
對于這種嵌套的對象,一旦遇到同名屬性,Object.assign的處理方法是替換,而不是添加。
(3)數組的處理
Object.assign可以用來處理數組,但是會把數組視為對象。
Object.assign([1, 2, 3], [4, 5]) // [4, 5, 3] // 上面代碼中,Object.assign把數組視為屬性名為0、1、2的對象,因此源數組的0號屬性4覆蓋了目標數組的0號屬性1。
(4)取值函數的處理
Object.assign只能進行值得賦值,如果要復制的值是一個取值函數,那么將求值后再復制。
const source = { get foo() { return 1} }; const target = {}; Object.assign(target, source); // { foo: 1 }
常見用途
Object.assign方法有很多用處。
(1)為對象添加屬性
class Point { constructor(x, y) { Object.assign(this, {x, y}); } }
(2)為對象添加方法
(3)克隆對象
function clone(origin) { return Object.assign({}, origin); }
emmm,這不是深拷貝,只是對頂層屬性做了賦值。。。
(4)合并多個對象
(5)為屬性指定默認值
4.__proto__屬性,Object.setPrototypeOf(),Object.getPrototypeOf()
JavaScript語言的對象繼承是通過原型鏈實現的。
__proto__屬性
用來讀取或設置當前對象的prototype對象。目前,所有瀏覽器(包括IE11)都部署了這個屬性。
// es5 的寫法 const obj = { method: function() { ... } }; obj.__proto__ = someOtherObj; // es6 的寫法 var obj = Object.create(someOtherObj); obj.method = function() { ... };
實際上,__proto__調用的是Object.prototype.__proto__.
5.Object.keys(), Object.values(), Object.entries()
ES5引入了Object.keys方法,返回一個數組,成員是參數對象自身的(不含繼承的)所有可遍歷(enumerable)屬性的鍵名。
var obj = { foo: "bar", baz: 42 }; Object.keys(obj); // ["foo", "baz"]
ES2017引入了跟Object.keys配套的Object.values和Object.entries,作為遍歷一個對象的補充手段,供for...of循環使用.
Object.entries()
Object.entries()方法返回一個數組,成員是參數對象自身的(不含繼承的)所有可遍歷(enumerable)屬性的價值對數組。
const obj = { foo: "bar", baz: 42 }; Object.entries(obj); // [ ["foo", "bar"], ["baz", 42] ]
除了返回值不一樣,該方法的行為與Object.values基本一致。
Symbol1.概述
ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值。它是JS語言的第七種數據類型,前六種是:undefined、null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。
Symbol值通過Symbol函數生成,也就是說,對象的屬性名現在可以有兩種類型,一種是原來就有的字符串,另一種就是新增的Symbol類型。凡是屬性名屬于Symbol類型,就都是獨一無二的,可以保證不會與其他屬性名產生沖突。
let s = Symbol(); // 注意,Symbol函數前不能使用new命令,否則會報錯。這是因為生成的Symbol是一個原始類型的值,不是對象。 typeof s; // "symbol"
需要注意的是,Symbol函數的參數只是表示對當前Symbol值的描述,因此相同參數的Symbol函數的返回值是不相等的。
// 沒有參數的情況 let s1 = Symbol(); let s2 = Symbol(); s1 === s2; // false // 有參數的情況 let s1 = Symbol("foo"); let s2 = Symbol("foo"); s1 === s2; // false // Symbol值不能與其他類型的值進行運算,會報錯 let sym = Symbol("My symbol"); "your symbol is " + sym; // TypeError: can"t convert symbol to string // 但是Symbol值可以顯示轉為字符串。 let sym = Symbol("My symbol"); String(sym); // "Symbol(My symbol)" sym.toString(); // "Symbol(My symbol)"
......
下面的內容就挑著看了。。。。。
// 去除數組重復成員的方法: [...new Set(array)]; NaN == NaN; // false let set = new Set(); let a = NaN; let b = NaN; set.add(a); set.add(b); set; // Set {NaN} 說明在Set內部,兩個NaN是相等的。 set = new Set(); set.add({}); set.size; // 1 set.add({}); set.size; // 2 說明兩個空對象在Set里面是不相等的。
編程風格
1、塊級作用域
1)let取代var
ES6提出了兩個新的聲明變量的命令:let和const,其中,let完全可以取代var,因為兩者的語義相同,而且let沒有副作用。
2)全局常量和線程安全
在let和const之間,建議優先使用const,尤其是在全局環境,不應該設置變量,只應設置常量。
const比較符合函數式編程思想,運算不改變值,只是新建值,而且這樣也有利于將來的分布式運算;并且JavaSCript編譯器回對const進行優化,多使用const,有利于提高程序的運行效率,也就是說let和const的本質區別,其實是編譯器內部的處理不同。
// bad var a = 1, b = 2, c = 3; // good const a = 1; const b = 2; const c = 3; // best const [a, b, c] = [1, 2, 3];
2、字符串
靜態字符串一律使用單引號或反引號,不使用雙引號。動態字符串使用反引號。
// bad const a = "foobar"; const b = "foo" + a + "bar"; // acceptable const c = `foobar`; // good const a = "foobar"; const b = `foo${a}bar`;
3、解構賦值
使用數組成員對變量賦值時,優先使用解構賦值。
const arr = [1, 2, 3, 4]; // bad const first = arr[0]; const second = arr[1]; // good const [first, second] = arr;
函數的參數如果是對象的成員,優先使用解構賦值。
// bad function getFullName(user) { const firstName = user.firstName; const lastName = user.lastName; } // good function getFullName(obj) { const { firstName, lastName } = obj; } // best function getFullName({ firstName, lastName }) { }
4、對象
單行定義的對象,最后一個成員不以逗號結尾。多行定義的對象,最后一個成員以逗號結尾。
// bad const a = { k1: v1, k2: v2, }; const b = { k1: v1, k2: v2 }; // good const a = { k1: v1, k2: v2 }; const b = { k1: v1, k2: v2 };
對象盡量靜態化,一旦定義,就不得隨意添加新的屬性。如果添加屬性可不避免,要使用Object.assign方法。
// bad const a = {}; a.x = 3; // if reshape unavoidable const a = {}; Object.assign(a, { x: 3 }); // good const a = { x: null }; a.x = 3;
如果對象的屬性名是動態的,可以在創造對象的時候,使用屬性表達式定義。
// bad const obj = { id: 5, name: "San Francisco", }; obj[getKey("enabled")] = true; // good const obj = { id: 5, name: "San Francisco", [getKey("enabled")]: true }; // 對象的屬性和方法,盡量采用簡潔表達式,這樣易于描述和書寫 var ref = "some value"; // bad const atom = { ref: ref, value: 1, addValue: function (value) { return atom.value + value; }, }; // good const atom = { ref, value: 1, addValue(value) { return atom.value + value; }, };
5、數組
使用擴展運算符(...)拷貝數組。
// bad const len = items.length; const itemsCopy = []; let i ; for(i = 0; i < len; i++) { itemsCopy[i] = items[i]; } // good const itemsCopy = [...items];
使用Array.from方法,將類似數組的對象轉為數組。
const foo = document.querySelectorAll(".foo"); const nodes = Array.form(foo);
6、函數
立即執行函數可以寫成箭頭函數的形式。
(() => { console.log("Welcome to the Internet."); })();
那些使用匿名函數當作參數的場合,盡量用箭頭函數代替,因為這樣更簡潔,而且綁定了this。
// bad [1, 2, 3].map(function (x) { return x * x; }); // good [1, 2, 3].map((x) => { return x * x; }); // bset [1, 2, 3].map(x => x * x);
使用默認值語法設置函數參數的默認值。
// bad function handleThings(opts) { opts = opts || {}; } // good function handleThings(opts = {}) {}
9、模塊
Module語法是JavaScript模塊的標準寫法。使用import取代require。
// bad const moduleA = require("moduleA"); const func1 = moduleA.func1; const func2 = moduleA.func2; // good import { func1, func2 } from "moduleA";
使用export取代module.exports。
// commonJS的寫法 var React = require("react")" var Breadcrumbs = React.createClass=({ render() { return ; } }); module.exports = Breadcrumbs; // ES6的寫法 import React from "react"; class Breadcrumbs extends React.Component { render() { return ; } }; export default Breadcrumbs; // 如果模塊只有一個輸出值,就是用export default,如果模塊有多個輸出值,就不適用export default,export default與普通的export不要同時是用。
不要在模塊輸入中使用通配符。因為這樣可以確保你的模塊之中,有一個默認輸出(export default)。
// bad import * ad myObject from "./importModule"; // good import myObject from "./importModule";
如果模塊默認輸出一個函數,函數名的首字母應該小寫;如果模塊默認輸出一個對象,對象名的首字母應該大寫。
function makeStyleGuide() {} export default makeStyleGuide; const StyleGuide = { es6: {} } export default StyleGuide;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106807.html
摘要:更新了個版本,最新正式版是語言的下一代標準,早已在年月正式發布。基本不支持移動端瀏覽器對的支持情況版起便可以支持的新特性。比較通用的工具方案有,,,等。 1、ECMAScript是什么? 和 JavaScript 有著怎樣的關系? 1996 年 11 月,Netscape 創造了javascript并將其提交給了標準化組織 ECMA,次年,ECMA 發布 262 號標準文件(ECMA-...
摘要:但是在中,可以通過關鍵字來實現類的繼承的使用可以使得繼承意義更加明確并且值得一提的是,如果你使用來定義的組件,那么可以在類的構造器里面,用簡單的的聲明方式來替代方法。 原文:The 10 min ES6 course for the beginner React Developer譯者:Jim Xiao 著名的80/20定律可以用來解釋React和ES6的關系。因為ES6增加了超過75...
摘要:的翻譯文檔由的維護很多人說,阮老師已經有一本關于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:最近重構了一個項目,引入了部分用法,最大的感受是讓這門語言變得更加嚴謹,更加方便。通過該方法獲得位置后還得比較一次才能判斷是否存在。再來看看的寫法使用數組來初始化一個,構造器能確保不重復地使用這些值。下面提供鏈接,供有興趣的朋友參考。 最近重構了一個SPA項目,引入了部分ES6用法,最大的感受是ES6讓javascript這門語言變得更加嚴謹,更加方便。本篇將結合實戰經驗,對最常用的部...
摘要:,正式名稱是,但是這個名稱更加簡潔。已經不再是最新的標準,但是它已經廣泛用于編程實踐中。而制定了模塊功能。自從年雙十一正式上線,累計處理了億錯誤事件,得到了金山軟件等眾多知名用戶的認可。 譯者按: 人生苦短,我用ES6。 原文: Top 10 ES6 Features Every Busy JavaScript Developer Must Know 譯者: Fundebug 為了保...
摘要:常量變量先說說常量和變量的概念吧,常量是說那種進行一次賦值后不會更改的值,比如說游戲賬戶的,變量是說賦值后有更改的需求的,比如游戲名,游戲密碼。常用實例交換變量的值提取數據解構賦值對提取對象中的數據,尤其有用。 本系列文章適合快速掌握 ES6 入門語法,想深入學習 ES6 的小伙伴可以看看阮一峰老師的《ECMAScript 6 入門》 學習 20% 的知識完成 80% 的工作 關于 ...
閱讀 791·2021-08-23 09:46
閱讀 939·2019-08-30 15:44
閱讀 2595·2019-08-30 13:53
閱讀 3046·2019-08-29 12:48
閱讀 3863·2019-08-26 13:46
閱讀 1789·2019-08-26 13:36
閱讀 3516·2019-08-26 11:46
閱讀 1416·2019-08-26 10:48