var a = 10; var b = a; a = 20; console.log(b); //10
var a = [10]; var b = a; b.push(20); console.log(a,b); //[10, 20] [10, 20]
var a = {name:'S'}; var b = a; b.name = N; console.log(a,b); //{name: "N"} {name: "N"}
4:var属于ES5规范,let属于ES6规范
5:var有预处理机制,let没有。预处理机制也就是常说的声明提前
声明提前:不管变量被声明在函数什么位置,所有变量声明都会被提升至函数顶部(变量声明指 var a; 即声明还未赋值)
比如声明变量a并赋值为1,即 var a = 1; 则 var a;会被提升至函数顶部 (只是a被提前,a的值1不会被提前)
注:1. 在声明变量时一定要初始化 ,初始化指 var a = 1; (声明并赋值 )
2. 即使在函数内部,声明变量时一定要加上var,不要只写 a = 1; 否则变量a会自动升为全局变量
下面立即函数执行后,控制台不会打印出1,而是undefined,因为只有声明被提前,值没有 下面立即执行函数执行后,控制台不会打印出1和undefined,而是报错,因为let声明的变量不会被提前
:作用域的不同,var是全局作用域,let是块级作用域
下面代码控制台会打印出1
下面代码控制台不会打印出1,会报错,提示a没有定义 (let定义的变量只在{}里才能访问到)
数组:
<script>
let arr = [
{
name:"Simba",
age:20
},
{
name:"Ace",
age:30
},
{
name:"Roger",
age:40
}
]
//遍历
arr.forEach(r => {
r.gender = "男"
})
//通过旧数组映射出新数组
console.log(arr.map(r => "姓名" + r.gender));
console.log(arr.map(r => r.age));
//过滤师选
console.log(arr.filter(r => r.age >= 30));
//是否存在
console.log(arr.some(r => r.age === 20));
//是否全部都是
console.log(arr.every(r => r.gender === "男"));
//统计操作
console.log(arr.reduce((total,current) => total + current.age,0));
</script>
展开运算符 "..."
<script>
let a = {
name: 'simba',
age: 20
}
let b = {
...a,
gender: "男"
}
console.log(b);
console.log(...[1, 2, 3]);
function test(...arr) {
console.log(arr.reduce((a, b) => a + b));
}
test(1, 2, 3, 4, 5)
function aaa(age = 20) {
console.log(age);
}
aaa()
aaa(33)
let str = `我叫${b.name}`
console.log(str);
</script>