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