首页 > 代码库 > 学习笔记(二)JavaScript基本概念(语法,数据类型,控制语句,函数)

学习笔记(二)JavaScript基本概念(语法,数据类型,控制语句,函数)

一.语法

1.javascirpt中一切(变量,函数名和操作符)是严格区分大小写的。

2.javascript(标识符)

所谓标识符,就是指变量,函数,属性的名字,或者函数的参数。

命名规则:第一个字符必须是一个字母、下划线、美元符号,其它字符可以是字母、下划线、美元符号或数字。

不能把关键字,保留字,true,false和null用作标识符。

3.ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写。(但是没有谁强制要求这个格式)

4.注释

//单行注释
/*
*这是多行注释
*/

5.语句

每条语句最好用一个分号结尾,但是也可以省略分号。

可以把多条语句组合到一个代码块中,及代码块以左花括号({)开头,以右花括号(})结尾。

if (test) 
alert(test); //有效但容易出错,最好不要使用

if (test) {

alert(test);//推荐使用
}

6.关键字和保留字

 

 

7.变量

变量是松散类型的,可以用来保存任何类型的数据。使用关键字var来声明变量。

var message; 像这样未经过初始化的变量会保存一个特殊的值undefined

obj=100; 这样虽然有效,但不推荐,这样相当于声明了一个全局变量

二. ECMAScript有5种简单数据类型:Undefined,Null,Boolean,Number和String以及1种复杂数据类型Object 

1.typeof操作符:一元操作符,操作数可以是变量或数字字面量,用来检测给定变量的数据类型。

可能的返回值:

1). ‘undefined‘ --- 这个值未定义;

2). ‘boolean‘    --- 这个值是布尔值;

3). ‘string‘        --- 这个值是字符串;

4). ‘number‘     --- 这个值是数值;

5). ‘object‘       --- 这个值是对象或null;

6). ‘function‘    --- 这个值是函数。

2.Undefined类型只有一个值,即特殊的undefined.

var message;

alert(message==undefined); //true

包含undefined值的变量与尚未定声明的变量还是不一样。

var message;

//var age;
alert(message); //undefined
alert(age); //产生错误

对尚未声明的变量执行typeof,结果返回undefined,对尚未初始化的变量执行typeof,结果返回undefined

var message;

//var age;
alert(typeof message); //undefined
alert(typeof age); //undefined

最好显示的初始化变量,这样的话当typeof操作符返回undefined值时,我们就知道被检测的变量没有被声明,而不是尚未初始化,因为没有声明的变量用typeof操作符就会直接返回undefined

3.null类型

null类型只有一个值,即特殊的null. null值表示一个空对象指针,typeof操作符检测null值返回“object”。

null与undefined之间的相等操作符(==)进行比较总是返回true。

4.Boolean类型

只有两个字面值:true和false,这两个值与数字值不一样,true不一定等于1,false不一定等于0,这两个字面值区分大小写。

要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。

javascript中,任何的数据类型调用转型函数Boolean(),总会返回一个Boolean值,各种数据类型及转换规则如下:

5.Number类型

包括整数和浮点数

1).整数包括十进制,八进制字面值和十六进制的字面值。

八进制字面值的第一位必须是零,十六进制的字面值的前两位必须是Ox。

在进行算术计算时,八进制字面值和十六进制的字面值最终会转换成十进制数值。

2).浮点数

所谓浮点数值,该数值中必须包含一个小数点,并且小数点后必须至少有一位数字。小数点前面可以没有整数,但是不推荐这样使用。

  浮点数可以这样:var floatNum = .1;但是不推荐这样使用。

  由于保存浮点数值需要的内存空间是整数值的两倍,因此不失时机的将浮点数值转换为整数值如果浮点数小数点后面没有任何数字,那个这个数值就可以被作为整数值来保存,同样,如果浮点数本身就表示一个整数(如1.0)那么该值也会被转换为整数。

对于极大和极小数值,使用科学计数法。浮点数值最高精度是17位小数。

     Number.MAX_VALUE整数的最大值

  Number.MIN_VALUE整数的最小值

  如果计算得到一个超出javascript数值范围的值,那么这个数值自动转换为特殊的Infinity,如果某次返回正的或负的Infinity值,那么该值将无法继续参与下一次计算

  要想确定一个数值是不是有穷的,可以使用isFinite()函数,如果参数介于最大数和最小数之间返回true。

  访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY可以得到正和负的Infinity的值,所以其实这两个属性分别保存着-Infinity和Infinity

