一、var 、let 、const的区别
-
var是ES5提出的,let和const是ES6提出的。
var不存在块级作用域。let和const存在块级作用域。ES5中作用域有:全局作用域、函数作用域。没有块作用域的概念。
ES6中新增了块级作用域。块作用域由 { } 包括,if语句和for语句里面的{ }也属块作用域。 -
const声明的是常量,必须赋值
一旦声明必须赋值,不能使用null占位。 声明后不能再修改。 如果声明的是复合类型数据,可以修改其属性。
let和var声明的是变量,声明之后可以更改,声明时可以不赋值。
var允许重复声明变量,后一个变量会覆盖前一个变量。
let和const在同一作用域不允许重复声明变量,会报错。var声明的变量存在变量提升(将变量提升到当前作用域的顶部)。
即变量可以在 声明之前调用,值为undefined。
let和const不存在变量提升。即它们所声明的变量一定要在声明后使用,否则报
ReferenceError错。
数组常用方法
https://www.cnblogs.com/sqh17/p/8529401.html
改变原数组的方法:
shift()、unshift()、pop()、push()、reverse()、sort()、splice()
不改变原数组的方法:
concat()、slice()、join()、map()、filter()、reduce()、some()
splice、split、slice的区别
1、splice(start,deletecount,item) 会改变原数组的方法。
arr.splice(i,n) 删除从i(索引值)开始之后的那个元素。返回值是删除的元素
参数: i 索引值 n 个数
splice(start,deletecount,item)方法:
- start:起始位置
- deletecount:删除位数
- item:替换的item
- 返回值为被删除的字符串
- 如果有额外的参数,那么item会插入到被移除元素的位置上。
splice:移除,splice方法从array中移除一个或多个数组,并用新的item替换它们。
let arr = [1,2,3,4,5]
console.log(arr.splice(2,2)) //[3,4]
console.log(arr) // [1,2,5]
var a=[‘a’,‘b’,‘c’];
var b=a.splice(1,1,‘e’,‘f’);
//a=[‘a’,‘e’,‘f’,‘c’]
//b=[‘b’]
var a = [1, 2, 3, 4, 5, 6];
//console.log("被删除的为:",a.splice(1, 1, 8, 9)); //被删除的为:2
// console.log("a数组元素:",a); //1,8,9,3,4,5,6
// console.log("被删除的为:", a.splice(0, 2)); //被删除的为:1,2
// console.log("a数组元素:", a) //3,4,5,6
console.log("被删除的为:", a.splice(1, 0, 2, 2)) //插入 第二个数为0,表示删除0个
console.log("a数组元素:", a) //1,2,2,2,3,4,5,6
2、split()是使用指定的分隔符字符串将字符串分割成子字符串,返回一个子字符串数组。
var str = 'hello world';
var arr = str.split(' ');
console.log(arr);//["hello", "world"]
3、slice()方法可以对数组或字符串截取。
arr.slice(start,end) 切去索引值start到索引值end的数组,不包含end索引的值,返回值是切出来的数组。
语法:slice(start,[end])方法
包含了源函数从start到 end 所指定的元素,但是不包括end元素。
- 对数组进行部分截取,该方法返回一个新数组。不会改变原数组。
- 如果出现负数就把负数与长度相加后再划分。
- slice中的负数的绝对值若大于数组长度就会显示所有数组
- 若参数只有一个,并且参数大于length,则为空。
- 如果结束位置小于起始位置,则返回空数组
- 返回的个数是end-start的个数
let arr = [1,2,3,4,5]
console.log(arr.slice(1,3)) // [2,3]
console.log(arr) // [1,2,3,4,5]
var a = [1, 2, 3, 4, 5, 6];
console.log(a.slice(3)); //4,5,6 从下标为0的到3,截取3之后的数
console.log(a.slice(0, 3)); //1,2,3 从下标为0的地方截取到下标为3之前的数
console.log(a.slice(0, -2)); //1,2,3,4 end+length
console.log(a.slice(-4, 4)); //3,4
console.log(a.slice(-7)); //1,2,3,4,5,6
console.log(a.slice(-3, -3)); //空
** 2. 提取某个字符串的一部分,并返回一个新的字符串,不会改变原字符串。**
var b = 'hello world'
alert(b.slice(0, 3));//hel
alert(b);//hello world
# ES6 symbol类型详解
https://juejin.cn/post/6925619440843227143
1、 定义:
symbol类型是新的原始数据类型,表示独一无二的值,其他的原始数据类型还有Number,String,Boolean,Null,Undefined;Object属于复杂数据类型。
2、symbols 作为对象的属性
var a = Symbol('a');
var obj = {
a: 'normal key',
[a]: 'symbol key'
}
3、利用Symbol的特性可定义内部私有属性或方法
二、map、for、forEach、for in 、for of循环的区别
forEach:没有返回值, 但不能使用break、continue和return语句
for…in:遍历数组索引、对象的属性。使用for…in遍历时,原型链上的所有属性都将被访问。
map: 有返回值。并且可以返回一个结果数组。但是map 遍历对象的话也会报错,所以map只能循环数组或者对象数组。
for...of :创建一个循环来迭代可迭代的对象。在 ES6 中引入的 for...of 循环,以替代 for...in 和 forEach() ,并支持新的迭代协议。for...of 允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构等。
循环返回的是value。
const iterable = ['mini', 'mani', 'mo'];
for (const value of iterable) {
console.log(value);
}
// Output:
// mini
// mani
// mo
Maps(映射)
Map 对象就是保存 key-value(键值) 对。对象和原始值可以用作 key(键)或 value(值)。Map 对象根据其插入方式迭代元素。换句话说, for...of 循环将为每次迭代返回一个 key-value(键值) 数组。
const iterable = new Map([['one', 1], ['two', 2]]);
for (const [key, value] of iterable) {
console.log(`Key: ${key} and Value: ${value}`);
}
// Output:
// Key: one and Value: 1
// Key: two and Value: 2
Set(集合)
Set(集合) 对象允许你存储任何类型的唯一值,这些值可以是原始值或对象。 Set(集合) 对象只是值的集合。 Set(集合) 元素的迭代基于其插入顺序。 Set(集合) 中的值只能发生一次。如果您创建一个具有多个相同元素的 Set(集合) ,那么它仍然被认为是单个元素。
const iterable = new Set([1, 1, 2, 2, 1]);
for (const value of iterable) {
console.log(value);
}
// Output:
// 1
// 2
三、JavaScript Map 和 Object 的区别(https://www.cnblogs.com/ysx215/p/11387938.html)
1、Key filed
在 Object 中, key 必须是简单数据类型(整数,字符串或者是 symbol),而在 Map 中则可以是 JavaScript 支持的所有数据类型,也就是说可以用一个 Object 来当做一个Map元素的 key。
2、元素顺序
Map 元素的顺序遵循插入的顺序,而 Object 的则没有这一特性。
3、继承
Map 继承自 Object 对象。