成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript & 6小時了解ES6基本語法

Amos / 1002人閱讀

摘要:返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。參考語法返回一個布爾值與的全等操作符比較兼容環(huán)境把對象的值復(fù)制到另一個對象里淺拷貝定義方法用于將所有可枚舉的屬性的值從一個或多個源對象復(fù)制到目標(biāo)對象。語法要設(shè)置其原型的對象。

一步一步似爪牙。

前言

學(xué)習(xí)es6之前我們可能并不知道es6相比es5差距在哪, 但是這并不妨礙我們站在巨人的肩膀上; 程序員就是要樂于嘗鮮;
學(xué)習(xí)es6最終目的是結(jié)合es5 一起進(jìn)行工程項目開發(fā), 而不是完全拋棄es5 ;
學(xué)習(xí)的方法是文檔為主, 前人的blog為輔助, 實際console為最終標(biāo)準(zhǔn) ;
注意!
留意TODO關(guān)鍵詞

ECMAScript 新功能 & 新特性

http://mp.weixin.qq.com/s?__b...

塊的作用域-let

let 語句聲明一個塊級作用域的本地變量,并且可選的將其初始化為一個值。

參考 : https://developer.mozilla.org...

if (true) {
    console.log(a) // 報錯 : Uncaught ReferenceError: a is not defined(…)
    let a = "js"
} 
// 這里也訪問不到 a

一個作用域不能重復(fù)聲明同一個值

if(true){
    var a = 1;
    if (true) {
        let a = "js" // a == "js"
    } 
    a = 3; // a == 3;
    let a = 2 ; // 報錯Uncaught SyntaxError: Identifier "a" has already been declared ; 

    // 題外話, 在console中, 產(chǎn)生報錯后a的內(nèi)存指引被清除, 可以重新賦值
    let a = 0; // a == 0
    // 但實際開發(fā)中, 產(chǎn)生報錯, 后面的代碼不再執(zhí)行, 所以不會有這種情況產(chǎn)生
}
恒量-const

const 語句聲明一個塊級作用域的本地常量, 必須有值且不能為null, 不能再更改(僅可讀)。

參考 : https://developer.mozilla.org...

const a = 1;
a = 2; // 報錯 : Uncaught TypeError: Assignment to constant variable.(…)

const聲明的數(shù)組, 對象, 還可以進(jìn)行增改查, 但是不能重新定義

const a = [];
    a.push(2)   // a == [2]

const b = {};
    b.a = a ;   // 包含了a數(shù)組的對象

只在聲明的作用域有效(與let一樣)

if(true){
    const c = 1;
} 
// 此處訪問會報錯:   Uncaught ReferenceError: c is not defined(…)

總結(jié): 可以把const理解為let的常量版(不可改的let)

解構(gòu)數(shù)組-Array Destructuring
參考:

http://www.cnblogs.com/weiwei...

https://developer.mozilla.org...

數(shù)組的新語法

let [a, b, c] = [1, 2, 3];
// 即: let a = 1;let b = 2;let c = 3;

let [bar, foo] = [1];
// 解構(gòu)失敗: undefined
// 即: let bar = 1; let foo = undefined

let [a] = 1;
// 等號的右邊不是數(shù)組 (或者嚴(yán)格地說,不是可遍歷的解構(gòu))
// 報錯:VM2799:2 Uncaught TypeError: undefined is not a function(…)

// 如果賦值的字面量全等undefined, 則默認(rèn)值生效
let [x = 1] = [undefined];// x  === 1
let [x = 1] = [];//x  ===  1

// null 不全等 undefined, 所以默認(rèn)值不生效
let [x = 1] = [null];// x  === null

進(jìn)階語法

// 解構(gòu)賦值允許指定默認(rèn)值。
let [foo = true] = []; // 即: foo === true

坑!小心

function f() {
  console.log("aaa");
}
let [x = f()] = [1];// x === 1
// 此處f函數(shù)并沒有執(zhí)行; 如果是es5, 在賦值過程中, 肯定會先執(zhí)行f()方法: log("aaa")
// es6 沒有執(zhí)行f方法, 經(jīng)過粗略查閱文檔, 百谷后, 并沒有得到答案; 生命有限, 留待日后, TODO
// 在與`MeatHill`老師交流過后,得知 , 在此處后面有具體的值,就不需要計算默認(rèn)值, 賦值是從右往左運行

