前端(七):ES6一些新特性

来源:https://www.cnblogs.com/kuaizifeng/archive/2018/07/17/9325553.html
-Advertisement-
Play Games

一、變數 1.var關鍵字的弊端 var關鍵字的弊端:1.可以重覆聲明變數;2.無法限制變數修改;3.沒有會計作用域,只有函數作用域。 慣用的解決辦法是將onclick寫進一個匿名函數。 2.let和const關鍵字 let和const關鍵字使得變數不可以被重覆聲明,且變數具有塊級作用域。不同的是, ...


一、變數

  1.var關鍵字的弊端

  var關鍵字的弊端:1.可以重覆聲明變數;2.無法限制變數修改;3.沒有會計作用域,只有函數作用域。


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="按鈕1">
<input type="button" value="按鈕2">
<input type="button" value="按鈕3">

<script>
var oBtn = document.getElementsByTagName("input");
for(var i=0; i< oBtn.length; i++){
oBtn[i].onclick = function () {
alert(i); // 三個按鈕都是3
}
}
  // 點擊按鈕alert出來的都是3。因為事件沒觸發時,for迴圈已經遍歷結束,當事件觸發時i的值已經是3了。
</script>
</body>
</html>

  慣用的解決辦法是將onclick寫進一個匿名函數。

for(var i=0; i< oBtn.length; i++){
(function (i) {
oBtn[i].onclick = function () {
alert(i); // 三個按鈕都是3
}
})(i);
}

  2.let和const關鍵字

  let和const關鍵字使得變數不可以被重覆聲明,且變數具有塊級作用域。不同的是,let用來聲明變數,const用來聲明常量(不可被修改的常量)。

  註:在Java中,Java: int a = 123; int a = 12; 報錯,變數不可以重覆聲明,因為它存在堆記憶體中,變數直接代表一塊記憶體空間。而對象的值存在堆中,變數實際上這個對象的引用。js的var同樣應遵循這樣的規則。

// let寫法
for(let i=0; i< oBtn.length; i++){
oBtn[i].onclick = function () {
alert(i); // 三個按鈕都是3
}
}

二、數組

  1.解構賦值

let arr = [1, 2, 3];

// let a = arr[0];
// let b = arr[1];
// let c = arr[2];

// 等價於
let [a, b, c] = [1, 2, 3];
console.log(a, b, c);

let {l, m, n} = {l: 1, m:2, n:3};
console.log(l, m, n);

let [x, y, z] = [{p1: 123, p2: 234}, [345, 456], 789];
console.log(x, y, z);

let [{p11, p12}, [p21, p22], p31] = [{p11: 123, p12: 234}, [345, 456], 789];
console.log(p11, p12, p21, p22, p31);

  註意,當右側是一個json數據時,左側相應的變數必須與其鍵名對應。

  2、新增map、reduce、filter、forEach函數

  常見的數組操作函數。

// map: 用給定的映射遍曆數組,不改變原數組,生成新數組;
let arr = [12, 58, 99, 86, 45, 21];
let newArr = arr.map(item=>item>=60?"及格":"不及格");
console.log(arr, newArr);

// reduce: 遍歷累加
let sum = arr.reduce((item1, item2, index)=>item1+item2); // index表示下標,這裡可不寫
console.log(sum);

// filter: 過濾器
let filter = arr.filter(item=>item<=60);
console.log(filter);

let arr2 = [
{title: "賓士", price: 20},
{title: "寶馬", price: 35},
{title: "路虎", price: 30},
{title: "特斯拉", price: 40},
{title: "大眾", price: 15},
{title: "標緻", price:15},
];
let filter2 = arr2.filter(item=>item.price >=30);
console.log(filter2);

// forEach 迴圈遍歷
let newArr2 = arr.forEach((item, index)=>console.log(item, index));
newArr2; // 沒有返

三、字元串

  1.新增startswith和endswith

let str = "http://www.baidu.com";
if(str.startsWith("https")){
console.log("加密網址");
}else if(str.startsWith("http")){
console.log("普通網址");
}

let str2 = "[email protected]";
if(str2.endsWith("163.com")){
console.log("163郵箱");
}else if(str2.endsWith("qq.com")){
console.log("qq郵箱");
}

  2.模板字元串

  用返單引號(``)包裹的字元串,其中的變數可以用${}來替換。它可以寫多行字元串。

let title="標題", content="內容";
let str = `
<div><h1>${title}</h1><p>${content}</p></div>
`;
alert(str);

四、函數

  1.箭頭函數

  箭頭函數是函數的一種簡寫。

let show = function () {
console.log("what the hell?")
};
show();
// es6寫法
let newShow = ()=>{
console.log("what the hell?")
};
newShow();

  帶參數的寫法。如果參數只有一個,那麼()可以省略。

let alt = a=>{console.log(a*10)};// 單個參數
let add = (a, b) => {console.log(a + b);
}; // 兩個參數
add(3,5);

  如果函數只有一個返回值,那麼{}省略。

let arr = [12, 234, 345, 64, 23, 87];
arr.sort(function (n1, n2) { return n1 - n2 });
// 簡寫為
arr.sort((n1, n2) =>n1 - n2);
console.log(arr);

  2.預設參數

  可以像python那樣在函數定義時設置預設參數的值。並且可以通過...args來展開元素,同樣類似python的*args。

