共同点
var/let/const的共同点是在全局作用域中定义的变量,可以在函数中使用。
var bj = 'beijing';
function show(){
return bj;
}
console.log(show());
函数中声明的变量,只能在函数及其子函数中使用。
function a(){
var web = '北京';
function show(){
console.log(web);
}
show(); //子函数结果:北京
console.log(web); //函数结果:北京
}
a();
console.log(web); //全局访问 undefined
函数中声明的变量就像声明了私有领地,外部无法访问。
var
使用var声明的变量存在于最近的函数或全局作用域中,没有块级作用域的机制。
没有块级作用域很容易污染全局:
function run(){
web = 'beijing';
}
run();
console.log(web); //beijing
没有块作用域时,var也能污染全局,使用let则不会
let i = 100;
for(let i=0;i<10;i++){
console.log(i); //0 1 2 3 4 5 6 7 8 9
}
console.log(i); //100
let
与var声明的区别是 let/const 拥有块作用域。
let 存在块作用域特性,变量只在块作用域内有效
if(true){
let name = 'beijing';
console.log(name); //beijing
}
console.log(name); //name is not defined
块内部是可以访问上层作用域中的变量。
if(true){
let name = 'beijing';
(function(){
if(trrue){
console.log(`这是块内访问:${name}`);
}
})();
}
console.log(name);
每一层都是独立的作用域,里层作用域可以声明外层作用域同名变量,但不会改变外层变量。
function run(){
web = 'beijing';
if(true){
let web = 'fangshan';
console.log(web); //fangshan
}
}
run();
console.log(web) //beijing
const
使用const声明常量,比如可以声明后台接口url接口地址
1.常量名建议全部大写
2.只能声明一次变量
3.声明的同时必须赋值
4.不允许再次全新赋值
5.可以修改引用类型变量的值
6拥有块、函数、作用域
常量不允许全新赋值
try{
const URL = 'www.baidu.com';
URL = 'www.taobao.com'; //产生错误
}catch(error){
throw new Error(error);
}
改变常量引用类型的值
const INFO = {
url:'www.baidu.com',
port:'8080'
};
INFO.port = '443';
console.log(INFO);
传值与传址
基本数据类型指数值、字符串等简单数据类型,引用类型指对象数据类型
基本类型的复制是值的赋值,互相不受影响。下例中将a变量的值赋值给b变量后,因为基本类型的变量是独立的,所以a的改变不会影响b的值
let a = 100;
let b = a;
a = 200;
console.log(b);
对于引用对象来讲,变量保存的是引用对象的指针。变量间赋值时其实赋值是变量的指针,这样多个变量就引用同一个对象。
let a ={
web = "beijing";
}
let b = a;
a.web = "guangzhou";
console.log(b);