目录
1.变量
let和var是申明变量类型的数据存储容器
什么是变量?变数 保存的值可变它保存的参数值是可以根据需求做操作变更处理重新赋值的,比如
var num1 = 1;
console.log(num1); // 1
num1 = num1 + 1;
console.log(num1); // 2
let num2 = 1;
console.log(num2); // 1
num2 = num2 + 1;
console.log(num2); // 2
这些没得问题吧?
这是属于正常系统操作范围内的
然后都是变量申明他们俩有什么区别呐?
1.1重复申明
var a = 1; // a = 1
a = 2; // a = 2
// 常规操作对吧?没的问题是吧?我改变它内部的值
var a = 1; // a =1
// 然后我继续写代码的时候我忘了我申明过a了,我又申明了一次a~这时~系统说没得问题! 你申明我就存储它! 老铁没毛病
let a = 1; // a = 1
a = 2; // a = 2
let a = 1; // Uncaught SyntaxError: Identifier 'a' has already been declared
你看你看 这怎么报错了? 标识符已申明?这就是传说中的不能重复申明~let申明的变量容器不能再重复申明要不~你看被提醒了吧?let会在申明时和申明后对这个变量进行保护 防止重复申明出现的参数混乱等情况也就是说~
var a = 1; // a = 1
let a = 1; // 不行
let a = 1; // a = 1
var a = 1; // 也不行!!!!
1.2作用域
在js代码中
let a = true
if(a) {
var j = a;
let i = a;
}
console.log(j) // true
console.log(i) // i is not defined
同样的执行申明输出结果!为什么结果会差别这么大呐?在js中es6申明语法let又有人叫做块级作用域申明, 大括号作用域申明. 所有if for function语句内的let申明在外部都是读取不到的! 而var 在if for中申明后外部还是可以读取的到,只有function中var的变量会有作用域隔离的效果!
1.3变量提升
变量的提升是啥?变量的提升顾名思义就是把变量提升!
console.log(a); // a is not defined
// 输出一个未定义的变量 会提示它是未定义的!这是系统中的检测功能在提醒我们这个地方有问题!老铁 改一哈?
var b;
console.log(b); // undefined
// undefined一个申明未复制的变量会被定义为undefined!为什么不是not defined?因为这个变量是申明过的,a is not defined是报错undefined是输出了b的值 只是b的值是undefined罢了~来我们继续
console.log(c); // undefined
var c = 0;
// 这个!申明了 也赋值了 为什么他的结果还是 // undefined ? 最少他应该给我个not defined!!为什么会这样呐?这就涉及到变量的提升了!
// 在js代码在执行的时候,系统会先读取代码. 读取到变量申明的时候会将这个申明提升到头部.也就是说在输出的时候其实已经申明好了这个变量~只是在后面书写var c = 0;这部才赋值而已
console.log(c); // undefined
var c = 0;
// 实际是等同于
var c;
console.log(c); // undefined
c = 0;
// 这样的! 这样看着就明白了吧?
// 而let就不同了
// console.log(d); // Cannot access 'd' before initialization
let d = 0;
console.log(d); // 0
// 哎~对了 我就是不提升! 系统读到我了啊?度就读呗~让我提升上去?我不干~现在才申明的我 那我就是在这以后才需要使用的呗~我就听程序员爸爸的话在这呆着~所以系统就和你说了 你这个还没初始化就用了!你这些的有问题~块检查检查吧~嗯~就这样~对了啊~报错的时候后面的console.log不会输出啊~
常见的我们申明
2.常量
consot是用于申明常量类型的数据存储容器
什么是常量呐?常数 值不可变 修仙界常用语……定数!!
const num3 = 1;
console.log(num3); // 1
num3 = num3 + 1;
console.log(num3); // Uncaught TypeError: Assignment to constant variable.
都说是定数了 你还想着改变它~我命由我不由天对吧?不试试怎么知道到底行不行是不?现在报错了吧?常量是不可以重新赋值的!存储在它内部的值不可变 但是可用 可运算 就是计算机中常见的只读类型 值可以读到它 甭想改变它~
甭想?emm好像怎么说呐~
const num4 = {a: 1};
console.log(num4.a); // 1
num4.a = 2;
console.log(num4.a); // 2
怎么变了?不是说不能变得嘛?
这是因为{a:1}是引用数据类型 这种数据类型在变量中存储的实际是对应到栈内存中存储这些数据的地址值, 我们在改变这些地址值中的a属性的时候常量num4保存的地址值是 '不变' 的 变得只是对象中a的值. 这可能就是小势可改, 大势不可违吧~系统在运行中只关注保存在常量中的物理地址值 而对于地址值中的变化 它是不关注的! 所以只要不对常量进行
const num4 = {a: 1};
num4 = {a: 1};
这种重复赋值的操作就行了 你说他还是等于原来那个对象啊~不都是只有个 {a: 1}吗? sorry 就算里面的值完全一样 它在计算机中也是两个不同的对象 ! 这涉及到引用数据类型和基本数据类型还有堆栈存储的问题了 emmm 就在后面的文章里写吧