读《高程3》系列之第三章3.0---变量和数据类型

1,ECMAScript但变量是松散类型,也就是可以保存任何数据类型。

  var msg;

这个代码定义个msg变量,该变量可以保存任何值,在未保存值之前或者说未初始化之前,会保存一个特殊的值----undefiend。

2,ECMAScript也支持直接初始化变量如下:

  var msg="hello";

3,像上面代码在初始化时赋值,不会把它标记未字符串类型;初始化的过程就是给变量赋予一个值那么简单,因此也可以修改这个值和值的类型,如下:

  var msg=‘hello’;

  msg=10;

这是有效的,但是是不推荐的。

4,用var操作符定义的变量将成为该变量的作用域中的局部变量,如下

function test(){
    var msg="hello";//局部变量
}
test()
alert(msg)//错误

如上说明,如果在函数中定义一个变量,那么这个变量在函数推出后就会被销毁。而如果函数内没有用var声明的变量赋值,那么就会变成全局变量如下:

function test(){
    msg="全局变量";
}
test()
alert(msg)//   '全局变量'

虽然有效,但是不推荐,因为如此定义的全局变量不便与维护。

5,一条语句可以定义多个变量,只要用逗号隔开即可:

var msg= "thomas",age=18;

6,ECMAScript中定义了5中简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String,还有一种复杂数据类型-----Object,Object本质是由一组无序的明值对组成。

7,ECMAScript不支持任何自定义数据类型机制,而所有值最终都将是上述6种数据类型之一。

8,由于数据类型松散型,那么就需要检测数据类型,typeof就是用来检测这方面的信息,不过需要注意的是,在检测null时,会返回的是object,因为null被认为是一个空的对象引用,在检测函数的时候,返回的是“function”,虽然函数的本质也是object,但是函数有它的特殊性,所以和其他的对象进行区分开来了。

9,Undefiend类型只有一个值,即特殊的undefined,在使用var声明变量但未对其初始化时,这个变量的值就是udefiend。

10,Null类型只有一个值,即特殊的null,它表示一个空对象指针,而这真是使用typeof操作符检测null值时会返回“object”的原因;

  注意:alert(null==undefined)//true

     alert(null===undefined)//false

11,Boolean类型,时ECMAScript中使用最多的一种类型,该类型只有两个字面值,true和false。注意,这个区分大小写,因此True和False不是它的值,只是标示符;虽然Boolean只有两个,但ECMAScript中所有类型的值都有与这个两个值等价的值,也就是说,其他的所有数据类型,都可以转化成这两个值;

12,转换

数据类型 转换为true 转换为false
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非0数值(包括无穷数) 0和NaN
Object 任何对象 null
Undefined 不适用(不能转) undefined

13,Number类型,这种类型使用IEEE754格式来表示整数和浮点数(浮点数值在某些语言中也被称为双精度数值),最基本的数值字面量格式是十进制,除了十进制表示外,整数还可以用八进制或十六进制的字面值。其中八进制字面值的第一位必须是0,然后是八进制数字序列。如果字面值中的数值超出了范围,那么前面的0会被忽略,后面的值当作十进制解析;

  var  num1=070;//八进制的56 

  var num2=079;//无效的八进制数值,解析为79

  var num3=08;//无效的八进制数值,解析为8

14,八进制字面量在严格模式下是无效的。十六进制字面值必须是0x(零x),后跟任何十六进制数字(0~9及A~F)。其中字母可以大写,也可以小写;

  var num4=0xA;//十六进制的10

  var num5=0x1f;//十六进制的31

15,浮点数值最高的精度数是17位小数,浮点数在计算时会产生误差,这是使用基于IEEE754数值的通病,其他的语言也有这个问题;

16,NaN,即非数值,是一个特殊的数值,表示一个本来要返回数值却没有返回数值的情况。任何数值除以非数值都会返回NaN。任何涉及到Nan到操作都会返回NaN,这个特点在多部计算有可能导致问题,NaN和任何值都不相等,包括本身,入下;

alert(NaN==NaN)//false

针对这两个特点,ECMAScript定义量isNaN函数,这个函数接受一个参数,该参数可以是任何类型,这个函数可以帮我们确定这个参数是否‘不是数值’;

alert(is NaN(NaN));//true
alert(is NaN(10));//false
alert(is NaN("10"));//false,可以转换成数值10
alert(is NaN("true"));//true
alert(is NaN(true));//false,可以转换成数值1

