征服javascript学习笔记(二)——基本概念(上)

区分大小写

在js中,一切(包括“变量”、“函数名”、“操作符”)都区分大小写

标识符

指变量、函数、属性的名字,或者函数的参数。它的规则如下:

  • 第一个字符必须是字母、下划线或者$
  • 其他字符可以是字母、下划线、$或数字

按惯例,一般采用驼峰大小写格式
注:不要把关键字、保留字、true、false和null作为标识符

注释

单行://

多行:/**/

变量

js的变量是松散型,即一般人们所说的弱类型,可以保存任何类型的数据。比如:

var a=10;
var a=”idea”;

需要注意的一点是,用var操作符定义的变量将成为定义该变量的作用域中的局部变量,也就是说

function test(){
var a=10;
}
test();
alert(a) //错误

变量在函数退出后被销毁

如果像下面这样

function test(){
a=10;
}
test();
alert(a);//10

这里省略了var操作符,定义了一个全局变量。

注:这种做法并不推荐,因为在局部作用域中定义全局变量很难维护。

数据类型

共有5种简单/基本数据类型:

Undefined、Null、Boolean、Number和String

还有一种复杂数据类型——Object,它本质上是由一组无序的名值对组成。

typeof操作符

因为js是松散型,所以要有一种方法监测数据类型,typeof便是这么一种方法,它检测出来的结果可能以下几种:undefined、number、string、function(值是函数)、boolean、object(值是对象或null)
typeof的操作数可以是变量,也可以是数值字面量,比如:

alert(typeof(a));
alert(typeof a);
alert(typeof 10);

注意:typeof是一个操作符,而不是函数,所以,操作数的圆括号可选,上面的前两种写法都是可以的。

下面就每种类型稍加介绍:

Undefined

在使用var定义了一个变量而未对其初始化的时候,这个变量的值就是undefined

比如:

var a;
alert(a==undefined);//true

这里需要区分一下的是,未初始化的变量,值是undefined,这跟未定义的变量还是不同的,比如:

var a;
alert(a);//undefined
alert(b);//产生错误

对于未声明的变量,只能进行一项操作,就是typeof,但有意思的是:

var a;
alert(typeof a);//undefined
alert(typeof b);//undefined

如你看到的那样,未声明和未初始化的变量,从类型上来看都是undefined,这并不是说二者完全等同,它们有着本质的区别,但是从可操作性上来说是一样的,都不能进行操作。

当然,也正是因为这一点,我们最好在声明一个变量的时候进行初始化,这样当我们检测一个变量的类型时返回undefined就能准备判断它是未声明的变量。

Null

逻辑角度来看,null值表示一个空对象指针,这也正是使用typeof操作符检测null值时会返回“object”的原因。如下:

var car=null;
alert(typeof(car));//“object”

Boolean

此种类型时js中使用最多的一种,有两个字面值:true、false。
注意,这两种值和数字不是一回事,true不一定等于1,false也不一定等于0.

虽然Boolean类型的字面值只有两个,但js中所有类型的值都有与这两个值等价的值,要将一个值转换为对应的Boolean值,可以调用转型函数Boolean(),如下:

var message=“hello world”;
var messageAsBoolean=Boolean(message);

Number

js最受关注的数据类型,有如下字面量格式:

var a=10; //十进制
var a=070; //八进制,0开头
var a=0xA; //十六进制,0x开头

其中,八进制字面量在严格模式下无效。

在进行算术计算时,所有八进制和十六进制表示的数值最终将被转换成十进制数值。

数值型有几点需要清楚:

1、浮点数

var a=1.1;
var a=.1; //有效,但不推荐

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此js会不失时机的将浮点数值转换为整数值,显然,如果小数点后面没有跟任何数字,就可以作为整数保存,另外,如果浮点数本身表示的就是一个整数,如1.0,则该值也会被转换为整数。

对于那些极大或极小的数值,可以用e表示法(科学计数法)表示的浮点数值表示,用e表示的数值等于e前面的数值乘以10的指数次幂。下面是个例子:

var floatNum=3.125e7; //等于31250000

同理,也可以用它表示极小的值。

浮点数的最高精度是17位小数,但在算术计算时,其准度远不如整数,例如:0.1+0.2结果不是0.3,而是0.30000…4,这个小小的舍入误差会导致无法测试特定的浮点数值。
例如:

if(a+b==0.3){
alert(“you got 0.3.”);
} //不要做这样的测试

如果a和b是0.05和0.25,或0.15和0.15,都不会有问题,如果是0.1和0.2,那么测试无法通过。所以,不要测试某个特定的浮点数值。

2、数值范围

由于内存的限制,js并不能保存世界上所有的数值,js能够表示的最小数值保存在Number.MIN_VALUE中,最大数值保存在Number.MAX_VALUE中。如果某次计算的值超出了这个范围,那么它将自动转换成特殊的Infinity值(正、负无穷)。想判断一个数值是否超出范围,可以使用isFinite()函数,这个函数的参数位于最大和最小数值之间时会返回true。
尽管计算时很少出现超出范围的情况,但在执行极小和极大计算时,检测监控这些值是可能的,也是必需的。

3、NaN

这个数值用于表示一个本来要返回数值的操作数未返回数值的情况,这样也不会抛出错误了。
NaN本身有两个特点:

  • 任何涉NaN的操作都会返回NaN
  • NaN不等于任何值,包括其自身

针对这两个特点,js定义了isNaN()函数,这个函数接受一个参数,该参数可以是任何类型,函数会帮我们确定这个参数是否“不是数值”,它在接收到一个值之后,会尝试将这个值转换为数值,某些不是数值的值会直接转换为数值,例如“10”或布尔值,任何不能转换为数值的值都会导致这个函数返回true。

