包含java執行jses6的詞條

本文目錄一覽:

ES6、ES7、ES8、ES9、ES10新特性一覽

ECMA規範最終由TC39敲定。TC39由包括瀏覽器廠商在內的各方組成,他們開會推動JavaScript提案沿着一條嚴格的發展道路前進。 從提案到入選ECMA規範主要有以下幾個階段:

ES6的特性比較多,在 ES5 發布近 6 年(2009-11 至 2015-6)之後才將其標準化。兩個發布版本之間時間跨度很大,所以ES6中的特性比較多。 在這裡列舉幾個常用的:

1.類(class)

對熟悉Java,object-c,c#等純面向對象語言的開發者來說,都會對class有一種特殊的情懷。ES6 引入了class(類),讓JavaScript的面向對象編程變得更加簡單和易於理解。

2.模塊化(Module)

ES5不支持原生的模塊化,在ES6中模塊作為重要的組成部分被添加進來。模塊的功能主要由 export 和 import 組成。每一個模塊都有自己單獨的作用域,模塊之間的相互調用關係是通過 export 來規定模塊對外暴露的接口,通過import來引用其它模塊提供的接口。同時還為模塊創造了命名空間,防止函數的命名衝突。

導出(export)

ES6允許在一個模塊中使用export來導出多個變量或函數。

導出變量

ES6將一個文件視為一個模塊,上面的模塊通過 export 向外輸出了一個變量。一個模塊也可以同時往外面輸出多個變量。

導出函數

導入(import)

定義好模塊的輸出以後就可以在另外一個模塊通過import引用。

3.箭頭(Arrow)函數

這是ES6中最令人激動的特性之一。=不只是關鍵字function的簡寫,它還帶來了其它好處。箭頭函數與包圍它的代碼共享同一個this,能幫你很好的解決this的指向問題。有經驗的JavaScript開發者都熟悉諸如var self = this;或var that = this這種引用外圍this的模式。但藉助=,就不需要這種模式了。

箭頭函數的結構

箭頭函數的箭頭=之前是一個空括號、單個的參數名、或用括號括起的多個參數名,而箭頭之後可以是一個表達式(作為函數的返回值),或者是用花括號括起的函數體(需要自行通過return來返回值,否則返回的是undefined)。

卸載監聽器時的陷阱

除上述的做法外,我們還可以這樣做:

4.函數參數默認值

ES6支持在定義函數的時候為其設置默認值:

這樣寫一般沒問題,但當參數的布爾值為false時,就會有問題了。比如,我們這樣調用foo函數:

foo(0, “”)

因為0的布爾值為false,這樣height的取值將是50。同理color的取值為‘red’。

所以說,函數參數默認值不僅能是代碼變得更加簡潔而且能規避一些問題。

5.模板字符串

ES6支持模板字符串,使得字符串的拼接更加的簡潔、直觀。

在ES6中通過${}就可以完成字符串的拼接,只需要將變量放在大括號之中。

6.解構賦值

解構賦值語法是JavaScript的一種表達式,可以方便的從數組或者對象中快速提取值賦給定義的變量。

獲取數組中的值

從數組中獲取值並賦值到變量中,變量的順序與數組中對象順序對應。

如果沒有從數組中的獲取到值,你可以為變量設置一個默認值。

通過解構賦值可以方便的交換兩個變量的值。

獲取對象中的值

7.延展操作符(Spread operator)

延展操作符…可以在函數調用/數組構造時, 將數組表達式或者string在語法層面展開;還可以在構造對象時, 將對象表達式按key-value的方式展開。

語法

應用場景

沒有展開語法的時候,只能組合使用 push,splice,concat 等方法,來將已有數組元素變成新數組的一部分。有了展開語法, 構造新數組會變得更簡單、更優雅:

和參數列表的展開類似, … 在構造字數組時, 可以在任意位置多次使用。

展開語法和 Object.assign() 行為一致, 執行的都是淺拷貝(只遍歷一層)。

在ECMAScript 2018中延展操作符增加了對對象的支持