3).  NaN

      NaN特点:1任何涉及到NaN的操作都会返回NaN,2NaN与任何值都不相等,其中包括NaN本身 。

      isNaN()这个函数接受一个参数,该参数可以是任何类型,而此函数会帮我们确定这个参数是否“不是数值”,不是数值返回true。

      isNaN()这个函数接受一个参数,会尝试将这个值转换为数值。任何不能被转换为数值的值都会导致该函数返回true。

      alter(isNaN(NaN));//true

     alter(isNaN(10));//true

     alter(isNaN("10"));//true

     alter(isNaN("red"));//false

     alter(isNaN(true));//true

4).数值转换

有三个函数可以将非数值转换为数值:Number(),parseInt(),parseFloat()

转型类型Number()可以用于任何数据类型,parseInt(),parseFloat()专门用于将字符串转换成数值。

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

(1)如果是Boolean值,true和false将分别被转换为1和0
(2)如果是是数字值,只是简单的传入和返回
(3)如果是null值,返回0
(4)如果是undefined,返回NaN
(5)如果是字符串,遵循下列规则:
        如果字符串中只包含数字,则将其转换为十进制数值,级“1”会变成1,“123”会变成123,而“011”会变成11(前面的0被忽略了)
        如果字符串中只包含有效的浮点格式,如“1.1”,则将其转换为对应浮点数值(同样,也会忽略前导零)
        如果字符串中只包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值
        如果字符串是空的(不包含任何字符),则将其转换为0
         如果字符串中包含除上述格式之外的字符,则将其转换为NaN
(6)如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()把各种数据类型转换为数值确实有点复杂。下面是几个具体例子:
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number("true"); //1

parseInt()

parseInt()函 数在转换字符串时,它会忽略字符串前面的空格,直至找到第一个非空格字符。

如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN(Number()对空字符串返回0)。

如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

例如,“123blue”会被转换为 1234,因为“blue”会被完全忽略。类似地,“22.5”会被转换成22,因为小数点并不是有效的数字字符。

如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即十进制、八进制、十六进制)。也就是说,如果字符串以 “0x”开头且后跟数字字符,就会将其当作一个十六进制整数;如果字符串以“0”开头且后跟数字字符,则将其当作一个八进制数或十进制来解析。

  为了更好地理解parseInt()函数的转换规则,下面给出了一些例子:

var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA") //10(十六进制)
var num4 = parseInt("22.5"); //22
var num5 = parseInt("070"); //56或70(八进制)
var num6 = parseInt("70"); //(70)十进制
var num7 = parseInt("0xF") //15(十六进制)

parseInt()解析“070”,导致上述困惑,ECMAScript也为这个函数提供了第二个参数:转换时使用的基数(即多少进制)。

指定基数会影响到转换的输出结果。

var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN
  这个例子中的第一个转换成功了,而第二个则失败了。差别在于第一个转换传入了基数,明确告诉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()也是从第一个字符(位置0)开始解析每个字符,一直解析到字符串末尾,或解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点是无效的,因此它后面的字符串将被忽略。举例来 说,“22.34.5”将会被转换为22.34。

  除了第一个小数点有效之外,parseFloat()与parseInt()的第二个区别在于它始终都会忽略前导零。由于parseFloat()只解析十进制值,因此 它没有用第二个参数指定基数的用法。十六进制格式的字符串始终会被转换为0。最后还要注意一点:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后面都是 零),parseFloat()会返回整数。以下是使用parseFloat()转换数值的几个典型示例:

var num1 = parseFloat("1234blue"); //1234
var num1 = parseFloat("0xA"); //0
var num1 = parseFloat("22.5"); //22.5
var num1 = parseFloat("22.34.5"); //22.34
var num1 = parseFloat("0908.5"); //908.5
var num1 = parseFloat("3.125e7"); //31250000

6.String类型

用双引号表示的字符串和用单引号表示的字符串完全相同,任何字符串长度都可以通过其length属性取得。

