变量
变量 variables ,类似于代数。它们不是字母,而是蕴含值的符号。
和直接量不同,直接量5就代表数字5。
直接量“你好”,就是代表字符串“你好”。
var的过程可以叫做声明 declaration ,也可叫定义 definition 。
var a;
a=100;
console.log(a)
|
使用var关键字来定义变量,关键字是有特殊功能的词语,关键字后面要有空格。
var 是 variables 的缩写。
当 var a; 时,电脑内存中会开启一个空间来保存变量a。
可以给变量赋值,js中变量赋值用等号。等号右边的值赋给左边。
当 a =100; 时,现在a变量的值就是100。
变量需要先声明,才能使用。否则出现错误:Uncaught ReferenceError
因为b没有被定义,所以b现在不是一个变量,系统不认识b,抛出引用错误。
变量的名称
变量的名称是标识符 identifiers ,任何标识符的命名都需要遵守一定的规则。
在js中,标识符可以由字母a-z-A-Z,下划线_,美元符号$,数字0-9组成。但不能以数字开头,不能是js保留字。
保留字是系统里面有特殊用途的字。
合法的变量名:
var a;
var A;
var b333;
var _abc;
var $;
var $oO_Oo$;
var _______;
var _;
|
不合法的变量名:
可以使用中文,但没人用中文写js
var 小文;
小文=520;
console.log(小文)
|
变量的赋值
var a;
a=100;
console.log(a)
|
定义和赋值一起写:
var a=100;
console.log(a)
|
变量的赋值用等号,等号右边的值给左边,右边的值不变。
var a=100;
var b=200;
a=b;
console.log(a)
console.log(b)
|
变量只需声明一次,后面要改变时不需要再声明即可改变。
如果变量仅声明而没有赋值(没有赋值完成),此时变量的值是 undefined 。
变量声明的提升
js变量的另一种特别之处,是可以引用稍后声明的变量,而不会引发异常。
这种概念称为 变量声明提升 hoisting 。
js变量感觉上是被“”举起或提升到了所有函数和语句之前。
然而提升后的变量将返回 undefined 。
所以即使在使用或引用某个变量后存在声明和初始操作,仍会得到 undefined 值。
其他语言没有这个特点,很多程序员都反感这个特点。
下例先改变变量的值,再定义变量。由于js的变量声明提升机制,所以现在程序在执行前已经看到程序中定义变量的行,而把此行提升到所有函数和语句前。
1 变量声明提升
a=100;
var a;
console.log(a)
|
2 变量声明提升
a=100;
console.log(a)
var a;
|
3 只能提升声明,而不能提升赋初值
console.log(a)
var a=100;
|
等价于:
var a;
console.log(a);
a=100;
|
不写var的情况
定义a的时候没有写var,程序没有报错。说明a变量已被定义。
其实不写var是定义了一个全局变量,作用域是不能控制的。
用逗号隔开多个变量
这个表示法,只能用于变量的连续定义。
var a=1,b=2,c=3;
console.log(a)
console.log(b)
console.log(c)
|
区分变量与直接量
变量的时候不能加引号,如果变量加引号会变成字符串。
引号是字符串的定界符,所以在引号里面的a已经失去变量的意思,就是一个字符串。
var a=1;
console.log( 'a' )
|
变量的类型,数据类型
js中的值,无论是字面量还是变量,都有明确的类型。
基本类型5种:
Namber 数字
String 字符串
undefined 变量未定义时的值
Boolean 布尔,有两个值 true 和 false
null 空,后文细讲
引用类型5种:
后文细说
检测类型 typeof 关键字
用 typeof 来检查变量的类型。
var a=100;
var b= "你好" ;
console.log( typeof a)
console.log( typeof b)
|
number 类型
js中所有数字都是 number 类型,不细分为整形 int 、浮点型 float 等。
number类型:所有数字(不分大小、正负、整浮、进制)、Infinity、NaN。
var a1=111
var a2=111111111111111111111
var a3=-111111111111111111111
var a4=1.111
var a5=.5e6
var a6=0xff
var a7=017
var a8=Infinity
var a9=NaN
console.log( typeof (a1) )
console.log( typeof (a2) )
console.log( typeof (a3) )
console.log( typeof (a4) )
console.log( typeof (a5) )
console.log( typeof (a6) )
console.log( typeof (a7) )
console.log( typeof (a8) )
console.log( typeof (a9) )
|
string 类型
var a= "你好" ;
var b= "123" ;
var c= "" ;
console.log( typeof (a) )
console.log( typeof (b) )
console.log( typeof (c) )
|
变量的类型和定义没有关系,和赋值的内容有关系。
定义的时候都是用var关键字。
动态数据类型
var a=123;
console.log( typeof (a) );
a= "你好" ;
console.log( typeof (a) );
|
undefined 类型
undefined 值的变量类型也是 undefined 。
var a;
console.log(a)
console.log( typeof (a) )
|
+ 加号
加号是一个运算符。
加号两边都是数字时就是加法运算。
如果有一边不是数字,是连字符。
console.log( "你" + "好" );
console.log(1+2);
console.log(1+ "2" );
|
练习
var a= "1" ;
var b= "2" ;
console.log( "a+b" );
console.log(a+b);
|
练习
var a=1;
var b= "2" ;
console.log( "a+b" );
console.log(a+b);
|
练习
var a= "1" ;
var b=2;
console.log( "a" +b);
|
练习
var a=1;
var b=2;
var c=3;
console.log(a+b+ "c" )
|
练习
var a=1;
var b=2;
var c=3;
console.log( "a" +a+b+ "c" )
|
多个加号,先看左边。
变量类型的转换
string - number
这个语句和 alert 差不多,也是弹窗。弹的是输入框。
像这样的小功能,叫程序给我们提供的API,每个API都有不同的语法。
像上面的语法就是: prompt("提示字符","默认值");
var a=prompt( "请输入一些文字" , "输入在这里" );
alert( "你刚才输入的是:" +a)
|
用户输入的所有值都是字符串:
var a=promopt( "这是一个输入器,请输入一个加数" )
var b=promopt( "再输入一个加数" )
var sum=a+b;
alert(sum)
|
所以这时候需要一些方法把内存中表示数字的字符串转为对应的数字。
parseInt()和parseFloat()
parseInt
parseInt 是把一个 string 转为一个整数,不四舍五入。直接取整数部分。
var a= "123" ;
var b=parseInt(a);
console.log(b)
console.log( typeof b)
console.log(parseInt( "123" ))
console.log(parseInt( "123.4" ))
console.log(parseInt( "123是一二三" ))
console.log(parseInt( "123是123" ))
console.log(parseInt( "-123是-123" ))
|
修改上面的计算器,把用户输入的字符串转为数字计算
var a=parseInt(prompt( "输入一个加数" ))
var b=parseInt(prompt( "再输入一个加数" ))
alert( "和是" +(a+b))
|
不能这样写
var a=prompt( "输入一个加数" )
var b=prompt( "再输入一个加数" )
alert( "和是" +parseInt(a+b))
|
parseInt() 不但能转换整数,还能转进制数。
可以把任何进制转为十进制。
下面的输出结果都是15
console.log(parseInt(15))
console.log(parseInt(17,8))
console.log(parseInt(1111,2))
console.log(parseInt( "15e6" ,10))
console.log(parseInt( "15*6" ,10))
console.log(parseInt( "0xf" ,16))
console.log(parseInt( "f" ,16))
|
注意,数字保存在内存中时还是原来的进制,只是显示出来时是10进制。
var a=0xff;
var b=a;
console.log(b)
var a1=0xff;
var b1=parseInt(a1,16);
console.log(b1)
var a2= "0xff" ;
var b2=parseInt(a2,16);
console.log(b2)
|
前面是0的情况
var a= "1xz" ;
var b= "0xz" ;
console.log(parseInt(a))
console.log(parseInt(b))
|
parseInt转换时,如果前面不是0,会进行常规处理。
如果是0时,他还要看下一们是不是x,也就是看这个数是不是表示16进制的0x
但是0xZ的0x表示16进制,但Z不是16进制里面的数,所以转换失败,NaN。
parseFloat
把字符串转为浮点数。
console.log(parseFloat( "123.4.5" ))
|
js中的数字不区分整数浮点数,但转换的时候需要区分。
number - string
把一个数字与字符串连接,他们将自动转为字符串。
console.log( typeof (123+ "" ))
|