变量和作用域:
关于变量的规则:
1、一次:哪里需要写哪里。
2、多次:保存数据的容器,变量。
关于标识符的回顾:
标识符是变量、函数、属性的名字,或者函数的参数
命名规则:
1、可以用字母,数字,下划线_ 、美元符号$组成
2、不能以数字开头。
3、不能使用关键字(string if for var …) 保留字(go class …)作为标识符。
基本数据类型和引用数据类型
基本数据类型:
1、number
2、“string”
3、true/false
4、undefined
5、null
应用数据类型:
1、数组[ ]
2、对象{ }。
区别
1、基本数据类型的值不可以修改
2、引用数据类型的值可以修改。
var num = 4;
var num = 3; //这不叫修改 叫覆盖
var str = "string";
var anotherStr = str.replace("s","");//replace 替换
console.log(str);//string
console.log(anotherStr);//tring
var person = {};
person.name = "xiaoming";
person.sex = "male";
person.sex = "female";
person.family = ["baba","mama"];
// delete person.sex;//删除
console.log(person);
// 基本数据类型不可修改
var person = "person";
person.name = "xiaoming";
console.log(person.name); //undefined
堆栈
概念:数据会被保存到堆栈
堆内存:空间大小不固定
栈内存:有序排列,会被分成一个个小房间,每个房间都可以存储变量,但每个空间大小都是固定的,不能扩建。
总结! 栈内存放基本数据类型 堆内存放引用数据类型。
变量的相等比较
基本数据类型比较:
//基本数据类型比较
var xmScore = 4;
var xhScroe = 4;
console.log(xmScore==xhScroe);//true
console.log(xmScore===xhScroe);//true 都是number类型
引用数据类型比较
//引用数据类型比较
var xm = {age:18,score:4};
var xh = {age:18,score:4};
console.log(xm==xh);//false
console.log(xm===xh);//false 一般引用数据类型用 === 比较
var xm = {age:18,score:4};
var xh = xm;
console.log(xm===xh);//true
比较两个对象的值相等
var xm = {age:18,score:4};
var xh = {age:18,score:4};
function equalObjs(a,b){
for(var p in a){ //p在数组里是代表 索引,在对象里是代表 属性名
console.log(a[p]+"-"+p);
console.log(b[p]+"-"+p);
if(a[p]!==b[p]){
return false;
}
return true;
}
}
console.log(equalObjs(xm,xh));//true
用数组的方法判断对象的值是否相等
var xm = {age:18,score:4};
var xh = {age:18,score:4};
function equalArray(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;
}
}
复制变量值!
var xmScore = 4;
var xhScore = xmScore;
console.log(xhScore);//4
//引用数据类型
var xm = {age:18,score:4};
var xh = xm;
xh.score++;
console.log(xh.score);//5
console.log(xm.score);//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);//age:18,score:4
console.log(xh===xm);//false 不是同一个对象
参数传递
function fn(a,b){//a,b是形参
return a+b;
}
fn(1,2);//实参
// 基本数据类型传递参数
function addTen (num){
return num+10;
}
var score = 10;
console.log(addTen(score));//10+10=20
// 引用数据类型
function setName(obj){
return obj.name="xm";
}
var person = {};
setName(person);//调用person函数
console.log(person.name);//xm
// obj=person//他们指向同一个地址
检测数据类型
//typeof / typeof()
console.log(typeof(4));//number
console.log(typeof("str"));//string
console.log(typeof(true));//boolean
console.log(typeof(undefined));//undefined
console.log(typeof(null));//object
console.log(typeof []);//object
console.log(typeof {});//object
console.log(typeof function(){});//function
console.log(typeof /a/);//object 正则表达式
console.log(typeof Array);//function
//instanceof 表示前面是否是后面的实例
console.log([] instanceof Array);//true 数组是Array
console.log([] instanceof Object);//true 数组是Object
console.log({} instanceof Object);//true 对象是Object
console.log({} instanceof Array);//false 对象不是数组
//instanceof不能和基本数据类型一起使用
// console.log(1 instanceof Number);
关于作用域
作用域分为:1、全局作用域 2、局部作用域 (函数作用域)
作用域可以理解为:起作用的区域或者范围
var name = "xm";//全局变量
function fn(argument){
var sex = "male";
console.log(name);//xm 全局的变量可以访问
}
fn();
var name = "xm";
function fn(argument){
var sex = "male";
}
console.log(sex);//局部作用域 访问不到
fn();
四种经典类型的题型
1、
var a = 1;
function fn (){
console.log(a);//undefined
var a = 2;
}
fn();
console.log(a);//1
2、
var a = 1;
function fn(){
console.log(a);//1 这里的fn作用域中没有找到var定义 所以只能往外找,输出第一个a=1
a = 2;//由于它没有var定义,所以这里的a是全局变量 覆盖
}
fn();
console.log(a);//2
3、
var a = 1;
function fn(a){//fn作用域中的局部变量 var a;
console.log(a);// undefined 预解析机制
a = 2;//这里的a 修改的是局部变量
console.log(a);//2
}
fn();
console.log(a);//1
4、
var a = 1;
function fn(a){
console.log(a);//1
a = 2;//这里的a 修改的是局部变量
}
fn(a);//读取的是全局a 所以第一个a输出1
console.log(a);//1
总结
1、变量保存数据容器。
2、变量命名规则和建议
3、基本数据类型和引用数据类型的区别:
4、作用域:全局和函数作用域
5、内存清楚:设置null