奇奇怪怪的, 我猜可能會出面試題

let [x = 1, y = x] = [];   // x == 1; y == 1; 
 
let [x = 1, y = x] = [2];  // x == 2; y == 2; 別急, 一步一步來
// 第一步: x = 2(賦值從右到左, x = 1 不會計算);
// 第二步: y = x = 2;

let [x = 1, y = x] = [1, 2]; // 答案呢? 留著想

let [x = y, y = 1] = [];  
// 第一步  x = y ; y未聲明報錯
解構(gòu)對象-Object Destructuring

對象的解構(gòu)與數(shù)組有一個重要的不同。數(shù)組的元素是按次序排列的,變量的取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。

語法

let { foo, bar } = { foo: "aaa", bar: "bbb" }; 
// 變量必須與屬性重名
// 以上其實是 let { foo : foo, bar : bar } = { foo: "aaa", bar: "bbb" };的簡寫;  
// 對象的解構(gòu)賦值的內(nèi)部機(jī)制,是先找到同名屬性,然后再賦給對應(yīng)的變量。真正被賦值的是后者,而不是前者
// foo === "aaa"; bar === "bbb"


let {foo} = {bar: "baz"}; 
// foo === undefined


let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
// 數(shù)值也屬于對象的一種表現(xiàn)形式

默認(rèn)值

let {x = 3} = {x: undefined};
// x === 3
// 默認(rèn)值生效的條件是,對象的屬性值嚴(yán)格等于undefined。

注意

let { foo: baz } = { foo: "aaa", bar: "bbb" };
// 上面代碼中,foo是匹配的模式,baz才是變量。真正被賦值的是變量baz,而不是模式foo。

高階(解析嵌套結(jié)構(gòu))

let obj = {
  p: [
    "Hello",
    { y: "World" }
  ]
};
let { p: [x, { y }] } = obj
// 注意,這時p是模式,不是變量,因此不會被賦值。

疑難雜癥

let {foo: {bar}} = {baz: "baz"};
// 報錯 : VM3721:2 Uncaught TypeError: Cannot match against "undefined" or "null".(…)
// 報錯 : 等號左邊對象的foo屬性,對應(yīng)一個子對象。該子對象的bar屬性,解構(gòu)時會報錯。原因很簡單,因為foo這時等于undefined,再取子屬性就會報錯

let x;
{x} = {x: 1};
// 報錯: 因為JavaScript引擎會將{x}理解成一個代碼塊,從而發(fā)生語法錯誤。
// 應(yīng)該不將大括號寫在行首,避免JavaScript將其解釋為代碼塊, 正確的寫法:
let x;
({x} = {x: 1})

其他數(shù)據(jù)的解構(gòu)-Object Destructuring 函數(shù)參數(shù)的解構(gòu)(解構(gòu)參數(shù) - Destructured Parameters)
// 第三個參數(shù)默認(rèn)值為 {}
function demo(a, b, {c , d} = {}){
    console.log(a, b, c, d)
    // 1  2 "c" "d"
}
demo(1, 2, {c : "c", d:"d"})
字符串的解構(gòu)賦值
let [a, b, c, d, e] = "hello"
// a === "h", b === "e", ......

let {length} = "hello";
// length === 5
// 類似數(shù)組的對象都有一個length屬性,因此還可以對這個屬性解構(gòu)賦值

小總結(jié)

數(shù)組的解構(gòu)賦值對應(yīng)的是位置

// 所以可以交換變量的值
let x = 1;
let y = 2;
[x, y] = [y, x];

對象對應(yīng)的是鍵名

解構(gòu)的意義

數(shù)組結(jié)構(gòu)可以方便快速的交換變量的值

接受函數(shù)return的值, 如果函數(shù)返回array或者object, 利用解構(gòu)方便快捷

解析JSON數(shù)據(jù)

代替 ||

模版字符串-Template Strings
參考

https://developer.mozilla.org...

http://www.webfront-js.com/ar...

概念

${} 關(guān)鍵詞

反引號包裹字符串

語法

let name = "Bob", 
    time = "today";
console.log(`Hello ${name}, how are you ${time}?`)
// 模板字符串都是用反引號表示,如果在模板字符串中需要使用反引號,則前面需要用反斜杠轉(zhuǎn)義

多行字符串

