变量声明
什么是变量
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"
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命令
在严格模式中,给一个没有声明的变量赋值也是会报错的;非严格模式下虽然不会报错,建议始终使用 var 来声明变量
x // ReferenceError: x is not defined 忘记声明直接赋值: 会不自觉创建全局变量;js严格模式下会报错
var a; a // undefined 是个特殊值,表示未定义
ES6 扩展了 2 种声明方法;
let :声明一个块作用域的局部变量,可以选择将其初始化为一个值
const : 声明一个只读的常量
使用关键词 var。例如 var x = 42。这个语法可以用来声明局部变量和全局变量。 使用关键词 let。例如 let y = 13。这个语法可以用来声明块作用域的局部变量;ES6 中更推荐用这个来声明变量;
用 var 或 let 声明的且未赋初值的变量,值会被设定为 undefined; undefined 值在布尔类型环境中会被当作 false。所以程序中,利用数据的 true 和 false 判断逻辑也是常见的;
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的时候用;
- 除非特别难起的变量名,否则千万不要用中文拼音做变量名,但是遇到难起的变量名,使用中文也别有负担,但是禁止中英文混搭
- 注释可以辅助整理思路