JavaScript
语言基础
变量
var
1var message 2// define variable 'message', not initialized, message == undefined 3// --------- 4var message = 'string' 5// /\ 6// || 7// \/ 8var message 9message = 'string' 10// --------- 11// ..., initialized, message == 'string'
var 声明作用域
var 声明函数作用域,let 声明块作用域,块作用域是函数作用域的子集。
1function test() { 2 var message = 'hi' 3} 4test() 5console.log(message) 6// or 7function test() { 8 message = 'hi' 9} 10// 在这里,message 被声明为全局变量
var 的声明提升
1function foo() { 2 console.log(age) 3 var age = 26 4} 5foo() 6 7// 等价于 8 9function foo() { 10 var age 11 console.log(age) 12 age = 26 13} 14...
let
- let 声明块作用域,var 声明函数作用域。块作用域是函数作用域的子集,因此适用于 var 的作用域限制,同样适用于 let。
- let 不允许在同一块作用域中重复声明
let 和 var 混用,重复声明同样报错,它们并不是声明不同变量,而是变量在相关作用域中如何存在。
1// var 2if (true) { 3 var name = 'Matt' 4 console.log(name) 5) 6console.log(name) 7// let 8if (true) { 9 let name = 'Matt' 10 console.log(name) 11} 12console.log(name)
暂时性死区 temporal dead zone
let 与 var 相比的另一区别:let 声明的变量不会在作用域中被提升。
1// var 2console.log(age) 3var age = 23 4// let 5console.log(age) 6let age = 23
全局声明
let 在全局作用域中声明的变量不会成为 window 对象的属性,而 var 声明的变量则会。
1// var 2var name = 'Matt' 3console.log(window.name) 4// let 5let age = 23 6console.log(window.age)
在全局作用域中的 let 声明,相应变量会在页面的生命周期内延续。
- 条件声明 let 不宜用在条件声明语句块中
for 循环中的 let 声明
1for(var i = 0; i < 5; ++i) { 2 setTimeout(() => console.log(i), 0) 3}
退出循环时,循环变量保存的是导致循环退出的值。
而对于 let 声明的 for 循环,JS 引擎在后台会为每个迭代循环声明一个新的迭代变量。
const
const 和 let 基本相同,唯一的重要区别:const 声明变量的同时必须初始化变量,而且尝试修改 const 声明的变量会报错。 const 声明的限制只适用于它指向的变量的引用。如果 const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反 const 的限制。
仅在 for-of/for-in 语句中声明一个不会被修改的 for 循环变量:
1// 1 2let i = 0 3for (const j = 7; i < 5; ++i) { 4 console.log(j) 5} 6// 2 7for (const key in (a: 1, b: 2)) { 8 console.log(key) 9} 10// 3 11for (const value of [1,2,3,4,5,6]) { 12 console.log(value) 13}
数据类型
8 种数据类型:7 种原始(基本)数据类型:Boolean, null, undefined, Number, BigInt, String, Symbol;1 种引用数据类型:Object。
Standard built-in objects
Proxy
Proxy
对象可为其他对象创建代理,拦截并重新定义该对象的基本操作。
其他
1var a = 1
2function b() {
3 a = 10
4 return
5 function a() {}
6}
7b()
8alert(a)
这代码里, function a() {}
这样写产生了怎样的影响?它和 a = 10
的关系是什么?
1// function hoisting
2function test() {
3 foo()
4 bar()
5 var foo = function () {
6 alert("this won't run ")
7 }
8
9 function bar() {
10 alert('this will run')
11 }
12}
13test()