JavaScript变量和作用域

变量和作用域:

关于变量的规则:
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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值