8.對象屬性簡寫

在ES6中允許我們在設置一個對象的屬性的時候不指定屬性名。

對象中必須包含屬性和值,顯得非常冗餘。

對象中直接寫變量,非常簡潔。

9.Promise

Promise 是異步編程的一種解決方案,比傳統的解決方案callback更加的優雅。它最早由社區提出和實現的,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise對象。

嵌套兩個setTimeout回調函數:

上面的的代碼使用兩個then來進行異步編程串行化,避免了回調地獄:

10.支持let與const

在之前JS是沒有塊級作用域的,const與let填補了這方便的空白,const與let都是塊級作用域。

ES2016添加了兩個小的特性來說明標準化過程:

1.Array.prototype.includes()

includes() 函數用來判斷一個數組是否包含一個指定的值,如果包含則返回 true,否則返回false。

includes 函數與 indexOf 函數很相似,下面兩個表達式是等價的:

接下來我們來判斷數字中是否包含某個元素:

使用indexOf()驗證數組中是否存在某個元素,這時需要根據返回值是否為-1來判斷:

使用includes()驗證數組中是否存在某個元素,這樣更加直觀簡單:

2.指數操作符

在ES7中引入了指數運算符**,**具有與Math.pow(..)等效的計算結果。

使用自定義的遞歸函數calculateExponent或者Math.pow()進行指數運算:

使用指數運算符**,就像+、-等操作符一樣:

1.async/await

ES2018引入異步迭代器(asynchronous iterators),這就像常規迭代器,除了next()方法返回一個Promise。因此await可以和for…of循環一起使用,以串行的方式運行異步操作。例如:

2.Object.values()

Object.values()是一個與Object.keys()類似的新函數,但返回的是Object自身屬性的所有值,不包括繼承的值。

假設我們要遍歷如下對象obj的所有值:

從上述代碼中可以看出Object.values()為我們省去了遍歷key,並根據這些key獲取value的步驟。

3.Object.entries()

Object.entries()函數返回一個給定對象自身可枚舉屬性的鍵值對的數組。

接下來我們來遍歷上文中的obj對象的所有屬性的key和value:

4.String padding

在ES8中String新增了兩個實例函數String.prototype.padStart和String.prototype.padEnd,允許將空字符串或其他字符串添加到原始字符串的開頭或結尾。

5.函數參數列表結尾允許逗號

主要作用是方便使用git進行多人協作開發時修改同一個函數減少不必要的行變更。

6.Object.getOwnPropertyDescriptors()

Object.getOwnPropertyDescriptors()函數用來獲取一個對象的所有自身屬性的描述符,如果沒有任何自身屬性,則返回空對象。

返回obj對象的所有自身屬性的描述符,如果沒有任何自身屬性,則返回空對象。

7.SharedArrayBuffer對象

SharedArrayBuffer 對象用來表示一個通用的,固定長度的原始二進制數據緩衝區,類似於 ArrayBuffer 對象,它們都可以用來在共享內存(shared memory)上創建視圖。與 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分離。

8.Atomics對象

Atomics 對象提供了一組靜態方法用來對 SharedArrayBuffer 對象進行原子操作。

這些原子操作屬於 Atomics 模塊。與一般的全局對象不同,Atomics 不是構造函數,因此不能使用 new 操作符調用,也不能將其當作函數直接調用。Atomics 的所有屬性和方法都是靜態的(與 Math 對象一樣)。

多個共享內存的線程能夠同時讀寫同一位置上的數據。原子操作會確保正在讀或寫的數據的值是符合預期的,即下一個原子操作一定會在上一個原子操作結束後才會開始,其操作過程不會中斷。

wait() 和 wake() 方法採用的是 Linux 上的 futexes 模型(fast user-space mutex,快速用戶空間互斥量),可以讓進程一直等待直到某個特定的條件為真,主要用於實現阻塞。

1.異步迭代

在async/await的某些時刻,你可能嘗試在同步循環中調用異步函數。例如:

這段代碼不會正常運行,下面這段同樣也不會:

