变量声明

什么是变量

变量:未知数 存储一个值 这个值可以发生改变
如:var a = 10; (在javascript中我们成为语句)
javascript的变量都是由var 声明,
语法: var 变量名 = 值
因为变量的值是可以改变的,所以在变量声明和赋值的时候,后面的会覆盖前面的。  输出变量,一定不要加引号
 var a = 10;     document.write(a); //10     
 var b = 20;     b = b + 1;     document.write(b); //21  在原来的基础上+1    
 var c = 10;     c = 16;     document.write(c); //16 后面的会覆盖前面的    
 var d = 10;     d = d + 1;     d = d - 6;     document.write(d); //5   

在javascript里 声明变量简写为 var ;通过var name 就可以声明一个变量了;

注意变量的声明和定义是两回事;

 var name;        //变量声明
    name="琪琪";     //变量定义
    var name="琪琪"; //变量声明+定义

    //分析var name="琪琪";  分两步走
    第一步 var name;先声明一个name的变量;
    第二步 name="琪琪" 创建数据"琪琪"这个字符串,
          并且把字符串"琪琪"这条数据赋值给name这个变量;
          在定义(赋值)变量的name值;
          
  这个时候name的类型就是所代表值的类型;

可通过typeof来检测;通过检测可以知道这个变量所代表的值是一个字符串类型的数据;

    var name=" 琪琪",
    gender;
    console.log(name,typeof name); //琪琪string
    console.log(gender,typeof gender); //undefined "undefined

 虽然关键字var不是必须的,但是最好每次声明一个新变量都加上;

需要注意的是变量本身是没有意义的,只是数据的媒介(代号),我们说的变量默认是这个变量名所代表的数据,并不是这个变量名本身;这点需要注意的;

变量的命名

变量名由:字母 ,下划线,$ 或数字 且第一个字母必须是 “字母,下划线,或$”
变量不能是系统关键字和保留字
正确命名:尽量取有意义的英文名或英文缩写
i
lvye_study
_lvye
$str
n123

通常驼峰格式是函数名,方法名,和对象属性命名的首选格式 var myMood = "hapy"

变量区分大小写,test和Test是不一样的,必须严格一样,才算是一个变量的;(在javascript里,onclick 必须要写出onclick,不能写成onClick;)
(一定要区分大小,如变量age与Age在JavaScript中是两个不同的变量)
如:var mood = "happy"; MOOD=“sad”; 他们是两个不同的变量进行赋值
变量提升
 JS引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
 console.log(a);     var a = 1; //undefined 错误的写法,但实际不变报错,因为存在变量提升,
真正运行的是下面的代码: var a; console.log(a); a=1; 最后的结果是显示undefined,表示变量a已声明,但还未赋值
注意,变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。
console.log(b); b = 1; 语句将会报错,提示“ReferenceError: b is not defined”,即变量b未声明,
这是因为b不是用var命令声明的,JS 引擎不会将其提升,而只是视为对顶层对象的b属性的赋值。

变量是通过var来声明的,但下面的情况要避免
1. 重复声明
2. 不声明直接赋值
3. 不要更改变量的类型,开始是值类型,后面就不要更改为别的了,开始如果是用来存储某个属性值,就不要用在别的属性上

推荐:先声明后定义
需要读写的变量,读写前,一定要声明;
需要运算的变量,运算前,一定要赋值;

在任何情况下声明变量都要先声明;在使用一个变量之前应当先声明,
变量是使用关键字 var/let/const 来声明的 (const 声明和定义必须一起做);
注意:任何变量赋值前都需要声明变量,不要隐式创建全局变量;

 var a = 1;
    function test() {
      var b = c = 2;//要避免这种声明 因为c会被隐式声明为全局变量
    }
    test();
    console.log(a, c);


   //可以用下面这种写法,C在前面已经声明了 只是为赋值
    var a=1,c;
    function test(){
      var b=c=2;
    }
    test();
    console.log(a,c);


 多个变量声明赋值时候,同一类的变量推荐下面这种写法;既可以简洁,又保证可读性;

 var name = "qiqi",age = 30,height = "155cm";
    console.log(name);
    console.log(age);
    console.log(height);


重复声明和遗漏声明的区别:
在 javascript 里使用 var 重复声明是合法而且不会有任何事情的,如果重复声明带有初始化的值,那么就和一条简单的赋值语句没有什么两样,
不管重复声明初始化值同一类型,还是不同类型,后面的声明的会覆盖前面声明的