字符串的特点:字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用一个包含新值的字符串填充该变量。

toString()-转换为字符串

数值的toString()方法:把一个数值转换为字符串,返回该数值的字符串表现形式。可以传入一个基数,可以以十进制,八进制和十六进制的格式返回数值的字符串表现形式。

字符串toString()方法:返回字符串的一个副本。

转换为字符串方法toString(),数值、布尔值、对象和字符串都有些方法,但null和undefined值没有此方法

在不知道值为null或undefined值时,可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串,String()函数遵循转换规则:1). 如果值有toString()方法,则调用该方法(没有参数)返回相应的结果2). 如果值是null则返回"null"3). 如果值为undefined则返回"undefined"

7.Object类型

ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过new操作符来创建。在ECMAScript中,如果不能构造函数传递参数,则可以省略后面的那一对圆括号

如下所示

var obj = new Object();
var obj = new Object;//但一般不推荐这种写法。

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

    constructor保存着用于创建当前对象的构造函数

  hasOwnProperty(propertyName)用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在

  isPrototypeOf(object)用于检查传入的对象是否是另一个对象的原型

  propertyIsEnumerable(propertyName)用于检查给定的属性是否能够使用for-in语句来枚觉。

      toLacalString()返回对象的字符串表示,该字符串与执行环境的地区对应。

      toString()返回对象的字符串表示。

      valueOf()返回对象的字符串,数值,布尔值表示,返回指定对象的原始值。

每个JavaScript固有对象的 valueOf 方法定义不同。

 

对象返回值
Array数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。
BooleanBoolean 值。
Date存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function函数本身。
Number数字值。
Object对象本身。这是默认情况。
String字符串值。

Math 和 Error 对象没有 valueOf 方法。

三.函数

一. 函数使用function关键字来声明,后跟一组参数及函数体。

function sayHi(name,message){

      alter("hello"+name+","+message);

}

函数的调用:通过函数名来调用,后面加一对圆括号和参数。

sayHi("Nike","How are you today?");

函数中return语句之后的任何代码都永远不会执行

return 语句也可以不带有任何返回值,这种情况 下,函数在停止执行后将返回undefined值 

function sum(num1,num2){

return num1+num2;

alter("Hello");//永远不会被执行

}

sum(5,10);

 二.javascript的函数参数

javascript的函数参数与其它语言有所不同,它不介意传进来多少个参数,也不介意传进来的参数是什么数据类型。原因是javascript的函数参数在内部是用一个数组来表示,函数接收到的始终是这个数组,不关心数组中包含哪些参数,不包含参数也没关系。在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

可以使用方括号语法访问他的每个参数(arguments[0]第一个参数,arguments[1]第二个参数,。......)

通过arguments对象的length属性可以获得有多少个参数传递给了函数,没有传递值的命名参数将自动被赋予undefined值(ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数)

上面的函数可以重写,不显示地使用命名参数

function sayHi(){

      alter("hello"+arguments[0]+","+arguments[1]);//arguments[0]对应与name参数

}

命名参数可以与arguments对象一同使用,arguments的值永远与对应的命名参数的值同步。修改命名参数的值不会改变arguments的值,修改arguments的值会改变命名参数的值。

function doAdd(num1,num2){
  arguments[1]=10;
  alert(arguments[0]+num2);
}
  doAdd(0,20);

ECMAScript所有参数传递的都是值,不可能通过引用传递参数

三. ECMAScript函数没有重载

重载是指定义两个名字相同的函数,只要这两个定义的签名(接受参数的类型和数量)不同即可。

ECMAScript中两个名字相同的函数,后定义的函数覆盖了先定义的函数。

function addSomeNumber(num){

  return num+100;

}

function addSomeNumber(num){

  return num+200;

}

var result = addSomeNumber(100); //300

 

注意:与其它语言不同,ECMAScript没有为整数和浮点数值分别定义不同的数据类型,Numer类型可用于表示所有数值

ECMAScript中无须指定函数的返回值,因为任何ECMAScript函数都可以在任何时候返回任何值

ECMAScript函数中函数参数是以一个包含零或多个值的数组的形式传递的

可以向ECMAScript函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数

学习笔记(二)JavaScript基本概念(语法,数据类型,控制语句,函数)