這段代碼中,循環本身依舊保持同步,並在在內部異步函數之前全部調用完成。

ES2018引入異步迭代器(asynchronous iterators),這就像常規迭代器,除了next()方法返回一個Promise。因此await可以和for…of循環一起使用,以串行的方式運行異步操作。例如:

2.Promise.finally()

一個Promise調用鏈要麼成功到達最後一個.then(),要麼失敗觸發.catch()。在某些情況下,你想要在無論Promise運行成功還是失敗,運行相同的代碼,例如清除,刪除對話,關閉數據庫連接等。

.finally()允許你指定最終的邏輯:

3.Rest/Spread 屬性

ES2015引入了Rest參數和擴展運算符。三個點(…)僅用於數組。Rest參數語法允許我們將一個不定數量的參數表示為一個數組。

展開操作符以相反的方式工作,將數組轉換成可傳遞給函數的單獨參數。例如Math.max()返回給定數字中的最大值:

ES2018為對象解構提供了和數組一樣的Rest參數()和展開操作符,一個簡單的例子:

或者你可以使用它給函數傳遞參數:

擴展運算符可以在其他對象內使用,例如:

可以使用擴展運算符拷貝一個對象,像是這樣obj2 = {…obj1},但是 這只是一個對象的淺拷貝 。另外,如果一個對象A的屬性是對象B,那麼在克隆後的對象cloneB中,該屬性指向對象B。

4.正則表達式命名捕獲組

JavaScript正則表達式可以返回一個匹配的對象——一個包含匹配字符串的類數組,例如:以YYYY-MM-DD的格式解析日期:

這樣的代碼很難讀懂,並且改變正則表達式的結構有可能改變匹配對象的索引。