var a = 1; a = "hello"; 变量a起先被赋值为一个数值,后来又被重新赋值为一个字符串。 第二次赋值的时候,因为变量a已经存在,所以不需要使用var命令
如果一个变量没有声明就直接使用,JavaScript会报错
在严格模式中,给一个没有声明的变量赋值也是会报错的;非严格模式下虽然不会报错,建议始终使用 var 来声明变量
x // ReferenceError: x is not defined  忘记声明直接赋值:  会不自觉创建全局变量;js严格模式下会报错
如果只是声明变量而没有赋值,则该变量的值为undefined。
var a; a // undefined 是个特殊值,表示未定义

 ES6 扩展了 2 种声明方法;
let :声明一个块作用域的局部变量,可以选择将其初始化为一个值
const : 声明一个只读的常量

使用关键词 var。例如 var x = 42。这个语法可以用来声明局部变量和全局变量。
使用关键词 let。例如 let y = 13。这个语法可以用来声明块作用域的局部变量;ES6 中更推荐用这个来声明变量;
var 或 let 声明的且未赋初值的变量,值会被设定为 undefined;
undefined 值在布尔类型环境中会被当作 false。所以程序中,利用数据的 truefalse 判断逻辑也是常见的;

const定义和声明必须一起
const 是声明定义一个常量,后续就不可以修改了,所以不能先声明后定义,必须一起做

 const a;
 a = 1;
 console.log(a);//报错
 //而是应该
 const a = 2;
 console.log(a); //2

常量的作用域规则与 let 块级作用域变量相同。若省略 const 关键字,则该标识符将被视为变量。
在同一作用域中,不能使用与变量名或函数名相同的名字来命名常量


变量类型
变量是数据的代言人,变量类型是指所代表数据的类型;
变量是没有类型的,只有值才有,变量可以随时持有任何类型的值

在变量执行typeof操作时候,得到的结果并不是该变量的类型,而是该变量持有值的类型;
var a = 18;     console.log(typeof a); //number     
b = false;     console.log(typeof b); //boolean  

变量包含两种不同数据类型的值,基本类型值和引用类型值。typeof可以简单的检测数据类型
值类型的特点:
1
占用空间固定,保存在栈中;
2 保存与复制都是值本身;
3 使用typeof检测数据的类型;
4 基本数据类型是值类型;

引用类型的特点
1 占用空间不固定,保存在堆中;
2 保存与复制的是指向对象的一个指针;
3 使用instanceof检测数据的类型;
4 使用new()方法构造出的对象是引用型;

在给变量赋值的时候,解析器必须要明确这个值是基本类型还是引用类型值,因为他们的赋值方式是不同的;
string 字符串 "hello" 'world'
number 数字 整数 小数 负数
boolean 布尔值 true/false
null 空引用
undefined 未赋值的变量类型就是undefined
以上都是基本数据类型;因此可以操作保存在变量中是实际值,此时变量储存的是实际的值;
基本数据类型,也叫原始数据类型,不可变数据类型;即这个值是不可以改变的,如果变量修改了字符串,以前的字符串会销毁,然后再次赋值;

//用typeof 表示某某某类型
 //数字类型 number
    var a = 10;
    var a = -20;
    var a = 10.3;
    console.log(typeof a);

    //字符串类型 string
    var b = "hello"; //双引号
    var b = '3333'; //单引号
    var b = "放假啦";
    var b = "";
    console.log(typeof b);

    //true 或 false  布尔值boolean   用的时候不能加引号
    var c = true;
    var c = false;
    console.log(typeof c);

    //未定义的  undefined
    var k;
    console.log(typeof k);

    //空引用 null(object)  什么对象都不指向
    var j = null;
    console.log(typeof j);

操作引用类型的变量时,实际操作的是它引用地址对应的对象,而不是直接操作对象的;
引用数据类型,也叫对象类型和可变类型;
可变的意思是可以改变对象的属性值;这只是对数据来说的,javascript本身是可以自由进行数据类型转换的,javascript的变量是无任何类型的,只是一个标识符,变量可以赋值任何类型的值;
string的所有方法,都是不会改变原有字符串的,比如toUpperCase返回的值,其实是一个新字符串,原有字符串不变,这就是string方法的原理;
基本类型和引用类型的操作原理

  var number1 = 1,
      number2 = number1;
    var number1 = 2; //改变number1的值
    console.log(number1); //2
    console.log(number2); //1
    console.log(number1 == number2); //false

    var obj1 = {
        name: "dai"
      },
      obj2 = obj1;
    obj1.name = "daiqi";
    console.log(obj1.name, obj2.name);//daiqi,daiqi
    console.log(obj1.name == obj2.name);//true

 JavaScript数据存储原理

 //基本类型
    var a = 4;
    var b = 6;
    a.aaa = "abckefg";
    console.log(a.aaa);
    console.log(a, b); //4,6
    b = 8;
    console.log(a, b); //4,8