console.log(`string text line 1
string text line 2`);
// "string text line 1
// string text line 2"
帶標(biāo)簽的模版字符串-Tagged Templates
參考

https://developer.mozilla.org...

function a(b, ...c){
    console.log(b)
    // ["我的年齡是", ",我的性別是", "", raw: Array[3]]

    console.log(c)
    // Array : ["1", "nan"]
}
let d = "1";
a`我的年齡是$qoyqs8suu2u,我的性別是${f}`

在標(biāo)簽函數(shù)的第一個參數(shù)中,存在一個特殊的屬性raw ,我們可以通過它來訪問模板字符串的原始字符串

判斷字符串里是否包含其他字符串

傳統(tǒng)上,JavaScript只有indexOf方法,可以用來確定一個字符串是否包含在另一個字符串中。ES6又為String對象擴(kuò)展了三種新方法。

參考

includes : https://developer.mozilla.org...

startsWith : https://developer.mozilla.org...

endsWith : https://developer.mozilla.org...

includes():返回布爾值,表示是否找到了參數(shù)字符串。

"Blue Whale".includes("blue"); // return false
"Blue Whale".includes("Whale" , 2); // return true

startsWith():返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。

"Blue Whale".startsWith("blue"); // return false
"Blue Whale".startsWith("Whale" , 2); // return false
"Blue Whale".startsWith("Whale" , 5); // return true

endsWith():返回布爾值,表示參數(shù)字符串是否在源字符串的尾部。

"Blue Whale".endsWith("blue"); // return false
"Blue Whale".endsWith("Whale" , 10); // return true
"0Blue".endsWith("Blue" , 5); // return true
默認(rèn)參數(shù) - Default Parameter Values
以前es5 : 
function makeRequest(url, timeout, callback) {
    timeout = timeout || 2000;
    callback = callback || function() {};
    // ...
}

現(xiàn)在es6 :
function makeRequest(url, timeout = 2000, callback = function(){}) {
    // ...
}

如果不傳入?yún)?shù), 或者傳入undefined, 則使用默認(rèn)值;

展開操作符-Spread
參考:

https://developer.mozilla.org...

語法
console.log(...[1, 2, 3])
// 1 2 3

console.log(1, ...[2, 3, 4], 5);
// 1 2 3 4 5
用于函數(shù)調(diào)用
function func(x, y, z, a, b) {
    console.log(x, y, z, a, b);
}
var args = [1, 2];
func(0, ...args, 3, ...[4]); // 0 1 2 3 4
更好的 apply 方法
// es5使用數(shù)組作為參數(shù):
function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction.apply(null, args);

// es6使用數(shù)組作為參數(shù):
function demo(x, y, z) { 
    console.log(x, y, z)
}
var args = [0, 1, 2];
demo(...args); 
淺復(fù)制一個數(shù)組
let arr = [1, 2, 3];
let arr2 = [...arr]; // 就像是 arr.slice()

arr2.push(4); 

console.log(arr2) // [1, 2, 3, 4]
// arr 不受影響
合并數(shù)組
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
var arr3 = [...arr1  , ...arr2]
// arr3 : [0, 1, 2, 3, 4, 5]
將類數(shù)組對象轉(zhuǎn)換成數(shù)組
var nodeList = document.querySelectorAll("div");
var array = [...nodeList];
// 實際: 360瀏覽器報錯 : VM2386:3 Uncaught TypeError: nodeList[Symbol.iterator] is not a function(…)
// 版本: 8.7.0.306

// 火狐為一個空數(shù)組
// 版本:26.0.0.137

// google為undefined
// 版本:57.0.2987.133
剩余操作符Rest - 剩余參數(shù)(rest參數(shù))
參考

https://developer.mozilla.org...

https://developer.mozilla.org...

定義:

剩余參數(shù)只包含那些沒有對應(yīng)形參的實參

語法:
function(a, b, ...restArgs) {
  // ...restArgs 即為剩余參數(shù), 是一個Array對象
}
剩余參數(shù)和 arguments 對象的區(qū)別

剩余參數(shù)只包含那些沒有對應(yīng)形參的實參,而 arguments 對象包含了傳給函數(shù)的所有實參。

arguments 對象不是一個真實的數(shù)組,而剩余參數(shù)是真實的 Array實例,也就是說你能夠在它上面直接使用所有的數(shù)組方法,比如 sort,map,forEach,pop。

arguments 對象對象還有一些附加的屬性 (比如callee屬性)。