ES2018允許命名捕獲組使用符號?name,在打開捕獲括號(後立即命名,示例如下:

任何匹配失敗的命名組都將返回undefined。

命名捕獲也可以使用在replace()方法中。例如將日期轉換為美國的 MM-DD-YYYY 格式:

5.正則表達式反向斷言

目前JavaScript在正則表達式中支持先行斷言(lookahead)。這意味着匹配會發生,但不會有任何捕獲,並且斷言沒有包含在整個匹配字段中。例如從價格中捕獲貨幣符號:

ES2018引入以相同方式工作但是匹配前面的反向斷言(lookbehind),這樣我就可以忽略貨幣符號,單純的捕獲價格的數字:

以上是 肯定反向斷言 ,非數字\D必須存在。同樣的,還存在 否定反向斷言 ,表示一個值必須不存在,例如:

6.正則表達式dotAll模式

正則表達式中點.匹配除回車外的任何單字符,標記s改變這種行為,允許行終止符的出現,例如:

7.正則表達式 Unicode 轉義

到目前為止,在正則表達式中本地訪問 Unicode 字符屬性是不被允許的。ES2018添加了 Unicode 屬性轉義——形式為\p{…}和\P{…},在正則表達式中使用標記 u (unicode) 設置,在\p塊兒內,可以以鍵值對的方式設置需要匹配的屬性而非具體內容。例如:

此特性可以避免使用特定 Unicode 區間來進行內容類型判斷,提升可讀性和可維護性。

8.非轉義序列的模板字符串

之前,\\u開始一個 unicode 轉義,\\x開始一個十六進制轉義,\後跟一個數字開始一個八進制轉義。這使得創建特定的字符串變得不可能,例如Windows文件路徑 C:\\uuu\\xxx\111。更多細節參考模板字符串。

1.行分隔符(U + 2028)和段分隔符(U + 2029)符號現在允許在字符串文字中,與JSON匹配

以前,這些符號在字符串文字中被視為行終止符,因此使用它們會導致SyntaxError異常。

2.更加友好的 JSON.stringify

如果輸入 Unicode 格式但是超出範圍的字符,在原先JSON.stringify返回格式錯誤的Unicode字符串。現在實現了一個改變JSON.stringify的第3階段提案,因此它為其輸出轉義序列,使其成為有效Unicode(並以UTF-8表示)

3.新增了Array的flat()方法和flatMap()方法

flat()和flatMap()本質上就是是歸納(reduce) 與 合併(concat)的操作。

Array.prototype.flat()

flat() 方法會按照一個可指定的深度遞歸遍曆數組,並將所有元素與遍歷到的子數組中的元素合併為一個新數組返回。

Array.prototype.flatMap()

flatMap() 方法首先使用映射函數映射每個元素,然後將結果壓縮成一個新數組。它與 map 和 深度值1的 flat 幾乎相同,但 flatMap 通常在合併成一種方法的效率稍微高一些。 這裡我們拿map方法與flatMap方法做一個比較。

4.新增了String的trimStart()方法和trimEnd()方法

5.Object.fromEntries()

Object.entries()方法的作用是返回一個給定對象自身可枚舉屬性的鍵值對數組,其排列與使用 for…in 循環遍歷該對象時返回的順序一致(區別在於 for-in 循環也枚舉原型鏈中的屬性)。

而Object.fromEntries() 則是 Object.entries() 的反轉。

Object.fromEntries() 函數傳入一個鍵值對的列表,並返回一個帶有這些鍵值對的新對象。這個迭代參數應該是一個能夠實現@iterator方法的的對象,返回一個迭代器對象。它生成一個具有兩個元素的類似數組的對象,第一個元素是將用作屬性鍵的值,第二個元素是與該屬性鍵關聯的值。

6.Symbol.prototype.description

通過工廠函數Symbol()創建符號時,您可以選擇通過參數提供字符串作為描述:

以前,訪問描述的唯一方法是將符號轉換為字符串:

現在引入了getter Symbol.prototype.description以直接訪問描述:

7.String.prototype.matchAll

matchAll() 方法返回一個包含所有匹配正則表達式及分組捕獲結果的迭代器。 在 matchAll 出現之前,通過在循環中調用regexp.exec來獲取所有匹配項信息(regexp需使用/g標誌:

如果使用matchAll ,就可以不必使用while循環加exec方式(且正則表達式需使用/g標誌)。使用matchAll 會得到一個迭代器的返回值,配合 for…of, array spread, or Array.from() 可以更方便實現功能:

matchAll可以更好的用於分組

8.Function.prototype.toString()現在返回精確字符,包括空格和注釋

9.修改 catch 綁定

在 ES10 之前,我們必須通過語法為 catch 子句綁定異常變量,無論是否有必要。很多時候 catch 塊是多餘的。 ES10 提案使我們能夠簡單的把變量省略掉。

不算大的改動。

之前是

現在是

10.新的基本數據類型BigInt

現在的基本數據類型(值類型)不止5種(ES6之後是六種)了哦!加上BigInt一共有七種基本數據類型,分別是: String、Number、Boolean、Null、Undefined、Symbol、BigInt

昭通java培訓學校告訴你JavaScript編程開發技巧?

隨着互聯網的不斷發展,關於JavaScript編程開發語言的使用也被廣大程序員掌握。而今天我們就一起來了解一下,JavaScript編程開發的一些技巧都有哪些。

JSON.stringify

我們平時經常會用到JSON對象,比如當我們要實現對象的深拷貝時,我們可以用JSON對象的JSON.stringify和JSON.parse來拷貝一個完全一樣的對象,而不會對原對象產生任何引用關係。在使用localStorage時,也會用到它,因為localStorage只能存儲字符串格式的內容,所以,我們在存之前,將數值轉換成JSON字符串,取出來用的時候,再轉成對象或數組。

參數:

value:將要被序列化的變量的值

replacer:替代器。可以是函數或者是數組,如果是一個函數,則value每個屬性都要經過這個函數的處理,該函數的返回值就是後被序列化後的值。如果是一個數組,則要求該數組的元素是字符串,且這些元素會被當做value的鍵(key)進行匹配,後序列化的結果,是只包含該數組每個元素為key的值。

space:指定輸出數值的代碼縮進,美化格式之用,可以是數字或者字符串。如果是數字(大為10)的話,代表每行代碼的縮進是多少個空格。如果是字符串的話,該字符串(多前十個字符)將作顯示在每行代碼之前。

用Set來實現數組去重

在ES6中,引入了一個新的數據結構類型:Set。而Set與Array的結構是很類似的,且Set和Array可以相互進行轉換。

數組去重,也算是一個比較常見的前端面試題了,方法有很多種,這裡不多贅述。下面我們看看用Set和…(拓展運算符)可以很簡單的進行數組去重。

用塊級作用域避免命名衝突

在開發的過程中,通常會遇到命名衝突的問題,就是需要根據場景不同來定義不同的值來賦值給同一個變量。下面昭通IT培訓介紹一個使用ES6中的塊級作用域來解決這個問題的方法。

函數參數值校驗

我們知道,在ES6中,為函數增加了參數默認值的特性,可以為參數設定一些默認值,可以讓代碼更簡潔,可維護。

JS ES6類中定義的屬性 為什麼不在原型里

behavior = “好好學習”;

是定義的實例屬性,等價於在 constructor 裡面定義了

this.behavior = “好好學習”;

而類方法 hello 是定義在實例的原型對象上邊的。

也可通過 __proto__ 在原型對象上定義屬性。

有沒有哪個Java 8妙用Nashorn引擎的好例子

使用Java8,Nashorn大大提高了JavaScript 引擎引入,以取代現有的Nashorn Java腳本引擎。Nashorn提供2至10倍更好的性能,因為它直接編譯代碼在存儲器,並傳遞到字節碼JVM.Nashorn使用invokedynamics函數,在Java7引入以提高性能。

jjs

對於Nashorn引擎,JAVA8引入了一個新的命令行工具,JJS到控制台執行Java腳本代碼。

解讀js文件

創建並保存sample.js在 C: JAVA 文件夾。

sample.jsprint(‘Hello World!’);

打開控制台並使用下面的命令。

C:\JAVAjjs sample.js

看到結果

Hello World!

JJS在交互模式

打開控制台並使用下面的命令

C:\JAVAjjs

jjs print(“Hello, World!”)

Hello, World!

jjs quit()

傳遞參數

打開控制台並使用下面的命令。

C:\JAVA jjs — a b c

jjs print(‘letters: ‘ +arguments.join(“, “))

letters: a, b, c

jjs

在JAVA調用JavaScript

使用ScriptEngineManager,JavaScript代碼用Java編寫可以被調用。

示例

選擇使用任何編輯器創建以下java程序在 C:/ JAVA

Java8Tester.javaimport javax.script.ScriptEngineManager;

import javax.script.ScriptEngine;

import javax.script.ScriptException;

public class Java8Tester {

public static void main(String args[]){

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();

ScriptEngine nashorn = scriptEngineManager.getEngineByName(“nashorn”);

String name = “Mahesh”;

Integer result = null;

try {

nashorn.eval(“print(‘” + name + “‘)”);

result = (Integer) nashorn.eval(“10 + 2”);

}catch(ScriptException e){

System.out.println(“Error executing script: “+ e.getMessage());

}

System.out.println(result.toString());

}

}

驗證結果

使用javac編譯器編譯如下類

C:\JAVAjavac Java8Tester.java

現在運行Java8Tester看到的結果

C:\JAVAjava Java8Tester

看到結果

Mahesh

12

從JavaScript調用Java

下面的例子將展示如何導入和使用Java類的Java腳本。

創建並保存 sample.js 在 c: JAVA 文件夾.

sample.jsvar BigDecimal = Java.type(‘java.math.BigDecimal’);

function calculate(amount, percentage) {

var result = new BigDecimal(amount).multiply(

new BigDecimal(percentage)).divide(

new BigDecimal(“100”), 2, BigDecimal.ROUND_HALF_EVEN);

return result.toPlainString();

}

var result = calculate(568000000000000000023,13.9);

print(result);

打開控制台並使用下面的命令。

C:\JAVAjjs sample.js

看到結果

78952000000000000003.20

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247061.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:18
下一篇 2024-12-12 13:19

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論