//引用数据类型
    var oDome1 = {
      name: "qiqi",
      say: "hello"
    };
    var oDome2 = oDome1;
    console.log(oDome1); //{name: "qiqi", say: "hello"}
    console.log(oDome2); //{name: "qiqi", say: "hello"}

    oDome2.name = "changeName"; //这时候已经把oDome1的数据给修改了
    console.log(oDome1); //{name: "changeName",say: "hello"}
    console.log(oDome2); //{name: "changeName", say: "hello"}

    oDome1.age = "30"; //给oDome1添加age属性 值
    console.log(oDome1); //{name: "changeName",say: "hello", age: "30"}
    console.log(oDome2); //{name: "changeName", say: "hello", age: "30"}


    var oDome3 = {
      name: "qiqi",
      say: "hello"
    };
    var oDome4 = oDome3;
    console.log(oDome3); //{name: "qiqi", say: "hello"}
    console.log(oDome4); //{name: "qiqi", say: "hello"}
    oDome4 = {
      name: "changeName" //把{name:"changeName"} 对应的堆内存地址赋值给oDemo4
    };
    console.log(oDome3); //{name: "qiqi", say: "hello"}
    console.log(oDome4); //{name: "changeName"}
 

变量的作用域有全局作用域和局部作用域两种。

作者:输输输
链接:https://www.imooc.com/article/5255
来源:慕课网

 

变量名的禁忌

变量的名字可以千变万化,但是也有其中的规则需要遵守;(必须遵守的);

  • 1、变量名是由数字、字母、下划线组成的,其中字母里大小写字母均可;

2、变量名首位不是能数字,可以是字母下划线;首位后的位置可以是数字,字母,下划线;

3、不能使用关键字和保留字作为变量的名字(需要避开的名字);

  • 关于关键字和保留字,这个可以拿生活中的现象举例子,大人给小孩起名字的时候,小孩的名字一定不能和他父亲母亲的名字一样;当然也不能和爷爷,奶奶,外公,外婆,舅舅,姑姑等等这些名字一样;这个就是现实中约定俗成的规则;
  • 在JS中,也有些单词是有特殊意义的,或者是为了以后语言升级做准备的;而这些单词就不能作为变量名;比如前面接触的typeof,function;这样的单词就不能作为变量名;

4、变量区分大小写,test和Test是不一样的,必须严格一样,才算是一个变量的;(在javascript里,onclick 必须要写出onclick,不能写成onClick;)

变量命名的优化方法(推荐遵守的,非强制);

使用变量作为值的符号名,变量的名字又叫标识符;

优雅的变量命名方法是可以一眼扫过就知道什么意思的;不会浪费时间在思考变量名所代表的意义;

如果给”门”命名为name1,给”桌子”命名为name2,给”冰箱”命名为name3;那么日常生活就乱套了,听起来这种在现实生活中会很奇怪和搞笑;

但是很多前端新手经常犯变量命名的类似毛病;

变量命名的意义是直观易理解,读到第一行代码时候就知道什么意思,假如隔了几十上百行代码后仍然可以明确他的意义;

下面是收集的一些变量命名方法;

  • -连接符方法;
  • 比如给我桌子上门钥匙命名;my-room-door-key 和 my_room_door_key;
  • 这种方法用-和下划线_连接符来链接单词,区别是下划线在选择变量的时候,鼠标双击可以全部选择;

驼峰命名法;这种命名方法有两种方式

  • 大驼峰:每个单词的首字母大写;MyRoomDoorKey
  • 小驼峰:第一个字母小写,其它字母大写;myRoomDoorKey

匈牙利命名法;变量由类型+对象描述组成;

  • 对象(Object)用o表示;
  • 函数(function)用fn表示;
  • 数组(array)用a表示;

上面的但中方法是目前最流行的规范;但是各有利弊;下面是我个人自己的书写习惯;

个人的写法;

  • class名:用”-”连接符的方法;class=”header-nav” 比如这样的;
  • JS变量名:myRoomDoorKey;小驼峰
  • data-diy_attr 自定义属性;
  • j-trigger-target JS中需要用的类名
  • jQuery对象名:$myKey;小驼峰前面加$;这种方法是从匈牙利+驼驼峰总结出来的;其实真实项目中,很少有匈牙利命名法的;匈牙利命名法见过最多的都是出现在写DEMO的时候用;
  • 除非特别难起的变量名,否则千万不要用中文拼音做变量名,但是遇到难起的变量名,使用中文也别有负担,但是禁止中英文混搭
  • 注释可以辅助整理思路

 



 

 

 


 

 

 







posted @ 2020-12-13 18:23  沁莹  阅读(430)  评论(0)    收藏  举报