企业网站搜索优化,wordpress如何发表新文章,延安网站设计,seo人工智能浅谈var let const
var
在ES5中#xff0c;顶层对象的属性和全局变量是等价的#xff0c;用var声明的变量既是全局变量#xff0c;也是顶层变量
var a 10;
console.log(window.a) // 10使用var声明的变量存在变量提升的情况
console.log(a) // undefined
var a 20// 编…浅谈var let const
var
在ES5中顶层对象的属性和全局变量是等价的用var声明的变量既是全局变量也是顶层变量
var a 10;
console.log(window.a) // 10使用var声明的变量存在变量提升的情况
console.log(a) // undefined
var a 20// 编译阶段编译器会将其变成以下执行
var a
console.log(a)
a 20使用var可对一个变量进行多次声明后面声明的变量会覆盖前面的变量声明
var a 20
var a 30
console.log(a) // 30在函数中使用使用var声明变量时候该变量是局部的否则是全局的
// 局部
var a 20
function changeA(){var a 30
}
changeA()
console.log(a) // 20 // 全局
var b 20
function changeB(){b 30
}
changeB()
console.log(b) // 30 let
let是ES6新增的命令用来声明变量
用法类似var但所声明的变量只在let命令所在的代码块内有效
{let a 20
}
console.log(a) // ReferenceError: a is not defined.不存在变量提升
console.log(a) // 报错ReferenceError
let a 1这表示在声明它之前变量a是不存在的这时如果用到它会抛异常
只要块级作用域内存在let命令这个区域就不再受外部影响
var a 123
if (true) {a abc // ReferenceErrorlet a;
}使用let声明变量前该变量都不可用也就是常说的“暂时性死区”
let不允许在相同作用域中重复声明
// 相同作用域
let a 20
let a 30
// Uncaught SyntaxError: Identifier a has already been declared// 不同作用域
let b 20
{let b 30
}因此不能在函数内部重新声明参数
function func(arg) {let arg;
}
func()
// Uncaught SyntaxError: Identifier arg has already been declaredconst
const用于声明只读常量一旦声明常量的值就不能改变
const a 1
a 3
// TypeError: Assignment to constant variable.因此const 在声明常量的同时必须初始化
const a;
// SyntaxError: Missing initializer in const declaration禁止对用var或let声明过变量再用const声明会报错
const实际上保证的并不是变量的值不得改动而是变量指向的那个内存地址所保存的数据不得改动*
对于简单类型的数据值就保存在变量指向的那个内存地址因此等同于常量对于复杂类型的数据变量指向的内存地址保存的只是一个指向实际数据的指针const只能保证这个指针是固定的并不能确保改变量的结构不变
const foo {};// 为 foo 添加一个属性可以成功
foo.prop 123;
foo.prop // 123// 将 foo 指向另一个对象就会报错
foo {}; // TypeError: foo is read-only区别
特点varletconst变量提升YNN是否存在暂时性死区NYY是否存在块级作用域NYY是否允许重复声明YNN是否允许修改声明的变量YYN
参考文献
面试官说说var、let、const之间的区别