首页 > 代码库 > JavaScript高级程序设计笔记(一)

JavaScript高级程序设计笔记(一)

1. ECMA规定了这门语言的下列组成部分: 语法、 类型、语句、 关键字、保留字、操作符、 对象


2. 什么是 ECMAScript 兼容
支持 ECMA描述的所有“类型、值、对象、属性、函数以及程序句法和语义”
支持 Unicode 字符标准。
此外,兼容的实现还可以进行下列扩展。
添加 ECMA没有描述的“更多类型、值、对象、属性和函数”。
支持 ECMA没有定义的“程序和正则表达式语法”。


3. 5种简单数据类型: Undefined(不明确的,未定义) 、 Null(空) 、 Boolean 、 Number、 String
    1种复杂数据类型—— Object , Object 本质上是由一组无序的名值对组成的。ECMAScript 中的对象其实就是一组数据和功能的集合。


4.typeof 返回值:

"undefined"——如果这个值未定义或不存在 :var a 或 //var a
"object" ——如果这个值是对象或 null ;
"function" ——如果这个值是函数。


5.typeof 是一个操作符而不是函数,因此圆括号尽管可以使用,但不是必需的。alert(typeof(message)); alert(typeof 95);


6.typeof null会返回 "object" ,因为特殊值 null 被认为是一个空的对象引用。


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


8.如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。


9.实际上, undefined 值是派生自 null 值的,因此 undefined==null为true


10. Boolean()转换为true的值:       转换为false的值:
        非空字符串          "" (空字符串)
      非零数字值(包括无穷大)       0和 NaN
        任何对象                 null


11、var octalNum1 = 070; // 八进制的 56
  var octalNum2 = 079; // 无效的八进制数值——解析为 79
  var octalNum3 = 08; // 无效的八进制数值——解析为 8
  var hexNum1 = 0xA; // 十六进制的 10 0x开头
  var hexNum2 = 0x1f; // 十六进制的 31
  在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
  正零和负零被认为相等(全等)


12、3.125e7 等于 31250000 0.0000003 等于 3e-7 小数点后有7位


13、数值范围
由于内存的限制,ECMA并不能保存世界上所有的数值。ECMA能够表示的最小数值保存在 Number.MIN_VALUE 中——在大多数浏览器中,这个值是 5e-324;能够表示的最大数值保存在Number.MAX_VALUE 中——在大多数浏览器中,这个值是 1.7976931348623157e+308。如果某次计算的结果得到了一个超出 JavaScript 数值范围的值,那么这个数值将被自动转换成特殊的 Infinity 值。具体来说,如果这个数值是负数,则会被转换成 -Infinity (负无穷),如果这个数值是正数,则会被转换成 Infinity (正无穷)。如上所述,如果某次计算返回了正或负的 Infinity 值,那么该值将无法继续参与下一次的计算,因为 Infinity 不是能够参与计算的数值。要想确定一个数值是不是有穷的(换句话说,是不是位于最小和最大的数值之间),可以使用 isFinite() 函数。这个函数在参数位于最小与最大数值之间时会返回 true


14. 任何涉及 NaN 的操作(例如 NaN /10)都会返回 NaN
  NaN 与任何值都不相等,包括 NaN 本身。
  isNaN()
  0除以 0 返回 NaN,正数除以 0 返回 Infinity,负数除以 0返回-Infinity。


15. Number() 、 parseInt() parseFloat()


16. Number() 函数的转换规则如下。
Boolean 值, true 和 false 将分别被转换为 1 和 0。
数字值,只是简单的传入和返回。
null 值,返回 0。
undefined ,返回 NaN 。
如果是字符串,遵循下列规则:
如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 "1"
会变成 1, "123" 会变成 123,而 "011" 会变成 11(注意:前导的零被忽略了);
如果字符串中包含有效的浮点格式,如 "1.1" ,则将其转换为对应的浮点数值(同样,也会忽
略前导零);
如果字符串中包含有效的十六进制格式,例如 "0xf" ,则将其转换为相同大小的十进制整
数值;
如果字符串是空的(不包含任何字符),则将其转换为 0;
如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。
如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换
的结果是 NaN ,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符
串值。
一元加减操作符的操作与 Number() 函数相同。


17. 由于 Number() 函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是
parseInt() 函数。
如果第一个字符不是数字字符或者正负号,parseInt()就会返回 NaN ;也就是说,用parseInt()
转换空字符串会返回 NaN 如果第一个字符是数字字符, parseInt() 会继续解析第二个字符,直
到解析完所有后续字符或者遇到了一个非数字字符(包括小数点)。
在 ES5 JavaScript 引擎中, parseInt() 已经不具有解析八进制值的能力(需要第二个参数)
var num = parseInt("0xAF", 16); //175
实际上,如果指定了 16 作为第二个参数,字符串可以不带前面的 "0x"
parseFloat() 与 parseInt()的第一个区别是他可以识别第一个小数点,二个区别在于它始终都会忽
略前导的零。十六进制格式的字符串则始终会被转换成 0。由于 parseFloat() 只解析十进制值,因
此它没有用第二个参数指定基数的用法。


18. toString()
数值、布尔值、对象和字符串值都有 toString() 方法。但 null 和 undefined 值没有这个方法。
num.toString(2)//转换为2进制
String() 函数遵循下列转换规则:
如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果;
如果值是 null ,则返回 "null" ;
如果值是 undefined ,则返回 "undefined" 。