4、数值转换

3个函数可以把非数值转换为数值,Number()、parseInt()、parseFloat().
其中Number()适用任何数据类型,另两个函数专用于把字符串转换成数值。
3个函数对于同样的输入会有返回不同的结果。

Number()函数的转换规则如下

  • Boolean值,true和false被转换为1和0

  • 数字值,简单的传入和返回

  • null,返回0
  • undefined,返回NaN

如果是字符串,遵循下列规则:

  • 若只包含数字(包括前面有正负号),则将其转化为十进制数字,放在前面的0会被忽略
  • 若包含浮点形式,如1.2,转换成对应的浮点数值,同忽略前导0
  • 若包含十六进制,将其转化为相同大小的十进制整数值
  • 若为空,转换为0
  • 若包含上述格式之外的字符,转换为NaN
    如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值,若结果是NaN,则调用toString()方法,然后再次依照前面规则转换返回的字符串值。

可以归结为一句话:“内容是数值格式的,依然转换为数值,忽略前导0,非十进制转换为等值十进制,若包含非数值格式内容,则为NaN”。若是对象,则处理其返回值,处理方式按照数值型或字符串型。

由于Number()函数转换字符串时比较复杂且不够合理,因此在处理整数的时候更常用的是parseInt()函数,parseInt()更多的是看其是否符合数值模式,会忽略字符串前面的空格,直到找到一个非空字符,如果第一个字符不是数字字符或负号,它就会返回NaN,也就是说,用parseInt()转换空字符串会返回NaN(Number()会返回0),如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符,例如:“1234blue”会被转换为1234,因为“blue”会被完全忽略,类似的,“22.5”会被转换为22,小数点也不是有效字符。如果字符串中第一个字符是数字字符,parseInt()也能识别出各种整数格式,即十进制、八进制、十六进制等.

注:由于不同版本会出现不同情况处理,可以为parseInt()提供第二个参数:转换时使用的基数(进制),如:

var num=parseInt(“0xAF”,16);

实际上,如果制定了16作为第二个参数,字符串可以不带前面的”0x”,比如:

var num=parseInt(“AF”,16);

与上等效。

另外要指出的是,不只是格式符合的才能指定相应的基数,例如:

var num1=parseInt(“10”,2); //2
var num1=parseInt(“10”,8); //8
var num1=parseInt(“10”,10); //10
var num1=parseInt(“10”,16); //16

不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,建议使用时都指定基数。大多数情况下,我们要解析的都是十进制数。

与parseInt()函数类似,parseFloat()也是从第一个字符(位置0)开始解析每个字符,也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止,也就是说,第一个小数点有效,第二个无效。比如:“22.34.5”被转换为22.34.除了第一个小数点有效之外,parseInt()与parseFloat()的第二个区别在于后者始终都会忽略前导的0,parseFloat()可以识别前面讨论过的所有浮点数值格式,包括十进制整数格式,但十六进制始终被转换成0,由于parseFloat()只解析十进制,因此它没有第二个参数指定基数的用法,最后还要注意,如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是0),parseFloat()会返回整数。这一切看起来都很合理,是的~

String类型

String类型用于表示由零或16位Unicode字符组成的字符序列,即字符串。
以下两种写法都有效:

var a=”idea”;
var a=’idea’;

1、字符字面量

String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符或者其他用途的字符,如:\n(换行)、\t(制表)、\b(空格)等。

2、字符串的特点

ES中的字符串是不可变的,,一旦创建,值就不能改变,要改某个变量保存的字符串,首先销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。

3、转换为字符串

要把一个值转换为字符串有两种方式。

第一种是几乎每个值都有的toString()方法

var age=11;
var ageAsString=age.toString(); //字符串“11”

多数情况下,调用toString()不需要传递参数,,但是在调用数值的toString()方法时,可以传递一个参数:输出数值的基数,默认情况下,是以十进制格式,可以通过传递基数,toString()可以输出以二进制、八进制、十六进制,乃至其他任意有效进制格式表示的字符串值。

var num=10;
alert(num.toString());//“10”
alert(num.toString(2)); //“1010”

在不知道要转换的值是不是null和undefined的情况下,还可以使用转型函数String)(),这个函数能够将任何类型的值转换为字符串,遵循下列转换规则。

  • 如果值有toString()方法,则调用该方法并返回相应的结果;
  • 如果值是null,返回“null”;
  • 如果值是undefined,则返回“undefined”。

Object类型

ES中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建,而创建Object类型的实例并为其添加属性和(或)方法,就可以创建自定义对象,如下:

var o=new Object();

语法与java中创建对象的语法相似,但在ES中,如果不给构造函数传递参数,则可以省略后面的那一对圆括号。但一般不建议这么做。

仅仅创建Object的实例并没有什么用处,但关键是要理解一个重要的思想,即在ES中,Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。

Object的每个实例都具有下列属性和方法:

  • constructor:保存着用于创建当前对象和函数。
  • hasOwnProperty:用于检查给定的属性当前对象实例中是否存在,其中,作为参数的属性名必须以字符串形式指定
  • isPrototypeOf:用于检查传入的对象是否是传入对象的原型
  • propertyIsEnumberable:用于检查给定的属性是否能够使用for-in语句来枚举,与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
  • toLocaleString():返回对象的字符串表示
  • valueOf():返回对象的字符串、数值或布尔值表示,通常与toString()方法的返回值相同

由于ES中的Object是所有对象的基础,因此所有对象都具有这些基本的属性和方法。

js的基本概念众多,如果都放在一篇文里来罗列,显得太过冗长,也不易对内容做适当的展开,这里就先记录一部分,剩下的还有语句和函数等大牌,下篇文再把它们请出来~

一起加油,下次见~