JS基础之基本概念1
变量
ECMAScript中的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个用于保存值的占位符。
var
可以声明一个变量,一般情况下,要想声明的变量变得有意义,必须得初始化,即给变量赋值。
有一点必须注意,即用var操作符定义的变量将成为定义该变量的作用域中局部变量。也就是说,如果在函数中使用var定义一个变量,那么这个变量在函数执行完之后,会被立即销毁,回收其占用的内存。例如:
function test(){
var message = 'hello world'//不用var操作符声明的变量,会变成全局变量
console.dir(message)
}
test();
test函数运行以后,变量message会被垃圾清除机制清除,释放其内存。
数据类型
5种简单数据类型:String
,Number
,Boolean
,Undefined
,Null
1中复杂数据类型:Object
一般情况下,会用typeof
操作符检测给定变量的数据类型。
当调用typeof null
时候,会返回object
,因为null
本质上是空对象,程序上标明此变量在未来指向的变量是一个对象。
这里有几点需要注意:
1.检测函数的时候:
function test(){};
console.log(typeof test)//'function'
当用typeof检测一个函数的时候,会返回‘‘第六种数据类型’’,为什么会用引号括起来呢,因为从技术角度来说,函数在ECMAScript中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof
操作符来区分函数和其他对象是有必要的。
2.检测数组的时候:
var arr = [1,2,3];
console.log(typeof arr)//'object'
当用typeof
检测的变量是一个数组时候,会直接返回object
。所以数组也是对象的一种,同是复杂数据类型。
Undefined类型
Undefined类型只有一个值,即特殊的undefined
。
这里有一点需要注意:在使用var
声明变量但未对其初始化时,这个变量的值就是undefined
。
var message;
alert(message == undefined)//true
引入这个值是为了正式区分空对象指针和未初始化的变量。
Null类型
Null类型是第二种只有一个值的数据类型,这个特殊值就是null
。
实际上,undefined
是派生自null
值的。因此undefined
== null
。
上文提到,如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null
而不是其他值。这样,在复杂的业务逻辑
中,debug代码判定动态数据类型时候,只要直接检测null
值就可以知道相应的变量是否已经保存了一个对象的引用。
Boolean类型
Boolean类型是使用的最多的一种类型,有两个值:true
和false
。
Boolean类型的字面值true
和false
是区分大小写的,也就是True
和False
都不是Boolean的值,只是标识符。
想要讲一个值转换为对应的Boolean值,可以用Boolean()
。
以下给出各种数据类型及其对应的转换规则:
Number类型
整数
最基本的数值字面量格式是十进制的,除了以十进制表示以外,证书还可以通过八进制和十六进制的字面值来表示。其中,八进制字面值第一位必须是零,然后是八进制数字序列(0-7)。如果字面数值超出了范围,那么前导零将被忽略,后面的数值将被当做十进制数值解析。八进制字面量在严格模式下是无效的,会抛出错误。十六进制字面量的前两位必须是0x,后跟任何十六进制数字(0-9及A-F),其中,字母A-F可以大写也可以小写。
不过在进行算数计算时,所有以八进制和十六进制表示的数值都会转换为十进制数值。
浮点数
由于保存浮点数值需要的内存空间是保存整数数值的两倍,所以ECMAScript会把浮点数转为整数显示。例如:
var float1 = .1;
var float2 = 10.0;
console.log(float1)//1
console.log(float2)//10
对于那些极大或者极小的数值,可以用科学计数法表以浮点数值的形式来表示。例如:
var floatNum = 1.234e6; //等于1234000
即e前面的数值乘以e后面数值的10的指数次幂。极小数同理,只不过是除以10的指数次幂。
由于浮点数值的最高精度是17位小数,但是在进行算数计算的精确度缺远不如整数,所以不建议用0.1+0.2==0.3
这样的判断。
数值范围
数值类型的数据有大小之分,或是无穷大或是无穷小或是在这两者之间。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE
中-在大多数浏览器中,这个值是5e-324
,能够表示的最大数值保存在Number.MAX_VALUE
中-在大多数浏览器中,这个值是1.7976931348623157e+308
。
如果一旦超出了javascript数值范围,这个值是正数,则用Infinity
(正无穷)表示,这个值是负数,则用-Infinity
(负无穷)表示。
如果想要确定一个数值类型的值是否是有穷的,可以使用isFinite()
这个函数。如果这个函数的参数位于最大与最小数值之间会返回true
。
NaN
NaN
即非数值(Not a Number),是一个特殊的数值。typeof NaN == 'number'
NaN
本身有两个特点:
1.任何涉及NaN的操作都会返回NaN。
2.NaN与任何值都不相等,包括它自己。
alert(NaN == NaN)//false
ECMAScript定义了一个isNaN()函数,用来判断一个数值是否 ’不是数值‘,这个函数在接受一个参数之后,会先进行转换操作,转换为数值。
数值转换
有三个函数可以把非数值转换为数值:Number()
,parseInt()
,parseFloat()
。
其中,Number()
函数可以用于任何数据类型,而后两者则专门用于字符串转换为数值。
Number()
:
Number()
转换规则如下:
1.如果是Boolean类型值,true
和false
会被转换为1
和0
。
2.如果是数字,只是简单的传入和返回。即Number(10.11) == 10.11
。
3.如果是null
,返回0。
4.如果是字符串,则遵循以下规则:
a:如果只包含数字,则转换为十进制数值,例如 Number('23411') == 23411
。
b:如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值,例如Number('1.1') == 1.1
。
c:如果字符串中包含有效的十六进制格式,则将起转换为相同大小的十进制整数。
d:如果字符串是空的,则将起转换为0。
e:如果字符串中包含除上述格式之外的字符,则将其转换为NaN
。
parseInt()
:
parseInt()
函数在转换字符串时,更多的是看其是否符合数值模式,其转换规则如下:
1.忽略字符串前面的空格。
2.如果字符串中第一个字符不是数字字符或者负号,则返回NaN
,例如parseInt(a123) == NaN
。
3.如果字符串中第一个字符是数字,则会继续解析第二个字符,知道解析完所有后续字符或者遇到一个非数字字符,例如parseInt('123abc345') == 123
。
parseInt()
函数还会接收第二个参数,用于表示转化字符串时,用哪个进制,以十进制或者八进制或者十六进制进行转换。例如:
var num1 = parseInt('10',2) //2(按照二进制解析)
var num2 = parseInt('10',8) //8(按照八进制解析)
var num3 = parseInt('10',10) //10(按照十进制解析)
var num4 = parseInt('10',16) //16(按照十六进制解析)
parseFloat()
parseFloat()
也是从第一个字符开始进行解析。一直解析到字符串末尾或者解析到遇见一个无效的浮点数字字符为止,也就是第一个小数点有效,第二个无效。例如parseFloat('123.12.3') == 123.12
。
除了第一个小数点有效以外,parseInt()
和parseFloat()
的第二个区别在于它始终会忽略前导零,即假如这个字符串是十六进制值,parseFloat()
始终会吧十六进制值转换为0。
parseFloat()
只解析十进制值,因此没有第二个参数的用法。
最后还要注意一点:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),parseFloat()
会返回整数。
String类型
String类型即字符串。必须由双引号或者单引号表示。
任何字符串的长度都可以通过访问其length属性获得。
要把一个值转换为字符串有两种方法。
1.toString()
方法:
数值,布尔值,对象和字符串值都有toString()
方法,但是null
和undefined
值没有这个方法。
2.String()
方法:
在不知道要转换的值是不是null
或者undefined
的情况下,还可以使用转型函数String()
,这个函数能够将任何类型的值转换为字符串。转换规则如下:
a:如果值有toString()
方法,则返回相应的结果。
b:如果是null
,则返回null
(null的字面量)
c:如果是undefined
,则返回undefined
(undefined的字面量)
Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。前面提到的函数也可以称之为对象,但是函数不能称为数据类型。对象可以通过new
操作符后面跟要创建的对象类型的名称来创建。例如var obj = new Object()
。
创建Object类型的实例并为其添加属性或者方法,就可以创建自定义的对象。而且,可以为对象动态的添加属性和方法。
Object类型所具有的任何属性和方法同样存在于更剧透的对象或者实例中。
1.constructor
:保存用于创建当前对象的函数,即构造函数。对于前面的例子而言,obj.constructor == Object()
。
2.hasOwnProperty(propertyname)
:用于检查给定的属性在当前对象实例中是否存在(而不是在实例的原型中),返回值为Boolean。其中propertyname
必须是字符串形式。
3.isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。返回值是Boolean类型。
当然。还有其他几个方法,不过这里只提出来常用的几个方法和属性。