19. var o = new Object; // 有效,但不推荐省略圆括号


20. Object 的每个实例都具有下列属性和方法。ECMA不负责定义宿主对象,因此宿主对象可能会也可能不会继承 Object 。
constructor :保存着用于创建当前对象的函数。
hasOwnProperty(propertyName) :用于检查给定的属性在当前对象实例中(而不是在实例
的原型中)是否存在。其中,作为参数的属性名( propertyName )必须以字符串形式指定(例
如: o.hasOwnProperty("name") )。
isPrototypeOf(object) :用于检查传入的对象是否是传入对象的原型
propertyIsEnumerable(propertyName) :用于检查给定的属性是否能够使用 for-in 语句
来枚举。与 hasOwnProperty() 方法一样,作为参数的属性名必须以字符串形式指定。
toLocaleString() :返回对象的字符串表示,该字符串与执行环境的地区对应。
toString() :返回对象的字符串表示。
valueOf() :返回对象的字符串、数值或布尔值表示。通常与 toString() 方法的返回值
相同。


21. 操作符包括:算术操作符、位操作符、关系操作符、相等操作符
执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。
前置递增和递减操作与执行语句的优先级相等


22. 位操作符 40页


23. 逻辑非 not ! 逻辑非操作符也可以用于将一个值转换为与其对应的布尔值 !!
逻辑与 and &&
有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:
如果第一个操作数是对象,返回第二个操作数;
如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
如果两个操作数都是对象,则返回第二个操作数;
如果有一个操作数是 null ,则返回 null ;
如果有一个操作数是 NaN ,则返回 NaN ;
如果有一个操作数是 undefined ,则返回 undefined 。
逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
对于逻辑与操作而言,如果第一个操作数是 false ,则无论第二个操作数是什么值,结果都不再可能是true 了。
不能在逻辑与操作中使用未定义的值,否则会报错
逻辑或 or ||
如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下列规则:
如果第一个操作数是对象,则返回第一个操作数;
如果第一个操作数的求值结果为 false ,则返回第二个操作数;
如果两个操作数都是对象,则返回第一个操作数;
如果两个操作数都是 null ,则返回 null ;
如果两个操作数都是 NaN ,则返回 NaN ;
如果两个操作数都是 undefined ,则返回 undefined 。
逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true ,就不会对第二个操作数求值了。


24. +
如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
如果有一个操作数是对象、数值或布尔值,则调用它们的 toString() 方法取得相应的字符串值,
然后再应用前面关于字符串的规则。对于 undefined 和 null ,则分别调用 String() 函数并取得字符
串 "undefined" 和 "null" 。
     -
如果有一个操作数是字符串、布尔值、 null 或 undefined ,则先在后台调用 Number() 函数将
其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN ,则减法的结果就是 NaN ;
如果有一个操作数是对象,则调用对象的 valueOf() 方法以取得表示该对象的数值。如果得到
的值是 NaN ,则减法的结果就是 NaN 。如果对象没有 valueOf() 方法,则调用其 toString()
方法并将得到的字符串转换为数值。
    ><...
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
如果一个操作数是对象,则调用这个对象的 valueOf() 方法,用得到的结果按照前面的规则执
行比较。如果对象没有 valueOf() 方法,则调用 toString() 方法,并用得到的结果根据前面
的规则执行比较。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); //false .toLocaleUpperCase()


25. 由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,推荐使用全等和不全等操作符。


26. do-while 语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。
换句话说,在对条件表达式求值之前,循环体内的代码至少会被执行一次。while 语句属于前测试循环语句
for (;;) { // 无限循环
doSomething();
}

var count = 10;
var i = 0;
for (; i < count; ){ //相当于while
alert(i);
i++;
}
for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。
如果表示要迭代的对象的变量值为 null 或 undefined,则不执行循环体。
break continue


27. with 语句的作用是将代码的作用域设置到一个特定的对象中,定义 with 语句的目的主要是为了简化多次编写同一个对象的工作:
var qs = location.search.substring(1),
hostName = location.hostname,
url = location.href;
等于:
with(location){
var qs = search.substring(1),
hostName = hostname,
url = href;
}由于大量使用 with 语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用程序时,不建议使用 with 语句。


28. switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换


29. 要么让函数始终都返回一个值,要么永远都不要返回值。
无须指定函数的返回值,因为任何 ECMAScript 函数都可以在任何时候返回任何值。//这两句不理解
实际上,未指定返回值的函数返回的是一个特殊的 undefined 值。


30. arguments[0] arguments.length 实参的个数 函数的 length 得到的是形参个数。

没有传递值的命名参数将自动被赋予 undefined 值。
ECMA中的所有参数传递的都是值,不可能通过引用传递参数。


31. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。
5 种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。
与其他语言不同,JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。
在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。(这种说法不严密,当复制保存着对象的某个变量时,操作的是对象的引用。但在为对象添加属性时,操作的是实际的对象。)


32. 复制基本类型的值,会在变量对象上创建一个新值。复制引用类型的值时,将复制一份指针,
因此,改变其中一个变量,就会影响另一个变量

JavaScript高级程序设计笔记(一)