17,有三个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。

  16.1:Number函数有如下的转换规则:

    *如果是Boolean值,true和false将分别转换成1和0;

    *如果是数值,只是简单的传入和返回;

    *如果是null值,返回0;

    *如果是undefined,返回是NaN;

    * 如果是字符串,有如下规则:

      - 如果字符串只包含数字,那么就转换成十进制数值,注意“011”,会转成11,因为前的0会忽略;

      - 如果字符串包含有效的浮点数如1.1,则转成相应的浮点数1.1;

      - 如果是有效的十六进制的格式,将会转换成相同大小的十进制数值;

      - 如果字符串是空,转为0;

      - 如果字符串包含除上述格式之外的字符,则为NaN;

    * 如果是对象,则调用对象的valueOf(),然后依照恰年的规则转换返回的值,如果转换的结果是NaN,则调用对象的toString()方法,然后再次按照前面的规则转换;

18,由于Number()函数转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用parseInt()函数。它接受两个参数,第一个参数是要转换的参数,第二个参数是转换成目标的进制单位,如果不写第二个参数,默认参数是十进制,但是,它的第一个参数可以识别进制数,比如,八进制或者十六进制数放在第一个参数,后面不写第二个参数,是可以识别的,同时,会转成一个十进制的数,如下;  

var num1=parseInt('123abc')     //123
var num2=parseInt('')  //NaN
var num3=parseInt(22.5) //22
var num4=parseInt("0xA") //10(十六进制)
var num5=parseInt(070) //56 (八进制)
var num6=parseInt("111") // 111 (十进制)

通过上面的例子可以发现,我们如果不传入第二个参数,parseInt函数会将第一个函数转换成十进制数,并且可以识别八进制和十六进制数;如果加了第二个参数呢,会有如下的结果:

var num1=parseInt("10",10) //10
var num2=parseInt("10",8) //8
var num3=parseInt("0x10") // 16
var num4=parseInt("10",16) //16

19, 与parseInt函数相似的还有parseFloat函数,但是区别的是,parseFloat函数只有一个参数,并且只能转换十进制,这也反应了它不会识别其他进制的数,只会转换成十进制,看看它的结果:

var num1=parseFloat('123qwe') //123
var num2=parseFloat('0xA')//0   不识别十六进制
var num3=parseFloat(22.5) //22.5
var num4=parseFloat('0909.1') //909.1 会忽略前面的0;
var num5=parseFloat(3.14e7) //3140000

20,String类型表示由或多个16为Unicode字符组成的字符序列,即字符串,由单引号或者双引号包裹而成,以双引号开头必须以双引号结尾,以单引号开头,必须单引号结尾;

21,String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者有其他用途的字符,如下:

字面量 含义
\n 换行
\t 制表
\b 退格
\r 回车
\f 进制
\\ 斜杠
\' 单引号
\" 双引号
\xnm 以十六进制代码nn表示一个字符
\unnn 以十六进制代码nnnn表示一个Uncode字符

22,ECMAScript中定义字符串是不可变的,也就是说要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,例如;

var lang='java'

lang=lang+'Script'

这个例子中首先创建一个能容纳10个字符的新字符串用来填充'java'和‘script‘,最后一步销毁原来的字符串’java'和字符串‘script’;

23,其他值转换成字符串有两种方式,第一种是使用toString()方法,数值,布尔值,对象和字符串都有该方法,但null和undefined没有该方法;它还有一个参数,可以将数值转成该参数对应但进制数,如下:

var num=10;

alert(num.toString());     //"10"

alert(num.toString(2)); //'1010'

alert(num.toString(8));  //12

alert(num.toString(16)); // 'a'

在不知道要转换但值是不是null或undefined时,可以用另一个方法String()方法,可以将任何值都可以转成字符串,包括null和undefined,如下;

var value=true;

alert(value.String()) //'true'

var value1=null;

alert(value1.String()) //'null'

var value2=undefiend

alert(value2.String()) //'undefined'

24,Object类型,ECMAScript中的对象其实就是一组数据和功能的集合;对象可以通过执行new操作符后要创建的对象类型的名称来创建,

var obj=new Object();

在ECMAScript中,Object类型是所有它的实例的基础,Object类型所具有的任何属性和方法也同样存在更具体的对象中。Object的每个实例都具有下列属性和方法:

  * constructor:保存着用于创建当前对象的函数,对与上面的那个例子,构造函数(constructor)就是Object();

  * hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertrName)必须以字符串形式指定(例如:obj.hasOwnProperty('name'))。

  * isPrototypeof(object):用于检查传入的对象是否是当前对象的原型;

  * propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用fro-in语句来枚举,参数的属性名必须以字符串形式;

  * toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应;

  * toString() :返回对象的字符串表示;

  * valueOf():返回对象的字符串、数值或布尔值表示;

猜你喜欢

转载自www.cnblogs.com/thomas-yang-github/p/11706087.html