一、声明变量
1.变量声明let :ES6新语法,用来声明变量
作用:
- 声明一个块级作用域的本地变量
- 可以设置初始值
语法:
//声明变量 let x //声明并设置初始值 let y = 10 console.log(y); //重新赋值 y = "你好世界" //打印结果 console.log(y); //你好世界
注意点:
a.不允许重复声明:let不允许在相同作用域内,重复声明同一个变量。
b.有块级作用域:它的用法类似于var,但是所声明的变量,只能在let命令所在的代码块内有效。
在下面代码块之中,分别用let和var声明了两个变量。
{
let a = 10;
var b = 1;
console.log(a);//10
console.log(b);//1
}
// console.log(a); //undefined
// console.log(b); //1
// 结果let声明的变量报错,var声明的变量返回了正确的值。
// 这表面,let声明的变量只在它所在的代码块有效。
// console.log(a); //a is not defined
//console.log(b); //1
c.不会变量提升:var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为underfined。 这 种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。为了纠正这种现象,let命令改变了语法行为,它声明的变量一定要在声明后使用,否则报错。
console.log(foo);
var foo =2; //undefined
// let的情况
console.log(bar);Cannot access "bar’ before initialization(无法在初始化之前访问变 )
let bar = 2;
2.变量声明var
作用:
- 数组变量
- 和let非常相似
语法:
//1.声明变量
var food
//2.变量声明+初始值
var noodle = "牛肉面"
//3.重新赋值
noodle = '牛肉面'
console.log(noodle);
//【注意点1:变量会提升】
console.log(num);
var num = 10;
//【注意点2:没有块级作用域】
for(var i = 1; i < 5 ; i++){
console.log('循环内' + i);
}
3.常量声明const
const声明一个只读的常量。一旦声明,常量的值就不能改变。
注意点:
a.基本类型数据无法重新赋值
b.必须设置初始值:const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值
c.有块级作用域:const的作用域和let命令相同:只在声明的块级作用域内有效
d.不会变量提升:const命令声明的常量也是不能提升,同样存在暂时性死区,只能在声明的位置后面使用。
在const中,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。 但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针。
const只能保证这个指针是固定的(即总是指向另一个固定的地址)。
基本数据类型无法重新赋值。
引用类型(对象、数组...),可以更改内容。(注:不能改的是栈)
4.变量提升
1.定义:变量提升即将变量声明提升到它所在作用域
2.作用:通过var定义(声明)的变量,在定义语句之前就可以访问到。
console.log(a); //underfind
var a = 1;
//因为有变量提升的缘故,上面的代码实际的执行顺序为:
var a;
console.log(a);
a = 1;
二、侦听器
作用:用来侦听数据有没有变化,一旦有变化就调用函数
语法:在和data、methods这些平级的位置写一个watch
new Vue({
el:'',
data:{},
methods:{},
//侦听器
watch:{
//参数一:改变后的值
//参数二:改变前的值
要侦听的数据(newValue,oldValue){
}
}
})
对数组进行侦听
数组是应用类型,存在比较复杂的侦听规则。
从理论上说,修改一个数组的内容,比如修改数组中某个元素的值,或者给数组添加新的元素,都不会修改数组本身的地址。为此.Vue.is对数组做了特殊处理,使得使用标准的数组操作方法对数组所做的修改,都可以被侦听到。
1.Vue不能检测以下数组的变动:
a.当你利用索引值直接设置一个数组时,例如:vm.items[index0fItem] = newValue
b.当你修改数组的长度时,例如:vm.items.length = newlength
2.使用标准方法修改数组可以被侦听到
https://v2.cn.vueis.org/v2/guide/list.html#%E6%95%B0%E7%BB%84%E6%9B%B4%E6%96%B0%E6%A3%80%E6%B5%8B
push() 尾部添加
pop()尾部删除
unshift()头部添加
shift()头部删除
splice()删除、添加、替换
sort()排序
reverse()逆序
(Vue将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新,以上就是被包裹的方法。)
在数组中使用侦听器总结:
1.彻底替换为一个新数组,那么可以被侦听到。
2.如果使用了push()等标准的数组操作方法,那么可以被侦听到。
3.如果直接修改数组的元素,那么无法被侦听到。
/(解决方法:使用$set(()方法修改元素的值。Vue3语法。)
不要使用length属性来修改数组长度,而改用其他标准方法显示数组长度的变化。
三、作用域
1.定义:
作用域是运行时代码中某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码中变量和其他资源的可见性。
function Fun(){
let a = '内层变量'
console.log(a);
}
Fun();
console.log(a);
function fun(){
let a = '变量'
console.log(a);
}
fun()
// console.log(a); // a is not defined
变量a在全局作用域没有声明,所以在全局作用域下取值会报错。
作用域就是一个独立的地盘,让变量不会外泄、暴露出去。
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
ES6之前JavaScript没有块级作用域,只有全局作用域和函数作用域。
ES6的到来,为我们提供了"块级作用域",可通过新增命令let和const来体现。
2.函数作用域
function outFun(){
var a = '函数内部的变量';
function innerFun(){
console.log(a); //函数内部的变量
}
innerFun();
}
// console.log(a); //a is not difined
innerFun; //innerFun is not difined
outFun()
四、键值对
1.什么是键值对?
键值对('key = value') 顾名思义,每一个键会对应一个值。
2.举例
a:身份证号和你本人是绑定的关系。每一个身份证号(键)都会对应一个人(值)。
b:我们在登录微信或者游戏时,需要输入手机号验证身份。系统会向该手机号发送一条验证短信。
这里的手机号码(键),对应的接收用户就是值。
每个键对应响应的值,当按下响应的键时,就会输出响应的结果。
键:就是存的值的编号。
值:就是要存放的数据。