實例:
function fun1(...theArgs) {
  alert(theArgs.length);
}
 
fun1();  // 彈出 "0", 因為theArgs沒有元素
fun1(5); // 彈出 "1", 因為theArgs只有一個元素
fun1(5, 6, 7); // 彈出 "3", 因為theArgs有三個元素
Object.keys() - 返回對象可枚舉的鍵
// TODO
函數(shù)的名字-name屬性

函數(shù)的name屬性,返回該函數(shù)的函數(shù)名。
這個屬性早就被瀏覽器廣泛支持,但是直到 ES6 ,才將其寫入了標(biāo)準(zhǔn)。

實例:
function foo() {}  
foo.name // "foo"  
值得一提:

并不完全支持的ES6(360瀏覽器環(huán)境)

var a = function(){}
a.name
// 空字符串: "" 

let b = function(){}
b.name
// 同樣是 ""

解讀:
ES6 對這個屬性的行為做出了一些修改。如果將一個匿名函數(shù)賦值給一個變量, ES5 的name屬性,會返回空字符串,而 ES6 的name屬性會返回實際的函數(shù)名。

但實際上國內(nèi)目前主流瀏覽器支持的還是es5為主, 在node下搭建的es6環(huán)境, 才會返回實際的函數(shù)名(Google測試已經(jīng)支持)

函數(shù)名的優(yōu)先級

let a = function d(demo){}
a.name // "d"
箭頭函數(shù)-Arrow Fuctions

重點:
!箭頭函數(shù)會捕獲其所在上下文的 this 值,作為自己的 this 值
!也就是可以理解為: 箭頭函數(shù)沒有自己的this, 如果上下文沒有this, 則this指向Window對象

參考

ES6-this[MDN} : https://developer.mozilla.org...

什么時候不該使用箭頭函數(shù):https://segmentfault.com/a/11...

語法

基礎(chǔ)語法

let demoFun = oArgument => oDessert
// demoFun 為函數(shù)名
// oArgument 為函數(shù)形參
// oDessert 為返回的值


let func = (x, y) => { return x + y; }; 
//常規(guī)編寫 明確的返回值

高級語法

let demoFun = (oArgument, drink) => oArgument + drink
// 返回的是 oArgument + drink

let demoFun = params => ({foo: bar})
//返回一個對象時,函數(shù)體外要加圓括號

let demoFun = (param1, param2, ...rest) => { statements }
// 支持 剩余參數(shù)和默認(rèn)參數(shù):
描述

不綁定 this

箭頭函數(shù)會捕獲其所在上下文的 this 值,作為自己的 this 值,因此下面的代碼將如期運行。

function Person() {  
    this.age = 0;  
    setInterval(() => {
        // 回調(diào)里面的 `this` 變量就指向了期望的那個對象了
        this.age++;
    }, 3000);
}
var p = new Person();

箭頭函數(shù)沒有自己的 arguments

var arr = () => arguments;
arr();  // Uncaught ReferenceError: arguments is not defined(…)

箭頭函數(shù)不能用作構(gòu)造器,和 new 一起用就會拋出錯誤。

var Foo = () => {};
var foo = new Foo();  // TypeError: Foo is not a constructor

箭頭函數(shù)沒有原型屬性。

var Foo = () => {};
console.log(Foo.prototype); // undefined

箭頭不是操作符

在箭頭函數(shù)中的箭頭不是操作符(或者運算符,就像"+ -"那些), 但是箭頭函數(shù)有特殊的解析規(guī)則就是:相比普通的函數(shù),受操作符的優(yōu)先級影響。參考: https://developer.mozilla.org...

let callback;
callback = callback || function() {}; // ok
callback = callback || () => {};      // SyntaxError:非法箭頭函數(shù)屬性
callback = callback || (() => {});    // ok
疑難雜癥

像方法一樣使用箭頭函數(shù)

"use strict";
let obj = {
  i: 10,
  b: () => console.log(this.i, this),
  c: function() {
    console.log( this.i, this)
  }
}
obj.b(); // undefined, Window對象, 此處或許有疑問, 可翻閱?提過的`!`
obj.c(); // 10, Object {...}

不能返回預(yù)期的對象

let func = () => {  foo: 1  };
// undefined

所以,記得用圓括號把文字表達(dá)式包起來:

var func = () => ({ foo: 1 });

