博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JS---基本概念

Posted on 2013-05-21 10:47  Amy-lover  阅读(249)  评论(0编辑  收藏  举报

一、语法

  1.1 区分大小写

  1.2 标示符第一个字符必须是字母,下划线或者$,其他字符可以是数字,字母,下划线以及$

  1.3 单行注释//,多行注释/**/

  1.4 语句结尾尽量加上分号,因为代码压缩的时候,可能会因为语句结尾没有分号而出错

二、变量

  2.1 ECMAScript的变量是松散型的,即可以用来保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符而已,使用var来定义变量

  2.2 如果使用var操作符来定义变量,那么这个变量就成为定义该变量的作用域中的局部变量,如果不使用var操作符的变量则是全局变量

三、数据类型

  3.1 ECMAScript有5种简单数据类型,一种复杂数据类型

  3.2 简单数据类型有Undefined、Null、Boolean、Number、String,复杂数据类型为Object,Object是由一组无序的名值对组成

  3.3 typeof操作符:由于ECMAScript是松散型的语言,因此需要一种手段来检测给定变量的数据类型,typeof操作符返回的字符串如下

    3.3.1 "undefined":该变量没有定义

    3.3.2 "boolean":该变量是布尔值

    3.3.3 "string":该变量是字符串

    3.3.4 "number":该变量是数值

    3.3.5 "object":该变量是对象或者null

    3.3.6 "function":该变量是函数

var m;
alert(typeof m);//undefined
m=true;
alert(typeof m);//boolean
m="true";
alert(typeof m);//string
m=1;
alert(typeof m);//number
m=new Object();
alert(typeof m);//object
m=function(){};
alert(typeof m);//function

  3.4 Undefined类型只有一个值就是undefined,只有在使用var操作符声明变量但未对其初始化时,该变量的值才为undefined

    3.4.1 注意没有定义和没有初始化的区别

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

  3.5 Null类型只有一个值就是null,表示一个空对象指针,定义该值的变量是准备保存对象的变量,在保存变量以前初始化为null

    3.5.1 undefined派生自null值,因此undefined==null;//true

    3.5.2 由于定义为null值的变量是准备保存object的,因此利用typeof操作符检索该变量,返回值为object

  3.6 Boolean类型只有两个值true和false

    3.6.1 所有类型的值都有与true和false相等价的值,转换的时候使用转型函数Boolean()

数据类型 可以转换为true的值 可以转换为false的值
Boolean true false
String 任何非空的字符串 ""(空字符串)
Number 任何非0的数字 0和NaN
Object 任何对象 null
Undefined   undefined

  3.7 Number类型使用IEEE754表示整数和浮点数

    3.7.1 八进制第一位必须是0,后面的数字必须是0到7之间的,如果超过就被当做十进制的数值来解析

    3.7.2 十六进制头两位是0x,后面是0-9和a到f,可以大小写混用

    3.7.3 浮点数:必须包含小数点,小数点后至少有一位数字,由于浮点数所需内存空间是整数的两倍,所以如果小数点后没有数字会被当做整数,同样,

      3.7.3.1 如果该浮点数本身就是一个整数,例如1.0,那么该值也被当做整数

      3.7.3.2 对于极大极小的数,利用科学计数法表示,默认ECMAScript遇到小数点后面有6位以上的浮点数,就转换为科学计数法

      3.7.3.3 浮点数的最高精度是17位,但是计算时远远不如整数,因此永远不要测试某个特定的浮点数alert(0.1+0.2);//0.30000000000000004

      3.7.3.4 最大值与最小值Number.MIN_VALUE和Number.MAX_VALUE超过最大值和最小值表示为正负无穷大Infinity和-Infinity

      3.7.3.5 判断一个数值是否位于最大值和最小值之间的函数isFinite()

    3.7.4 NaN是一个特殊的数值,表示一个本来要返回数值的操作未返回数值的情况,例如4/0,,

      3.7.4.1 任何与NaN有关的操作都返回NaN

      3.7.4.2 NaN与任何值都不相等,包括其自身

      3.7.4.3 判断某一变量是否”不是数值“的函数isNaN()

    3.7.5 数值转换的三个函数Number()可用于任何数据类型,parseInt()parseFloat()专门用于字符串转换成数值

      3.7.5.1 Number()的转换规则

        3.7.5.1.1 如果是Boolean的true和false转换为1和0

        3.7.5.2 如果是数值就直接返回

        3.7.5.3 如果是null,返回0

        3.7.5.4 如果是undefined,返回NaN

        3.7.5.5 如果是字符串,忽略掉字符串前面的0,转换成十进制,如果开头有ox,则转化成与十六进制大小相等的十进制数值,如果为"",转换为0,如果包含其他字符转换为NaN

     3.7.6 parseInt()的转换规则

      3.7.6.1 只针对字符串,

      3.7.6.2 会找到第一个非空格的字符,如果该字符不是数字以及符号,就返回NaN,空字符串也是NaN,直到解析到非数字字符为止

      3.7.6.3 如果开头的非空字符为0或者ox时,则字符串会被当做八进制或者十六进制进行解析,解析后返回的都是与其相等的十进制的数

      3.7.6.4 可以指定第二个参数为8或者16,那么该字符串会被当做八进制或者十六进制进行解析,解析结果返回的仍然是与之相等的十进制的数

    3.7.7 parseFloat()的转换规则:从第一个非空的字符开始,直到遇到一个无效的浮点数字字符为止,只解析十进制值,因此没有第二个参数,ox开头的字符返回0

  3.8 String类型:用于表示由0个或者多个Unicode字符组成的字符序列,可以用双引号或者单引号表示,没有区别

    3.8.1 length属性:返回字符串中16位字符的数目

    3.8.2 ECMAScript中的字符串是不可变的,即一旦字符串创建,它们的值是不可改变的,要改变某个变量保存的字符串,首先用包含新值的字符串填充该变量,然后销毁原来的字符串

    3.8.3 针对3.8.2的例子

var lang="java";
lang=lang+"script";
//进行这步操作:首先创建一个可以容纳10个字符的新字符串,然后用"java"和"script"进行填充,填充完后,销毁字符串"java"和"script"

    3.8.4 转换为字符串的方法:toString()方法String()函数

    3.8.5 除了null和undefined外每个值都有的toString()方法,该方法会返回相应值的字符串表现

    3.8.6 toString()方法:数值调用的该方法可以传递参数:输出数值的基数,返回用参数进制表示的数值的字符串形式

    3.8.7 String()函数:由于null和undefined没有toString()方法,因此只能用String()函数

  3.9 Object类型:是一组数据和功能的集合,是所有它的实例的基础,因此它具有的任何属性和方法也都存在于更具体的对象中

    3.9.1 constructor属性:该属性保存了用于创建当前对象的函数,即当前对象的构造函数,object类型的构造函数就是Object()

    3.9.2 hasOwnProperty(属性名)方法:用于检查给定的属性是否存在于当前对象的实例中,而不是实例的原型中

    3.9.3 isPrototypeOf(对象)方法:用于检查传入的对象是否是调用该方法对象的原型

    3.9.4 propertyIsEnumerable(属性名)方法:用于检查给定属性是否可以使用for-in语句进行枚举

    3.9.5 toString()方法:返回对象的字符串表示

    3.9.6 valueOf()方法:返回对象的字符串、数值或者布尔值的表示

四、操作符

  4.1 位操作符:用于最基本的层次上,按内存中表示数值的位来操作数值

    4.1.1 位操作只针对32位的整数:ECMAScript中数值都是以64位格式存储,但按位操作并不直接操作64位,而是先将64位转换成32位的整数,然后执行操作,操作完毕后再转回64位

    4.1.2 对于有符号的整数,前31位表示整数的数值,第32位表示数值的符号,0为正,1为负,成为符号位

    4.1.3 负数:使用二进制补码进行存储,第一绝对值的二进制,第二,取反,0->1,1->0,第三,加1

    4.1.4 计算-18的二进制表示:18=(10010)2;取反 (111...01101)2;加1 (111...01110)2

    4.1.5 我们看到的负数的二进制为:负数的绝对值的二进制码前面加上符号

var lang=-18;
alert(lang.toString(2));//-10010

    4.1.6 按位非(NOT)~:取反,实质:对数值的负数减1

    4.1.7 按位与(AND)&:只有都是1时菜返回1,

    4.1.8 按位或(OR)|:只要有一个是1就返回1

    4.1.9 按位异或(XOR)^:只有一个1时才返回1

    4.1.10 左移(<<移的位数):除了符号位全部向左移动,左移不影响符号位,右侧空出来的位用0填充

    4.1.11 有符号右移(>>):除了符号位全部右移,用符号位填充左侧空出来的位

    4.1.12 无符号的右移(>>>):包括符号位全部右移,0填充空白位

  4.2 布尔操作符:逻辑非!,逻辑与&&,逻辑或||

  4.3 乘法操作符:Infinity*0==NaN,Infinity*正数(包括Infinity)=Infinity,Infinity*负数(包括-Infinity)==-Infinity

  4.4 除法操作符:Infinity/Infinity=NaN

  4.5 加法操作符:-Infinity+Infinity=NaN;如果一个操作数是字符串,则是拼接字符串,例如"8"+4="84"

  4.6 减法操作符:Infinity-Infinity=NaN

  4.7 关系操作符:

    4.7.1 如果一个是数值一个是字符串,则字符串会转换成数值进行比较;

    4.7.2 如果两个都是字符串会依据字符编码进行比较,例如"23"<"3";//true

    4.7.3 任何操作数和NaN比较都是false

  4.8 相等操作符(==):先强制转换,然后再比较

    4.8.1 null==undefined

    4.8.2 NaN不等于任何值,包括其自身

    4.8.3 "5"==5

    4.8.3 全等操作符(===):两个操作数不经转换就相等"5"!==5

  4.9 逗号操作符:在用于赋值时,逗号操作符总会返回表达式中的最后一项

var lang=(-18,2);
alert(lang);//2

 

   4.10 for-in语句:一种精确的迭代语句,可以用来枚举对象的属性

for(var name in window){//利用for-in来显示BOM中window对象的所有属性
    document.write(name+"<br/>");
}

 

   4.11 label语句:定义的标签可以在将来由break或者continue语句引用,一般都与for语句等循环语句配合使用

  4.12 break语句:立即退出循环,强制继续执行循环后面的语句,continue:立即退出循环,从循环顶部继续执行

  4.13 with语句:将代码的作用域设定到一个特定的对象中

with(location){
    document.write(hostname+"<br/>");//原本应该是location.hostname
    document.write(href+"<br/>");//原本应该是location.href
}

 

 五、函数

  5.1 函数不必指定是否返回值,只要return语句后跟要返回的值即可实现返回值

  5.2 函数在执行到return语句后悔立即停止并退出,return后面的代码永远不会得到执行

  5.3 return语句不带任何返回值时,会返回undefined值,这种做法一般用在需要提前停止函数执行而又不需要返回值的情况

  5.4 ECMAScript函数不介意传递进来参数个数以及类型,因为ECMAScript中的参数在内部是用一个数组来表示的,函数接收到的始终是这个数组,至于数组中包含的内容并不关心

  5.5 可以使用arguments对象来访问参数数组,arguments[i]来访问第i+1个参数,arguments.length确定传递进来的参数的个数

  5.6 没有传递值的命名参数将被自动赋值undefined

  5.7 ECMAScript中所有的参数都是值传递,没有引用传递

  5.8 如果出现两个相同名字的函数,后者会覆盖前者