var
语句 用于声明一个函数范围或全局范围的变量。
const:常量的值是无法改变的,也不能被重新声明。
PI:3.1415926....
因为变量你修改值,就是等于把引用地址也修改了。
//申明不可变的值
const number = 42;
number = 99;
console.log(number); //TypeError: Assignment to constant variable.
不能复制给const修饰的变量
课堂案例:1.const修饰变量(不可变的值).html
const也可以修饰对象和数组
const MY_OBJECT = {'key': 'value'};
?
// 重写对象和上面一样会失败
// Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};
?
// 对象属性并不在保护的范围内
// 下面这个声明会成功执行
MY_OBJECT.key = 'otherValue'; // Use Object.freeze() to make object immutable
?
// 也可以用来定义数组
const MY_ARRAY = [];
// 可以向数组填充数据
MY_ARRAY.push('A'); // ["A"]
// 但是,将一个新数组赋给变量会引发错误
// Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];
课堂案例:2.const修饰对象.html
课堂案例:3.const修饰数组.html
let
语句声明一个块级作用域的局部变量。
let
允许你声明一个作用域被限制在块作用域中的变量、语句或者表达式。与 var 关键字不同的是,var
声明的变量作用域是全局或者整个函数块的。 var
和 let
的另一个重要区别,let
声明的变量不会在作用域中被提升,它是在编译时才初始化。
var x1 = 1;
if (x1 === 1) {
? ?var x1 = 2;
? ?console.log(x1);
? ?// expected output: 2
}
//引用了全局的
console.log(x1);
?
// expected output: 1
let x2 = 1;
?
if (x2 === 1) {
? ?let x2 = 2;
? ?console.log(x2);
? ?// expected output: 2
}
//作用域划分非常明显
console.log(x2);
// expected output: 1
课堂案例:4.let申明变量.html
作用域规则
let
声明的变量作用域只在其声明的块或子块内部,这一点,与 var
相似。二者之间最主要的区别在于 var
声明的变量的作用域是整个封闭函数。
function varTest() {
?var x = 1;
{
? ?var x = 2; // same variable!
? ?console.log(x); // 2
}
?console.log(x); // 2
}
?
function letTest() {
?let x = 1;
{
? ?let x = 2; // different variable
? ?console.log(x); // 2
}
?console.log(x); // 1
}
课堂案例:5.let作用域规则.html
重复声明
在同一个函数或块作用域中重复声明同一个变量会抛出 SyntaxError
//错误情况1
if (x) {
?let foo;
?let foo; // SyntaxError thrown.
}
?
//错误情况2
let x = 1;
switch(x) {
?case 0:
? ?let foo;
? ?break;
?case 1:
? ?let foo; // SyntaxError for redeclaration.
? ?break;
}
?
//正确情况:然而,需要特别指出的是,一个嵌套在 case 子句中的块会创建一个
//新的块作用域的词法环境,就不会产生上诉重复声明的错误。
let x = 1;
?
switch(x) {
?case 0: {
? ?let foo;
? ?break;
}
?case 1: {
? ?let foo;
? ?break;
}
}
其它情况:
用在块级作用域中,let
将变量的作用域限制在块内,而 var
声明的变量的作用域是在函数内。
var a = 1;
var b = 2;
?
if (a === 1) {
?var a = 11; // the scope is global
?let b = 22; // the scope is inside the if-block
?
?console.log(a); ?// 11
?console.log(b); ?// 22
}
?
console.log(a); // 11
console.log(b); // 2
课堂案例:6.let的重复申明与其它情况.html
课堂案例:7.数组反转和排序的函数.html
课堂案例:8.数组常用方法1.html
at()
根据索引返回对应的值
参数为负数:从后往前检索
匹配给定索引的数组中的元素。如果找不到指定的索引,则返回 undefined。
indexOf()
返回指定值(第一次出现)对应的索引
参数为负数:也是从指定的位置开始往后找
如果不存在,则返回 -1
lastIndexOf()
返回元素最后一次出现的索引,从数组的后面向前查找(从右边向左边找)
如果不存在则返回 -1
参数为正数的时候也是从右边向左边找。
课堂案例:9.数组常用方法2.html
values()
将数组转换为迭代器进行遍历,可以使用增强For循环。
课堂案例:10.数组常用方法3.html
concat()
用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
copyWithin()
复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度。
console.log(array1.copyWithin(0, 3, 4)); 包含了索引3的值而不包含索引4的值,给替换到索引0的位置。
entries()
方法返回一个新的 Array Iterator 对象,该对象包含数组中每个索引的键/值对。
课堂案例:11.数组常用方法之every.html
课堂案例:12.数组常用方法之filter.html
every()
接受的参数是一个函数,它返回一个布尔值。
array1.every(isThreshold) //将左边数组中的每个值,都调用isThreshold进行计算
filter()
过滤数组的元素,该方法的返回值是true和false,最终将为true的结果进行返回。