箭頭u函數(shù)在某些情況加還是很有便利的, 但是新的語法, 可讀性有所轉(zhuǎn)變, 要多使用, 多看才行

for..of
// TODO
symbol
參考:
https://developer.mozilla.org...
// TODO
對比兩個值是否相等-Object.is()

Object.is() 方法確定兩個值是否是 相同的值。

參考:

https://developer.mozilla.org...

語法
Object.is(value1, value2); // 返回一個布爾值
與ES5 的 全等操作符比較

ES6:

Object.is(NaN, NaN); // true

Object.is(0, -0); // fasle
Object.is(-0, +0) // false

Object.is({},{})  // false

var a = function () {};
var b = function () {};
Object.is(a, b) //false

ES5

NaN === NaN // false;

0 === -0 // true
-0 === +0 // true

{} === {} // false

var a = function () {};
var b = function () {};
a === b //false
兼容ES5 環(huán)境
if (!Object.is) {
  Object.is = function(x, y) {
    // SameValue algorithm
    if (x === y) { // Steps 1-5, 7-10
      // Steps 6.b-6.e: +0 != -0
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // Step 6.a: NaN == NaN
      return x !== x && y !== y;
    }
  };
}
把對象的值復(fù)制到另一個對象里 - Object.assign() - 淺拷貝 定義:

Object.assign() 方法用于將所有可枚舉的屬性的值從一個或多個源對象復(fù)制到目標(biāo)對象。它將返回目標(biāo)對象。

語法:
// target目標(biāo)對象。
// sources(多個)源對象。
Object.assign(target, ...sources)
實例:
var obj = { a: 1 };
var copy = Object.assign({}, obj); // {a: 1}
合并對象:
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign({},o1, o2, o3); // Object {a: 1, b: 2, c: 3}
注意

繼承屬性和不可枚舉屬性是不能拷貝的

原始類型會被包裝為 object

var v1 = "abc";
var v2 = true;
var v3 = 10;
var v4 = Symbol("foo")

var obj = Object.assign({}, v1, null, v2, undefined, v3, v4); 
// 原始類型會被包裝,null 和 undefined 會被忽略。
// 注意,只有字符串的包裝對象才可能有自身可枚舉屬性。
console.log(obj); // { "0": "a", "1": "b", "2": "c" }

異常會打斷接下來的拷貝任務(wù)

設(shè)置對象的 prototype - Object.setPrototypeOf()
參考:

https://developer.mozilla.org...

定義:

Object.setPrototypeOf() 方法設(shè)置一個指定的對象的原型 ( 即, 內(nèi)部[[Prototype]]屬性)到另一個對象或 null。

語法:
Object.setPrototypeOf(obj, prototype)
// obj          要設(shè)置其原型的對象。.
// prototype    該對象的新原型(一個對象 或 null).
實例:
var dict = Object.setPrototypeOf({}, null); // Object {}
proto
參考

https://developer.mozilla.org...

es6 可以設(shè)置對象的__proto__

super
參考: 
https://developer.mozilla.org...
定義:

super 關(guān)鍵字用于調(diào)用一個對象的父對象上的函數(shù)。

迭代器 - Iterators
參考:

MDN -迭代器&生成器 : https://developer.mozilla.org...

ES6學(xué)習(xí)——迭代器(Iterators):迭代器接口高級應(yīng)用 - Challenge Next Challenge - CSDN博客

http://blog.csdn.net/kittyjie...

sf - [譯]迭代器指南 : https://segmentfault.com/a/11...

生成器 - Generators
參考:

MDN -迭代器&生成器 : https://developer.mozilla.org...

Classes - 類

JavaScript 現(xiàn)有的基于原型的繼承的語法糖, 提供了一個更簡單和更清晰的語法來創(chuàng)建對象并處理繼承。

類實際上是個“特殊的函數(shù)”,就像你能夠定義的函數(shù)表達(dá)式和函數(shù)聲明一樣,類語法有兩個組成部分:類表達(dá)式和類聲明。

參考:

sf - ES6探秘 : https://segmentfault.com/a/11...

類聲明

使用class關(guān)鍵字聲明

// 聲明一個類名為 Rectangle  的JS類
// constructor方法用于創(chuàng)建和初始化使用一個類創(chuàng)建的一個對象。只允許存在一個
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

類聲明不會聲明提升

類表達(dá)式