function show2(a, b=4, c=123) {
console.log(a, b, c);
}
show2(7);
function show(a, b, ...args) {
console.log(a + b);
console.log(args); // 剩餘的寫進...args數組裡,必須寫在最後
}
show(3, 5, 7, 9, 11);

  ...args甚至可以拆解數組。

let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]

五、json

  如果鍵名和值一致,那麼鍵名可以省略。

let a=123;
let b=456;
// 當名字和值一樣時可以簡寫
let json1 = {a, b}; // 等價於let json1 = {a: a, b: b}
let json2 = {
a,
b,
show(item){
console.log(item)
} // 等價於 show: function(){console.log(item};
};
json2.show(json2.a);

六、類

  相比函數構造類的外掛式寫法,添加了class和constructor來聲明類和構造函數。

// 聲明
class Person{
constructor(name, gender){
this.name = name;
this.gender = gender;
}
showName(){
console.log(this.name);
}
showGender(){
console.log(this.gender);
}
}

var sun = new Person("孫悟空", "male");
sun.showName();
sun.showGender();
// 繼承
class Child extends Person{
constructor(name, gender, age){
super(name, gender);
this.age = age;
}
showAge(){
console.log(this.age);
}
}

var child = new Child("小猴子", "male", 12);
child.showAge();

七、promise

  用同步的寫法來管理非同步。

function createPromise(url) {
return new Promise(function (resolve, reject) {
$.ajax({
url, // url: url
dataType: 'json',
success(arr){ resolve(arr);},
error(arr){vreject(arr);}
})
});
}
// 在當前目錄下創建arr.txt和json.txt文件
Promise.all([createPromise("arr.txt"), "json.txt"]).then(function (arr) {
alert("全都成功了!");
}, function (arr) {
alert("至少有一個失敗了!");
});

  高版本的Jquery中,$.ajax本身就是promise對象,所以上面的代碼可簡寫為:

Promise.all([$.ajax({url:"arr.txt", dataType:"json"}), $.ajax({url: "json.txt", dataType: "json"})]).then(function (results) {
let [arr, json] = results;
// 分別處理自己的邏輯
console.log("全都成功了!");
console.log(arr, json);
}, arr=>alert("至少有一個失敗了!"));

八、generator-yield

  生成器。惰性執行函數,和python中的生成器一致。

function *show() {
console.log("------1-----");
let a = yield 12;
console.log("------2-----");
console.log(a);
return a;
}

let gen = show();
let a = gen.next(123); // yield 後賦值時,第一次執行到yield時返回該值
let b = gen.next(456);
console.log(a, b); // a是一個json對象

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文 http://git.devzeng.com/blog/simple-usage-of-realm-in-ios.html 主題 Realm iOS開發 Realm是由 Y Combinator 公司孵化的一款支持運行在手機、平板和可穿戴設備上的嵌入式資料庫(旨在取代CoreData和Sqli ...
  • 最近在協助調研 Apollo 生成的代碼是否有可能跨 Query 共用模型的問題,雖然初步結論是不能,並不是預期的結果,但是在調研過程中積累的一些經驗,有必要記錄下。如果你也對 Graphql 感興趣,不妨先從 Github 的 Graphql API 來切手實踐。 ...
  • 一,效果圖。 二,index.html代碼。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Todo</title> <meta name="viewport" content="initial-scale=1, maximu ...
  • 今日看到一句話: 基於迴圈的迭代比基於函數的迭代法快8倍,因此有了該篇驗證博客。 驗證代碼如圖: 驗證結果:在數量比較少的時候,無明顯差別,當數量級達到10的4次方時候,for迴圈的效率優勢明顯。 從中學到其他小知識點: 1、es6語法 數組fill,填充數組,註意,如果填充的是對象,則只是一個指針 ...
  • 我們在工作中常常需要監聽某一個屬性值的變化,這個時候我們就需要用到了監聽屬性watch,在這裡我總結watch屬性的三種場景使用希望對你有所幫助: 1.基礎版監聽: 場景如下:輸入框輸入你的年齡,如果年齡在0 15歲提示信息:你還是個小孩,如果年齡在 15 25歲,提示信息:你已經是個少年,如果年齡 ...
  • 本人後端開發碼農一個,公司前端忙的一逼,項目使用的是easyui組件,其自帶的datebox組件使用起來非常不爽,主要表現在 1、自定義顯示格式很麻煩 2、選擇年份和月份用戶體驗也不好 網上有關於和My97DatePicker結合的例子,但感覺也用的不是很爽。 發現國內的layDate體驗非常滿意, ...
  • 1 2 3 4 5 Title 6 7 8 9 10 用戶名: 11 13 14 密&emsp;碼: 15 17 18 性&emsp;別: 19 ... ...
  • 一. html與Controller中的雙向數據綁定 html Controller的雙向數據綁定,在開發中非常常見,也是Angularjs1.x的宣傳點之一,使用中並沒有太多問題。 1.1數據從html流向controller 也就是從 視圖層 流向 模型層 ,原生html中需要使用表單元素(例如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...