JS变量与作用域-1

1.变量:保存数据的容器
命名规则:$ _ 字母 数字/数字不能作为开头,区分大小写/避开关键字和保留字
建议:命名要有意义(button_confirm/buttonConfirm/btnConfirm),风格保持统一
声明变量:var btnConfirm;
2.数据类型
基本类型:数字 str true/false undefined null
引用类型:{} []
基本类型的值不能修改,引用类型的值可以修改
基本类型调用方法/属性时会先找到对应的包装对象,再对其调用方法/属性
3.堆栈
内存可分为堆内存和栈内存,栈内存有序排列且大小固定,堆内存无序排列且大小不固定
在这里插入图片描述
基本类型保存在栈内存中(利于寻找),引用类型保存在堆内存中(引用类型的地址保存在栈内存中,数据保存在堆内存中,先调用地址查询再调用值)–保存引用类型的变量实际保存的是它的地址

function fn(){
	
}
fn.person = 'xm';
console.log(fn.person);

如上图所示,函数是引用类型,可通过这种方式添加属性和方法
4.变量相等比较
基本类型使用 == / ===正常比较
引用类型比较,只有指向同一个引用才相等

var xm = {
	age:18,
	score:4
};
var xh = {
	age:18,
	score:4
};
console.log(xm === xh);

两个对象保存于堆内存的不同位置,所有不相等

var xm = {
	age:18,
	score:4
};
var xh = xm;
console.log(xm === xh);

两个变量指向同一个对象才相等

function equalObjs(a,b){
	for(var p in a){
		if(a[p] !== b[p]) return false;
	}
	return true;
}

比较对象的值是否相等

function equalArrays(a,b){
	if(a.length !== b.length) return false;
	for(var i=0;i<a.length;i++){
		if(a[i] !== b[i]) return false;
	}
	return true;
}

比较数组的值是否相等

5.复制变量的值
基本类型:

var xmScore = 4;
var xhScore = xmScore;
xhScore++;
console.log(xhScore);
console.log(xmScore);

结果为5 4,基本类型之间无瓜葛

引用类型

var xm = {
	age:18,
	score:4
};
var xh = xm;
xh.score++;
console.log(xh.socre);
console.log(xm.socre);

结果为5 5,赋值只是将地址指针传递,还是指向同一个对象,对象发生改变时,都发生改变(避免这种写法)
若对其中一个变量赋新值,则双方不再有关系

var xm = {
	age:18,
	score:4
};
function copyObj(obj){
	var newObj = {};
	for(var p in obj){
		newObj[p] = obj[p];
	}
	return newObj;
}
xh = copyObj(xm);
console.log(xh === xm);

结果为false,此方法称为浅拷贝,只能针对属性值为基本类型复制,若属性值为数组或对象则无法完成。
注:如果两个不同类型的数据进行==比较,会把左右转换成同一类型再比较;如果一个运算数是对象,另一个是数字,会把对象转换成数字。4 == 【4】 结果为True.

6.参数传递

function fn(a,b){//a,b为形参
	return a+b;
}
fn(1,2);//1,2为实参

基本类型传递

function addTen(num){
	return num + 10;
}
var score = 10;
console.log(addTen(score));
console.log(score);

结果为20 10,符合前面所描述特性

引用类型传递

var score =[1,2,3,4];
function add(tt){
	for(var i=0;i<tt.length;i++){
		tt[i] += 10;
	}
	return tt;
}
console.log(add(score));
console.log(score);

结果都为[11,12,13,14],引用类型的变量传递的其实也是值,只是它的值为地址指针

function setName(obj){
	obj.name = 'xm';//对person赋值
	obj = {};//对obj重新赋值,它与person断开连接
	obj.name = 'xh';
}
var person = {};
setName(person);
console.log(person.name);

结果依然是xm!

7.检查类型

console.log(typeof null);
console.log(typeof []);
console.log(typeof {});
console.log(typeof /a/);//正则表达式

以上类型通过typeof得到的结果都是object,无法区分;只能采用instanceof

语法: [] instanceof Array
判断[]是否是Array的实例,只能与引用类型联用,若与基本类型联用只返回false

console.log([] instanceof Array);
console.log([] instanceof Object);
console.log({} instanceof Object);
console.log({} instanceof Array);

结果为 true true true false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值