類表達(dá)式可以是被命名的或匿名的。

/* 匿名類 */ 
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};

/* 命名的類 */ 
let Rectangle = class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
this

如果沒有指定this, this值將為undefined。

class Animal { 
  speak() {
    return this;
  }
  static eat() {
    return this;
  }
}

let obj = new Animal();
let speak = obj.speak;
speak(); // undefined

let eat = Animal.eat;
eat(); // undefined
demo :
"use strict"
// 創(chuàng)建一個 Chef 類
class Chef {
    // 初始化
    // 接收參數(shù)
    constructor(food){
        this.food = food;
    }

    cook(){
        console.log(this.food)
    }

}
let qing = new Chef("?")
qing.cook(); // ?
類的 get 與 set
參考:
http://blog.csdn.net/qq_30100...
"use strict"
// 創(chuàng)建一個 Chef 類
class Chef {
    // 初始化
    // 接收參數(shù)
    constructor(food){
        this.food = food;
        this.dishs = [];
    }

    get menu(){
        return this.dishs;
    }

    set menu(dishs){
        this.dishs.push(dish)
    }

    cook(){
        console.log(this.food)
    }

}
let qing = new Chef()
console.log(qing.menu = "?") //?
console.log(qing.menu = "?") // ?
類的靜態(tài)方法-staitc demo
"use strict"
// 創(chuàng)建一個 Chef 類
class Chef {
    // 初始化
    // 接收參數(shù)
    constructor(food){
        this.food = food;
        this.dishs = [];
    }

    get menu(){
        return this.dishs;
    }

    set menu(dishs){
        this.dishs.push(dish)
    }

    static cook(food){
        console.log(food)
    }

}

// 不需要實例化Chef即可以直接使用
Chef.cook("?") 
// 輸出 : ?
類的繼承-extends demo
"use strict"
class Person{
    constructor(name, birthday){
        this.name = name
        this.birthday = birthday
    }

    intro(){
        return `${this.name}, ${this.birthday}`
    }
}

// 使得Chef類 繼承 Person類
class Chef extends Person{
    constructor(name, birthday){
        // 調(diào)用父類的constructor函數(shù) 
        super(name, birthday)
    }
}

let qing = new Chef("qing", "1949-10-1");

// 實例化后才可使用 Chef類 的intro方法
qing.intro() // "qing, 1949-10-1"
Set方法
參考:

MDN - https://developer.mozilla.org...

定義:

Set 對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。

語法:
new Set([iterable]);
// iterable 
// 如果傳遞一個可迭代對象,它的所有元素將被添加到新的 Set中。
// 如果不指定此參數(shù)或其值為null,則新的 Set為空

// 返回值
// 一個新的Set對象。
! 使用Set去重, Set中的元素只會出現(xiàn)一次, Set 中的元素是唯一的
DEMO:

使用Set對象

let mySet = new Set();

mySet.add(1); // {1}
mySet.add(5); // {1, 5}
mySet.add("some text"); //{1, 5, "some text"}

mySet.has(1); // true
mySet.has(3); // false
mySet.has(5); // true
mySet.has(Math.sqrt(25));  // true
mySet.has("Some Text".toLowerCase()); // true

mySet.size; // 返回Set對象的值的個數(shù) : 3

mySet.delete(5); //  從set中移除5并返回true
mySet.delete(8); //  不存在8, 返回false
mySet.has(5);    // false, 5已經(jīng)被移除

mySet.size; // 2, 我們剛剛移除了一個值

// 按照插入順序,為Set對象中的每一個值調(diào)用一次callBackFn。如果提供了thisArg參數(shù),回調(diào)中的this會是這個參數(shù)。
mySet.forEach(callbackFn[, thisArg])

// 與values()方法相同,返回一個新的迭代器對象,該對象包含Set對象中的按插入順序排列的所有元素的值。
mySet.keys()

// 返回一個新的迭代器對象,該對象包含Set對象中的按插入順序排列的所有元素的值。
mySet.values()


mySet.clear() // 清空全部值
與 Array 的聯(lián)系 , 互換
var myArray = ["value1", "value2", "value3"];

// 用Set構(gòu)造器將Array轉(zhuǎn)換為Set
var mySet = new Set(myArray);

mySet.has("value1"); // returns true

// 用...(展開操作符)操作符將Set轉(zhuǎn)換為Array
console.log([...mySet]); // 與myArray完全一致
Map方法
參考:
https://developer.mozilla.org...
定義:

