var let 和 const
# var 以後儘量少用,函式作用域
# 在ES6之前,我們都是用var來宣告變數,而且JS只有函式作用域和全域性作用域,沒有塊級作用域,所以{}限定不了var宣告變數的訪問範圍。
# ES6 新增了let命令,用來宣告區域性變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的程式碼塊內有效,而且有暫時性死區的約束
# "暫時性死區"(Temporal Dead Zone,簡稱 TDZ)是指在 ES6 中使用 let 或 const 宣告變數時,變數存在但無法訪問的區域。這種行為是為了在 JavaScript 中引入塊級作用域而設計的。
# 在 JavaScript 中,使用 var 宣告的變數在其宣告語句之前就可以被訪問,這種行為稱為"變數提升"。而在使用 let 或 const 宣告變數時,變數雖然存在於作用域中,但是在宣告語句之前訪問這些變數會導致引發 ReferenceError 異常。
# 暫時性死區的產生原因是,let 和 const 宣告的變數在進入作用域時就已經被建立,並且被繫結到了該作用域中,但是在變數的宣告語句之前,訪問這些變數會進入暫時性死區,因為此時變數尚未初始化
<script>
var name = "小滿"
console.log(window.name) // 小滿
console.log(name) // 小滿
console.log(this.name) // 小滿
let hobby = "摸魚"
console.log(hobby) // 摸魚
console.log(window.hobby) // undefined
</script>
https://www.freecodecamp.org/chinese/news/var-let-and-const-whats-the-difference/
箭頭函式
# 1 簡化程式碼
# 2 箭頭函式內部,沒有自己的this---》使用上一級的
let f=()=>{}
# 3 this指向問題
# 1 在全域性上下文中,this 指向全域性物件,在瀏覽器環境中通常是 window 物件,在 Node.js 中是 global 物件
console.log(this) # window 物件
# 2 函式呼叫:
# 2.1 如果函式作為普通函式呼叫,this 指向全域性物件(在嚴格模式下為 undefined)
# 2.2 如果函式作為物件的方法呼叫,this 指向呼叫該方法的物件。
# 3 建構函式:
在建構函式中,this 指向新建立的例項物件
# 4 箭頭函式:
箭頭函式的 this 指向定義時所在的作用域的 this 值,而不是呼叫時的 this 值。換句話說,箭頭函式的 this 是詞法作用域,而不是動態作用域
# 5 DOM 事件處理函式:
在 DOM 事件處理函式中,this 指向觸發事件的 DOM 元素
#6 ES6 類方法:
在 ES6 類方法中,this 指向呼叫該方法的物件例項
模板字串
let name = "小滿"
console.log(`你好,我是${name}`) // 你好,我是小滿
解構賦值
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
- 解構賦值允許從陣列或物件中提取資料,並將其賦值給變數。
- 解構賦值可以方便地交換變數的值,同時還支援預設值。
// 解物件
let user = {name: "小滿", age:3, hobby:"摸魚"}
console.log(user.name) // 小滿
let {name, age, hobby, gender} = user
console.log(name, age, hobby, gender) // 小滿 3 摸魚 undefined
let {name, age, hobby, gender="保密"} = user
console.log(name, age, hobby, gender) // 小滿 3 摸魚 保密
// 解陣列
hobbyArr = ['摸魚', "搶人頭", "逃課"]
let h1 = hobbyArr[0]
let h2 = hobbyArr[1]
let h3 = hobbyArr[2]
console.log(h1, h2, h3) // 摸魚 搶人頭 逃課
let [a, b, c] = hobbyArr
console.log(a, b, c) // 摸魚 搶人頭 逃課
let [a1, a2, a3, a4] = hobbyArr
console.log(a1, a2, a3, a4) // 摸魚 搶人頭 逃課 undefined
// 交換變數
let a = 1;
let b = 3;
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
// 解析函式返回的陣列
function f(){
return ["小滿", "大喬", "阿珂"]
}
const [name1, name2, name3] = f()
console.log(name1, name2, name3); // 小滿 大喬 阿珂
// 忽略某些返回值
// 大喬老欺負我,太討厭了 (〃>目<) 忽略掉她
function f(){
return ["小滿", "大喬", "阿珂"]
}
const [name1, , name2] = f()
console.log(name1, name2); // 小滿 阿珂
// 忽略全部返回值
function f(){
return ["小滿", "大喬", "阿珂"]
}
const [, ,] = f()
console.log(name1, name2); // name1 is not defined
預設引數
function userInfo(name, age=3){
console.log(name, age);
}
userInfo("小滿") // 小滿 3
展開運算
// 展開運算
const [name, age, ...{pop, push}] = [1, 2]
console.log(name); // 1
console.log(age); // 2
console.log(pop); // function pop()
console.log(push); // function push()
const nameList = ["小滿", "大喬", ...["阿珂", "海月"]]
console.log(nameList); // ["小滿", "大喬", "阿珂", "海月"]
const [a, b, ...[c, d]] = [1, 2, 3, 4]
console.log(a, b, c, d); // 1 2 3 4
const userInfo = {name:"小滿", age:3}
const profile = {hobby:"摸魚", gender:"女", ...userInfo}
console.log(profile); // {hobby: "摸魚", gender: "女", name: "小滿", age: 3}
模組化
- 必須要先匯出,才能匯入正常使用。
- 預設匯出只能匯出一次,也就是隻能有一次
export
- 如果匯入命令寫在js內部,必須加上
<script type="module">匯入命令</script>
- 如果在vue中,不需要新增
type=module
,直接寫就可以了。 - 使用import * as xx 可以匯入全部並起一個別名,後續使用別名操作就可以了
預設匯出和匯入
// ./xm.dq.js
// 被匯出的js檔案
let name = "大喬"
function add(a, b){
return a + b
}
// 完整寫法
// export default {
// name: name,
// add: add
// }
// 省略寫法 推薦
// 必須要先匯出
export default{
name,
add
}
<!-- 正常匯入使用 js內匯入不要忘記加 module -->
<script type="module">
import dq from "./xm/dq.js"
console.log(dq.name); // 大喬
console.log(dq.add(1, 2)); // 3
</script>
命名匯出和匯入
// 1. 依次匯出
export let name = "小滿"
export function add(a, b){
return a + b
}
export let hobby = ['摸魚', "逃課"]
<!-- 2. 匯入 -->
<script type="module">
import {name, hobby} from "./xm/utils.js"
console.log(name); // 小滿
console.log(hobby); // ["摸魚", "逃課"]
</script>
匯入全部 * as xx
<!-- 匯出命令不變 -->
<script type="module">
import * as xm from './xm/utils.js'
console.log(xm.name); // 小滿
console.log(xm.hobby); // ["摸魚", "逃課"]
console.log(xm.add(1, 4)); // 5
</script>
匯入某一個起一個別名
<script type="module">
import {add as myadd} from "./xm/utils.js"
console.log(myadd(2, 3)); // 5
</script>
如果匯入的是index.js
,index.js
可以省略(很少用到)
// 1. 匯出
export default {
name: "小滿",
age: 3,
showName(){
console.log(this.name);
}
}
// 2. 匯入
import xm from "./xm"
console.log(xm.age);
xm.showName()