1、let 聲明變量
// var 聲明的變量往往會越域
// let 聲明的變量有嚴格局部作用域
{
var a = 1;
let b = 2;
}
console.log(a); // 1
console.log(b); // ReferenceError: b is not defined
// var 可以聲明多次
// let 只能聲明一次
var m = 1
var m = 2
let n = 3
// let n = 4
console.log(m) // 2
console.log(n) // Identifier 'n' has already been declared
// var 會變量提升
// let 不存在變量提升
console.log(x); // undefined
var x = 10;
console.log(y); //ReferenceError: y is not defined
let y = 20
2、const 聲明常量(只讀變量)
// 1. 聲明之后不允許改變
// 2. 一但聲明必須初始化,否則會報錯
const a = 1;
a = 3; //Uncaught TypeError: Assignment to constant
3、解構表達式
1)、數(shù)組解構
let arr = [1,2,3];
//以前我們想獲取其中的值,只能通過角標。ES6 可以這樣:
const [x,y,z] = arr;// x,y,z 將與 arr 中的每個位置對應來取值
// 然后打印
console.log(x,y,z)
2)、對象解構
const person = {
name: "jack",
age: 21,
language: ['java', 'js', 'css']
}
// 解構表達式獲取值,將 person 里面每一個屬性和左邊對應賦值
const { name, age, language } = person;
// 等價于下面
// const name = person.name;
// const age = person.age;
// const language = person.language;
// 可以分別打印
console.log(name);
console.log(age);
console.log(language);
//擴展:如果想要將 name 的值賦值給其他變量,可以如下,nn 是新的變量名
const { name: nn, age, language } = person;
console.log(nn);
console.log(age);
console.log(language)
4、字符串擴展
1)、幾個新的 API
ES6 為字符串擴展了幾個新的 API:
-
includes()
:返回布爾值,表示是否找到了參數(shù)字符串。 -
startsWith()
:返回布爾值,表示參數(shù)字符串是否在原字符串的頭部。 -
endsWith()
:返回布爾值,表示參數(shù)字符串是否在原字符串的尾部。
let str = "hello.vue";
console.log(str.startsWith("hello"));//true
console.log(str.endsWith(".vue"));//true
console.log(str.includes("e"));//true
console.log(str.includes("hello"));//tru
2)、字符串模板
模板字符串相當于加強版的字符串,用反引號 `,除了作為普通字符串,還可以用來定義多行字符串,還可以在字符串中加入變量和表達式。
// 1、多行字符串
let ss = `
<div>
<span>hello world<span>
</div>
`
console.log(ss)
// 2、字符串插入變量和表達式。變量名寫在 ${} 中,${} 中可以放
入 JavaScript 表達式。
let name = "張三";
let age = 18;
let info = `我是${name},今年${age}了`;
console.log(info)
// 3、字符串中調(diào)用函數(shù)
function fun() {
return "這是一個函數(shù)"
}
let sss = `O(∩_∩)O 哈哈~,${fun()}`;
console.log(sss); //O(∩_∩)O 哈哈~,這是一個函數(shù)
5、函數(shù)優(yōu)化
1)、函數(shù)參數(shù)默認值
//在 ES6 以前,我們無法給一個函數(shù)參數(shù)設置默認值,只能采用變通寫法:
function add(a, b) {
// 判斷 b 是否為空,為空就給默認值 1
b = b || 1;
return a + b;
}
// 傳一個參數(shù)
console.log(add(10));
//現(xiàn)在可以這么寫:直接給參數(shù)寫上默認值,沒傳就會自動使用默認值
function add2(a , b = 1) {
return a + b;
}
// 傳一個參數(shù)
console.log(add2(10));
2)、不定參數(shù)
不定參數(shù)用來表示不確定參數(shù)個數(shù),形如,…變量名,由…加上一個具名參數(shù)標識符組成。具名參數(shù)只能放在參數(shù)列表的最后,并且有且只有一個不定參數(shù)
function fun(...values) {
console.log(values.length)
}
fun(1, 2) //2
fun(1, 2, 3, 4) //
3)、箭頭函數(shù)
ES6 中定義函數(shù)的簡寫方式
- 一個參數(shù)時:
//以前聲明一個方法
// var print = function (obj) {
// console.log(obj);
// }
// 可以簡寫為:
var print = obj => console.log(obj);
// 測試調(diào)用
print(100);
- 多個參數(shù):
// 兩個參數(shù)的情況:
var sum = function (a, b) {
return a + b;
}
// 簡寫為:
//當只有一行語句,并且需要返回結果時,可以省略 {} , 結果會自動返回。
var sum2 = (a, b) => a + b;
//測試調(diào)用
console.log(sum2(10, 10));//20
// 代碼不止一行,可以用`{}`括起來
var sum3 = (a, b) => {
c = a + b;
return c;
};
//測試調(diào)用
console.log(sum3(10, 20));//30
4)、實戰(zhàn):箭頭函數(shù)結合解構表達式
//需求,聲明一個對象,hello 方法需要對象的個別屬性
//以前的方式:
const person = {
name: "jack",
age: 21,
language: ['java', 'js', 'css']
}
function hello(person) {
console.log("hello," + person.name)
}
//現(xiàn)在的方式
var hello2 = ({ name }) => { console.log("hello," + name) };
//測試
hello2(person);
6、對象優(yōu)化
1)、新增的 API
ES6 給 Object 拓展了許多新的方法,如:
- keys(obj):獲取對象的所有 key 形成的數(shù)組
- values(obj):獲取對象的所有 value 形成的數(shù)組
- entries(obj):獲取對象的所有 key 和 value 形成的二維數(shù)組。格式:
[[k1,v1],[k2,v2],...]
- assign(dest, …src) :將多個 src 對象的值 拷貝到 dest 中。(第一層為深拷貝,第二層為淺
拷貝)
const person = {
name: "jack",
age: 21,
language: ['java', 'js', 'css']
}
console.log(Object.keys(person));//["name", "age", "language"]
console.log(Object.values(person));//["jack", 21, Array(3)]
console.log(Object.entries(person));//[Array(2), Array(2), Array(2)]
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
//Object.assign 方法的第一個參數(shù)是目標對象,后面的參數(shù)都是源對象。
Object.assign(target, source1, source2);
console.log(target)//{a: 1, b: 2, c: 3
2)、聲明對象簡寫
const age = 23
const name = "張三"
// 傳統(tǒng)
const person1 = { age: age, name: name }
console.log(person1)
// ES6:屬性名和屬性值變量名一樣,可以省略
const person2 = { age, name }
console.log(person2) //{age: 23, name: "張三"}
3)、對象的函數(shù)屬性簡寫
let person = {
name: "jack",
// 以前:
eat: function (food) {
console.log(this.name + "在吃" + food);
},
// 箭頭函數(shù)版:這里拿不到 this
eat2: food => console.log(person.name + "在吃" + food),
// 簡寫版:
eat3(food) {
console.log(this.name + "在吃" + food);
}
}
person.eat("apple");
4)、對象拓展運算符
拓展運算符(…)用于取出參數(shù)對象所有可遍歷屬性然后拷貝到當前對象。
// 1、拷貝對象(深拷貝)
let person1 = { name: "Amy", age: 15 }
let someone = { ...person1 }
console.log(someone) //{name: "Amy", age: 15}
// 2、合并對象
let age = { age: 15 }
let name = { name: "Amy" }
let person2 = { ...age, ...name } //如果兩個對象的字段名重復,后面對象字
段值會覆蓋前面對象的字段值
console.log(person2) //{age: 15, name: "Amy"}
7、map 和 reduce
數(shù)組中新增了 map 和 reduce 方法。
1)、map
map():接收一個函數(shù),將原數(shù)組中的所有元素用這個函數(shù)處理后放入新數(shù)組返回。
let arr = ['1', '20', '-5', '3'];
console.log(arr)
arr = arr.map(s => parseInt(s));
console.log(arr)
2)、reduce
語法:
arr.reduce(callback,[initialValue])
reduce 為數(shù)組中的每一個元素依次執(zhí)行回調(diào)函數(shù),不包括數(shù)組中被刪除或從未被賦值的元
素,接受四個參數(shù):初始值(或者上一次回調(diào)函數(shù)的返回值),當前元素值,當前索引,調(diào)
用 reduce 的數(shù)組。
callback (執(zhí)行數(shù)組中每個值的函數(shù),包含四個參數(shù))
1、previousValue (上一次調(diào)用回調(diào)返回的值,或者是提供的初始值(initialValue))
2、currentValue (數(shù)組中當前被處理的元素)
3、index (當前元素在數(shù)組中的索引)
4、array (調(diào)用 reduce 的數(shù)組)
initialValue (作為第一次調(diào)用 callback 的第一個參數(shù)。)
示例:
const arr = [1,20,-5,3];
//沒有初始值:
console.log(arr.reduce((a,b)=>a+b));//19
console.log(arr.reduce((a,b)=>a*b));//-300
//指定初始值:
console.log(arr.reduce((a,b)=>a+b,1));//20
console.log(arr.reduce((a,b)=>a*b,0));//-0
8、Promise
在 JavaScript 的世界中,所有代碼都是單線程執(zhí)行的。由于這個“缺陷”,導致 JavaScript 的所
有網(wǎng)絡操作,瀏覽器事件,都必須是異步執(zhí)行。異步執(zhí)行可以用回調(diào)函數(shù)實現(xiàn)。一旦有一連
串的 ajax 請求 a,b,c,d… 后面的請求依賴前面的請求結果,就需要層層嵌套。這種縮進和層
層嵌套的方式,非常容易造成上下文代碼混亂,我們不得不非常小心翼翼處理內(nèi)層函數(shù)與外
層函數(shù)的數(shù)據(jù),一旦內(nèi)層函數(shù)使用了上層函數(shù)的變量,這種混亂程度就會加劇…總之,這
種層疊上下文
的層層嵌套方式,著實增加了神經(jīng)的緊張程度。
案例:用戶登錄,并展示該用戶的各科成績。在頁面發(fā)送兩次請求:
- 查詢用戶,查詢成功說明可以登錄
- 查詢用戶成功,查詢科目
- 根據(jù)科目的查詢結果,獲取去成績
分析:此時后臺應該提供三個接口,一個提供用戶查詢接口,一個提供科目的接口,一個提
供各科成績的接口,為了渲染方便,最好響應 json 數(shù)據(jù)。在這里就不編寫后臺接口了,而
是提供三個 json 文件,直接提供 json
user.json:
{
"id": 1, "name": "zhangsan", "password": "123456"
}
user_corse_1.json:{
"id": 10, "name": "chinese"
}
corse_score_10.json:{
"id": 100, "score": 90
}
//回調(diào)函數(shù)嵌套的噩夢:層層嵌套。
$.ajax({
url: "mock/user.json",
success(data) {
console.log("查詢用戶:", data);
$.ajax({
url: `mock/user_corse_${data.id}.json`,
success(data) {
console.log("查詢到課程:", data);
$.ajax({
url: `mock/corse_score_${data.id}.json`,
success(data) {
console.log("查詢到分數(shù):", data);
},
error(error) {
console.log("出現(xiàn)異常了:" + error);
}
});
},
error(error) {
console.log("出現(xiàn)異常了:" + error);
}
});
},
error(error) {
console.log("出現(xiàn)異常了:" + error);
}
});
我們可以通過 Promise 解決以上問題。
1)、Promise 語法
const promise = new Promise(function (resolve, reject) {
// 執(zhí)行異步操作
if (/* 異步操作成功 */) {
resolve(value);// 調(diào)用 resolve,代表 Promise 將返回成功的結果
} else {
reject(error);// 調(diào)用 reject,代表 Promise 會返回失敗結果
}
});
使用箭頭函數(shù)可以簡寫為:
const promise = new Promise((resolve, reject) =>{
// 執(zhí)行異步操作
if (/* 異步操作成功 */) {
resolve(value);// 調(diào)用 resolve,代表 Promise 將返回成功的結果
} else {
reject(error);// 調(diào)用 reject,代表 Promise 會返回失敗結果
}
});
這樣,在 promise 中就封裝了一段異步執(zhí)行的結果。
2)、處理異步結果
如果我們想要等待異步執(zhí)行完成,做一些事情,我們可以通過 promise 的 then 方法來實現(xiàn)。如果想要處理 promise 異步執(zhí)行失敗的事件,還可以跟上 catch:
promise.then(function (value) {
// 異步執(zhí)行成功后的回調(diào)
}).catch(function (error) {
// 異步執(zhí)行失敗后的回調(diào)
})
3)、Promise 改造以前嵌套方式
new Promise((resolve, reject) => {
$.ajax({
url: "mock/user.json",
success(data) {
console.log("查詢用戶:", data);
resolve(data.id);
},
error(error) {
console.log("出現(xiàn)異常了:" + error);
}
});
}).then((userId) => {
return new Promise((resolve, reject) => {
$.ajax({
url: `mock/user_corse_${userId}.json`,
success(data) {
console.log("查詢到課程:", data);
resolve(data.id);
},
error(error) {
console.log("出現(xiàn)異常了:" + error);
}
});
});
}).then((corseId) => {
console.log(corseId);
$.ajax({
url: `mock/corse_score_${corseId}.json`,
success(data) {
console.log("查詢到分數(shù):", data);
},
error(error) {
console.log("出現(xiàn)異常了:" + error);
}
});
});
4)、優(yōu)化處理
優(yōu)化:通常在企業(yè)開發(fā)中,會把 promise 封裝成通用方法,如下:封裝了一個通用的 get 請求方法;
let get = function (url, data) { // 實際開發(fā)中會單獨放到 common.js 中
return new Promise((resolve, reject) => {
$.ajax({
url: url,
type: "GET",
data: data,
success(result) {
resolve(result);
},
error(error) {
reject(error);
}
});
})
}
// 使用封裝的 get 方法,實現(xiàn)查詢分數(shù)
get("mock/user.json").then((result) => {
console.log("查詢用戶:", result);
return get(`mock/user_corse_${result.id}.json`);
}).then((result) => {
console.log("查詢到課程:", result);
return get(`mock/corse_score_${result.id}.json`)
}).then((result) => {
console.log("查詢到分數(shù):", result);
}).catch(() => {
console.log("出現(xiàn)異常了:" + error);
});
通過比較,我們知道了 Promise 的扁平化設計理念,也領略了這種上層設計
帶來的好處。我們的項目中會使用到這種異步處理的方式;
9、模塊化
1)、什么是模塊化
模塊化就是把代碼進行拆分,方便重復利用。類似 java 中的導包:要使用一個包,必須先導包。而 JS 中沒有包的概念,換來的是模塊。模塊功能主要由兩個命令構成:export
和import
。
-
export
命令用于規(guī)定模塊的對外接口。 -
import
命令用于導入其他模塊提供的功能。
2)、export
比如我定義一個 js 文件:hello.js,里面有一個對象
const util = {
sum(a,b){
return a + b;
}
}
我可以使用 export 將這個對象導出:
const util = {
sum(a,b){
return a + b;
}
}
export {util};
當然,也可以簡寫為:
export const util = {
sum(a,b){
return a + b;
}
}
export
不僅可以導出對象,一切 JS 變量都可以導出。比如:基本類型變量、函數(shù)、數(shù)組、對象。當要導出多個值時,還可以簡寫。比如我有一個文件:user.js:
var name = "jack"
var age = 21
export {name,age}
省略名稱
上面的導出代碼中,都明確指定了導出的變量名,這樣其它人在導入使用時就必須準確寫出
變量名,否則就會出錯。
因此 js 提供了default
關鍵字,可以對導出的變量名進行省略
例如:
// 無需聲明對象的名字
export default {
sum(a,b){
return a + b;
}
}
這樣,當使用者導入時,可以任意起名字。
3)、import
使用export
命令定義了模塊的對外接口以后,其他 JS 文件就可以通過import
命令加載這個模塊。
例如我要使用上面導出的 util:
// 導入 util
import util from 'hello.js'
// 調(diào)用 util 中的屬性
util.sum(1,2)
要批量導入前面導出的 name 和 age:文章來源:http://www.zghlxwxcb.cn/news/detail-680498.html
import {name, age} from 'user.js'
console.log(name + " , 今年"+ age +"歲了")
但是上面的代碼暫時無法測試,因為瀏覽器目前還不支持 ES6 的導入和導出功能。除非借助于工具,把 ES6 的語法進行編譯降級到 ES5,比如Babel-cli
工具,我們暫時不做測試,了解即可文章來源地址http://www.zghlxwxcb.cn/news/detail-680498.html
到了這里,關于【ES6 新特性】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!