Map 對象保存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。

實例:
var myMap = new Map();
 
var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";
 
// 添加鍵
myMap.set(keyString, "和鍵"a string"關(guān)聯(lián)的值");
myMap.set(keyObj, "和鍵keyObj關(guān)聯(lián)的值");
myMap.set(keyFunc, "和鍵keyFunc關(guān)聯(lián)的值");
 
myMap.size; // 3
 
// 讀取值
myMap.get(keyString);    // "和鍵"a string"關(guān)聯(lián)的值"
myMap.get(keyObj);       // "和鍵keyObj關(guān)聯(lián)的值"
myMap.get(keyFunc);      // "和鍵keyFunc關(guān)聯(lián)的值"
 
myMap.get("a string");   // "和鍵"a string"關(guān)聯(lián)的值"
                         // 因為keyString === "a string"
myMap.get({});           // undefined, 因為keyObj !== {}
myMap.get(function() {}) // undefined, 因為keyFunc !== function () {}
注意:

Map 認(rèn)為 NaN === NaN

var myMap = new Map();
myMap.set(NaN, "not a number");
myMap.get(NaN); // "not a number"
相比較:

Map可以獲得length, Object不可以

Map的鍵可以是任意字, Object的只能為字符串, 或者變量

Map 認(rèn)為 NaN === NaN

Map內(nèi)置很多迭代, 查詢, 操作方法

結(jié)語

花了半天時間學(xué)習(xí)了下ES6的部分新語法丶新特性。 不求精通, 但說涉獵。不實踐怎么來的發(fā)言權(quán) ;

ES6新增了很多方法和功能參數(shù), 但是其實相對于ES5來, 變革性并不是那么大, 學(xué)起來興趣乏乏, 有點像雞肋;

ES6中我最感興趣的是Promise , Class, 期待ES8的異步函數(shù)(Async Functions) ;

項目中打算深入實踐ES6, 畢竟這波不虧 ? ;

原文地址: https://segmentfault.com/a/11...
轉(zhuǎn)載無需聯(lián)系, 但請著名來源 @SF.GG-Starch。程序員就是要敢于, 樂于嘗鮮;

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85066.html

相關(guān)文章

  • 【資源集合】 ES6 元編程(Proxy & Reflect & Symbol)

    摘要:理解元編程和是屬于元編程范疇的,能介入的對象底層操作進(jìn)行的過程中,并加以影響。元編程中的元的概念可以理解為程序本身。中,便是兩個可以用來進(jìn)行元編程的特性。在之后,標(biāo)準(zhǔn)引入了,從而提供比較完善的元編程能力。 導(dǎo)讀 幾年前 ES6 剛出來的時候接觸過 元編程(Metaprogramming)的概念,不過當(dāng)時還沒有深究。今天在應(yīng)用和學(xué)習(xí)中不斷接觸到這概念,比如 mobx 5 中就用到了 Pr...

    aikin 評論0 收藏0
  • ES6 Features系列:Template Strings & Tagged Templ

    摘要:由兩部分組成模板起始符,稱為沉音符反引號,其內(nèi)容被識別為字符串模板。其實這是通過屬性操作中的結(jié)果,也就是說屬性將對控制符進(jìn)行轉(zhuǎn)義從而實現(xiàn)按照普通字符輸出。的語法是緊跟在后面,兩者間不能有空格或制表符等。 1. Brief ES6(ECMAScript 6th edition)于2015年7月份發(fā)布,雖然各大瀏覽器仍未全面支持ES6,但我們可以在后端通過Node.js 0.12和io....

    MyFaith 評論0 收藏0
  • (譯 & 轉(zhuǎn)載) 2016 JavaScript 后起之秀

    摘要:在年成為最大贏家,贏得了實現(xiàn)的風(fēng)暴之戰(zhàn)。和他的競爭者位列第二沒有前端開發(fā)者可以忽視和它的生態(tài)系統(tǒng)。他的殺手級特性是探測功能,通過檢查任何用戶的功能,以直觀的方式讓開發(fā)人員檢查所有端點。 2016 JavaScript 后起之秀 本文轉(zhuǎn)載自:眾成翻譯譯者:zxhycxq鏈接:http://www.zcfy.cc/article/2410原文:https://risingstars2016...

    darry 評論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<