文章目录
JavaScript基本语法
变量声明
常量
const a=1;
变量
var或let,区别如下:
- 作用域:
- 使用
var
声明的变量具有函数作用域或全局作用域。这意味着如果你在函数内部使用var
声明一个变量,它只在该函数内部可见。 - 使用
let
声明的变量具有块级作用域。这意味着如果你在代码块的开始(例如在大括号{}
内)使用let
声明一个变量,它只在该代码块内部可见。
- 重复声明:
var
可以被重复声明在同一作用域内,这不会报错。let
不能在同一作用域内重复声明同一个变量,这会导致语法错误。
- 暂时性死区(Temporal Dead Zone):
- 使用
var
声明的变量可以在声明之前被访问,但访问结果未定义。 - 使用
let
声明的变量在声明之前试图访问会导致引用错误(ReferenceError)。
- 变量提升(Hoisting):
var
声明的变量会发生变量提升,即声明会被提升到包含它的函数或全局作用域的顶部。但是赋值不会提升。let
声明的变量不会发生变量提升,试图在声明之前访问会抛出错误。
- 重复使用或重新分配:
- 使用
var
声明的变量可以在声明之后重新分配新的值。 - 使用
let
声明的变量也可以在声明之后重新分配新的值,但如果重新分配的值不是原始类型的值(例如对象或数组),则会导致错误。 对于给定的代码:
var str = "hello world"; // 使用 var 声明变量
let str = "hello universe"; // 使用 let 声明变量(这会覆盖或“遮蔽”前面的 var 声明)
在这段代码中,第一次使用 var
声明的 str
被赋予了 “hello world” 的值,但由于 let
的作用域规则,第二次使用 let
声明的 str
实际上创建了一个新的局部变量,并覆盖了之前的 str
。因此,最后该代码块内的 str
的值将是 “hello universe”。
函数声明
第一种:
function add(a,b){
return a+b;
}
console.log(add(1,2));
第二种:
let add = function(a,b){
return a + b;
}
console.log(add(1,2));
第三种:
let add = function(a,b){
return a + b;
}
console.log(add(1,2));
循环控制
for、while(同其他语言)、for of
let arr = [1,2,3,4,5];
for(let item of arr){
console.log(item);
}
条件判断
if else(同其他语言)
JavaScript基本数据结构
字符串
数组
创建数组
使用数组字面量
let arr1 = [1, 2, 3, 4, 5];
这是创建数组的最简单方法。你只需要在方括号内列出所有的元素,每个元素之间用逗号分隔。
使用 Array 构造函数
let arr2 = new Array(1, 2, 3, 4, 5);
这也是一种创建数组的方法,其中 Array 是一个构造函数,可以接收一个或多个参数。当你传递一个或多个参数时,它们会成为数组的元素。
使用 Array 构造函数并指定长度
let arr3 = new Array(5);
在这种情况下,你使用 Array 构造函数并只传递一个数字参数。这将创建一个具有指定长度的数组,但所有元素都被初始化为 undefined。
使用 Array 构造函数、fill 方法和指定长度
let arr4 = new Array(5).fill(0);
在这里,你首先使用 Array 构造函数创建一个具有指定长度的数组,然后使用 fill 方法将所有元素填充为指定的值(在这种情况下为0)。
数组的常见操作
let arr=[1,2,3,4,5];
获取数组长度
使用 length 属性可以获取数组的长度,即数组中元素的数量。
console.log(arr.length); // 输出 5
获取数组元素
可以通过索引(从0开始)来访问数组中的元素。
console.log(arr[0]); // 输出 1
修改数组元素
通过指定索引,可以直接修改数组中的元素。
arr[0] = 100;
执行此语句后,arr 的第一个元素将变成 100。
复制数组的所有元素到一个新数组
slice() 方法返回一个新的数组对象,它是一个由开始到结束(不包括结束)选择的、由原数组的浅拷贝构成。如果不传递任何参数,它将复制整个数组。
let arr2 = arr.slice();
此外,还可以使用扩展运算符(… )来复制数组。
let arr3 = [...arr];
扩展运算符会创建一个新数组,其中包含原数组的所有元素。
在数组末尾添加一个元素
push() 方法将一个或多个元素添加到数组的末尾,并返回新的长度。
arr.push(6);
执行此语句后,arr 将变成 [100, 2, 3, 4, 5, 6]。
删除数组尾部的元素
pop() 方法删除并返回数组的最后一个元素。
arr.pop();
执行此语句后,arr 将变成 [100, 2, 3, 4, 5]。
在数组开头添加一个元素
unshift() 方法将一个或多个元素添加到数组的开头,并返回新的长度。尽管这个方法存在,但在处理大型数组时,由于它需要将所有现有元素向后移动,所以性能上不如 push()。
arr.unshift(0);
执行此语句后,arr 将变成 [0, 100, 2, 3, 4, 5]。
删除数组开头的元素
shift() 方法删除并返回数组的第一个元素。与 unshift() 类似,这个方法在处理大型数组时性能不佳,因为它需要将所有现有元素向前移动。
arr.shift();
执行此语句后,arr 将变成 [100, 2, 3, 4, 5]。
在实际应用中,通常建议尽量在数组的末尾进行添加和删除操作,因为这些操作的时间复杂度是 O(1),而在数组开头进行这些操作的时间复杂度是 O(n),其中 n 是数组的长度。这是因为当在开头添加或删除元素时,需要移动数组中的所有其他元素。
哈希表
用Map类型来创建哈希表。
创建Map对象
let map = new Map();
通过new Map()创建了一个新的Map对象。
添加键值对
map.set("a", 1);
map.set("b", 2);
map.set("c", 3);
使用set方法向Map中添加了三个键值对。键是字符串"a", “b”, 和"c",值分别是数字1, 2, 和3。
获取键值对
console.log(map.get("a")); // 输出 1
使用get方法通过键"a"从Map中检索值。输出为1。
删除键值对
map.delete("a");
使用delete方法通过键"a"从Map中删除了一个键值对。
判断是否存在某个键
console.log(map.has("a")); // 输出 false
console.log(map.has("b")); // 输出 true
使用has方法检查Map中是否存在特定的键。第一个输出为false,因为键"a"已经被删除;第二个输出为true,因为键"b"仍然存在。
遍历键值对
for (let key of map.keys()) {
console.log(key, map.get(key));
}
// 输出 b 2 和 c 3
使用map.keys()获取Map中所有键的迭代器,然后遍历这些键。对于每个键,使用map.get(key)检索其对应的值,并打印键和值。由于键"a"已被删除,所以只输出了"b" 2和"c" 3。
Map对象提供了一种方便的方式来存储和操作有序的键值对集合,这在某些情况下比使用常规对象更加合适。
哈希集合
ES6 中引入的 Set 类型就是哈希集合,它用来存储不重复的元素,在Set中,每个值只会出现一次,即使你尝试多次添加相同的值,基本操作如下:
创建Set对象
let set = new Set();
通过new Set()创建了一个新的Set对象。
添加元素
set.add(1);
set.add(2);
set.add(3);
使用add方法向Set中添加了三个元素:数字1、2和3。由于Set只存储唯一的值,所以即使你尝试添加重复的值,它也只会出现一次。
删除元素
set.delete(1);
使用delete方法通过值1从Set中删除了一个元素。这意味着值1不再存在于Set中。
判断是否存在某个元素
console.log(set.has(1)); // 输出 false
console.log(set.has(2)); // 输出 true
使用has方法检查Set中是否存在特定的元素。第一个输出为false,因为值1已经被删除;第二个输出为true,因为值2仍然存在。
遍历元素
for (let item of set) {
console.log(item);
}
使用for…of循环遍历Set中的元素。由于值1已被删除,所以循环只会输出值2和3。这展示了Set如何保持元素的插入顺序,并且只包含唯一的元素。
Set对象在需要快速查找成员、删除成员或者进行成员关系测试等场景中非常有用。它提供了比数组更快的查找速度,因为它使用了哈希表来实现。同时,Set自动去重的特性也使得它在处理需要唯一值的场景时非常方便。