js 变量
一、 声明变量
首先认识两个名称:
变量(variable): 比喻为一个箱子,这个箱子的标签就是该变量的名字
值(value):比喻为箱子当中所装的东西
- 用关键保留字 var 进行 变量的声明 就是告诉解析器,我要创建一个箱子出来装东西
var name //一次定义一个变量,但如果没有初始赋值,则会显示undefined
var age, job //一次定义多个变量,用逗号隔开
var message = 'hello world!',
name = 'bgg',
age = '18' //也可以在声明变量的同时,进行初始赋值,简称初始化变量
同时,你会注意到变量的声明时,并没有指定变量类型,是的,的确没有,因为 Javascript 就是一种弱类型语言,没有任何约束。
- 一定要保证使用变量前进行有效的变量声明 如果当你使用一个变量却没有声明
var a = 10
b = 20 //这里并没有在使用变量b前进行变量声明
a + b //但依然可以正常运行
虽然不影响程序运行,是因为解析器会自动把变量 b 转化为全局变量(任意地方可以访问的变量),这在以后的编程当中是不利于去维护代码的,所以是极度不推荐这样做。
在 ES6 的严格模式中,这种做法是报错的,一定要注意。
二、 命名规则
尽可能语义化
第一个字符必须是字母、下划线(_)、或美元符号 ($);
变量名中不能包含空格或标点符号(下划线(_) 和$ 除外);
变量名区分大小写;
不能使用保留字、关键字,例如
var,let,const,delete,if,for
,top
;命名的风格推荐以下几种:
- 驼峰命名法(Camel Case) :StudentName
- 小写的驼峰命名法(Mixed Case)(开头小写):studentName
- 巴斯卡命名法(也称下划线命名法) :student_name
- 常量使用大写 :MAX_COUNT = 100
- 不成文规定,除非变量本身含义是一种水果,否则不要尝试用 apple、banana、orange
三、 变量的类型
箱子也分不同的种类,例如纸箱、木箱、塑料箱等等。 变量也分为两大数据类型
1. 基本类型
类型 | 说明 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔值 |
undefined | 未定义 |
null | 空值 |
(1). 数字类型 Number
JavaScript 只有一个数字类型 number
,无论是十进制,十六进制,浮点等等都用 number
处理.
十进制:
var num1 = 10, //表示整数
num2 = 0.3, //表示浮点数
num3 = 10e10 //表示指数计数
十六进制:
var num4 = 0xff0000 //以0x或0X开头,后面跟上十六进制数值
js 精度丢失问题,如下:
0.3 -
0.2(
//得出结果为.099999999....
//解决的思路就是把运算数统一转换为整数,再进行计算。
0.3 * 10 - 0.2 * 10
) /
10 //得到结果为0.1
(2). 字符串 String
凡是用双引号、单引号或反单引号(es6 语法)所包裹的内容,称之为字符串
'' //空字符串,包含0个字符
'allen' //包含5个字符
`allen` //反单引号,键盘tap上方的按键
;('3.14') //包含4个字符
;('name="allen"') //可以包含引号,取决于外围的引号是单引还是双引
字符串拼接符
使用 +
号可以把字符串和变量拼接在一起
var name = 'allen'
var string = '我的名字叫:' + name
(3). 布尔值类型 boolean
布尔类型的变量只有两个值,分别是保留字true
和false
布尔值无处不在 其实,在 javascript 的世界里,无所不在的变量的值都可以表示为真或假。 除了以下指的值会被转换成false
, 其余的都为true
undefined
null
0 - 0
NaN
;('') //空字符串
(4). undefined 类型
在 JavaScript 中,undefined
是一个没有设置值的变量
var a = undefined //显示赋值为undefined
var b //定义,但不赋值,结果为undefined
(5). null 类型
在 JavaScript 中 null
表示 "什么都没有"。null
是一个只有一个值的特殊类型。表示一个空对象引用。
var person = null //你可以设置变量值为 null 来销毁该变量
(6). undefined 和 null 的区别
typeof undefined // =>undefined
typeof null // =>object
undefined == undefined //=>true
null == null //=>true
null === undefined // =>false
null == undefined // =>true
观察可以发现:null 和 undefined 两者相等,但是当两者做全等比较时,两者又不等。
原因:
null
: Null 类型,代表“空值”,代表一个空对象指针,使用 typeof 运算得到 “object”,所以你可以认为它是一个特殊的对象值。undefined
: Undefined 类型,当一个声明了一个变量未初始化时,得到的就是 undefined。
实际上,undefined
值是派生自null
值的,ECMAScript 标准规定对二者进行相等性测试要返回 true,
2、那到底什么时候是 null,什么时候是 undefined 呢?
- null 表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
- undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于 undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于 undefined。
(3)对象没有赋值的属性,该属性的值为 undefined。
(4)函数没有返回值时,默认返回 undefined。
2. 复杂类型
也叫引用类型最大的特点就是"键/值"
对,键
其实就是属性名,值
就是属性所对应的值
函数function
,数组array
,属于object
的分支;
复杂类型有:
类型 | 说明 |
---|---|
Object | 常规对象:键/值对的无序集合 (自由组合的大箱子,没有顺序可言) |
对象(复杂)类型 Object
属性的集合体
var obj = new Object() //第一种创建方法:实例化一个Object类型实例
typeof obj //=> object
var obj2 = { name: 'bgg' } //第二种创建方法:用对象直接量(花括号包住的属性键值对)来创建
typeof obj2 //=> object
var obj3 = Object.create() //第三种创建方法:ES6新增方法,使用create方法创建
3. 各个类型之间的转换
- 查看变量的类型,使用
typeof()
方法即可
var mod = 'happy'
alert(typeof mod) //可以不加括号,必须中间有空格隔开
var num = 100
alert(typeof num) //可以不加括号,必须中间有空格隔开
主要注意的是 null 类型的变量,typeof
后的结果是object
,具体原因是当年程序作者的手误(有兴趣的同学可以点击这里),所以如果要判断这个变量是否null
类型,可以这样写:
var isNull = null
isNull === null // =>true (使用全等于运算符来判断即可)
(1). 隐式转换
- javascript 会自动根据上下文进行类型的转换,我们称之为隐式转换,规则如下
//字符串转数字
var str = '1' //这个字符串'1'
var num = +'1' //用加号实现string->number的隐性转换
//数字转字符串
var num = 1 //这个数字1
var str = '' + 1 //用空字符串拼接数字实现转换
(2). 显性转换
- 如果我们想按照自己的想法去转换,我们称之为显性转换
- 任意类型变量转换为字符串,使用
toString()
方法
var married = false
alert(married.toString()) // => "false"
var age = 25
alert(age.toString()) // => "25"
如果是数字转换为数字(常用于进制的转换)
var iNum = 10
alert(iNum.toString(2)) //=> "1010" 10进制转换为二进制
alert(iNum.toString(8)) //=> "12"
alert(iNum.toString(16)) //=> "A"
如果数字转换为字符串,常用的还有toFixed()
方法
它会根据传入的参数,保留小数点后指定的位数的数字为字符串,有时候会适当做四舍五入。
var n = 123456.789
n.toFixed(0) //=>123457
n.toFixed(2) // =>"123456.79"
n.toFixed(5) // =>"123456.78900"
- 任意类型变量转换为数值,使用
parseInt()
,parseFloat()
,Number()
方法
var test = parseInt('blue') //=> NaN
var test = parseInt('1234blue') //=> 1234
var test = parseInt('22.5') //=> 22
var test = parseFloat('1234blue') //=> 1234
var test = parseFloat('22.5') //=> 22.5
var test = Number('22') //=> 22
这里还要注意一点,它们是有第二个参数的,控制是以什么进制来转换,有效参数是 2 至 32
parseInt('200', 10) //=> 200
parseInt('11', 2) //=> 3 相当于以二进制来解析11,结果为2+1
- 任意类型变量转换为布尔值,使用**双感叹号(!!)**的运算符
var arr = [1, 2, 3]
console.log(!!arr) //第一个感叹号取反,第二个再取反一次,负负得正
- 任意类型变量转换为对象类型变量,使用对应的包装对象
Number(' 3') // => 3
String(false) // => "false" 或使 用 false. toString()
Boolean([]) // => true
Object(3) // => new Number( 3)
4. 变量的声明提前
用了 var 定义的变量,都会被提前到脚本的顶部进行声明(但不涉及赋值,具体赋值还是需要运行到对应行数
console.log(scope) // =>undefined 输出"undefined",而不是"global"
var scope = 'global' // 变量在这里赋初始值,但变量本身在脚本内任何地方均是有定义的
console.log(scope) // =>"global"
我们称之为声明提前(hoisting)