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

时间: 2024-11-08 19:47:47

JavaScript高级程序设计笔记(一)的相关文章

javascript高级程序设计——笔记

javascript高级程序设计--笔记 基本概念 基本数据类型包括Undefined/Null/Boolean/Number和String 无须指定函数的返回值,实际上,未指定返回值的函数返回的是一个特殊的undefined值 变量.作用域和内存问题 基本类型值在内存中占据固定大小的空间,因此保存在栈内存中 引用类型的值是对象,保存在堆内存中 确定一个值是哪种基本类型用typeof,确定一个值是哪种引用用instanceof 所有变量都存在于一个执行环境当中,这个执行环境决定了变量的生命周期,

javascript高级程序设计笔记1

最近在看javascript高级程序设计,看之前觉得自己的js学得还不错,然后,看了没几页就觉得自己好像没有学过一样,这主要写写我以前不完全了解的一些知识. 首先是关于基本数据类型的,从Number开始,以前经常用parseInt来转换数值,看过书才知道,这个函数的本意是专门用于把字符串转换成数值,而且以前也不知道它具体是怎么一个转换规则.先来看看Number()函数的转换规则: 1.如果是Boolean 值,true 和false 将分别被转换为1 和0.2.如果是数字值,只是简单的传入和返回

javascript高级程序设计笔记(第5章 引用类型)

1.Object类型 两种方式定义:对象字面量.new 两种方式访问:括号.点 2.Array类型 2.1  定义方式:new Array.数组字面量 2.2  lenght属性:可以利用它方便的想数组末尾添加元素 2.3  检测数组 instanceof isArray()方法  2.4  toString().soLocaleString().valueOf().join()方法 2.5.栈方法   push()方法:逐个添加到数组末尾,并返回修改后的数组长度 pop()方法:返回数组的最后

【javascript高级程序设计笔记】第六章OOP

忙了一段时间,加了将近一个月的班. 书也落下没看,上次看到第七章(这部分笔记大概还是9月份的吧),偶尔看到很吃力.看的速度慢下来. 学习就是一个慢慢积累慢慢沉淀的过程.看书时没有明显觉得提升.但在看完书后近段时间工作中写代码,明显感觉效率还是有提升,基础知识牢固了. 这本书是第二次看,这次很认真的遍读和做笔记,笔记的文字均是自己边看边敲的,这样才更好的真正的吸收到一部分吧! 这些天在看web响应式设计:HTML5和CSS3实战 第6章 面向对像的程序设计 6.1.1属性类型 ECMAScript

JavaScript高级程序设计笔记之面向对象

说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,JavaScript中如何面向对象? JavaScript中将对象定义为:一组无序的 键值对的集合,属性以及方法的名称就是键,键的值可以是任何类型(字符串,数字,函数--) 在JavaScript中,所有对象继承自Object,所有对象继承自Object,所有对象继承自Object! 创建 1  简单创建

javascript高级程序设计笔记(第7章 函数表达式)

7.5 小结 在JavaScript 编程中,函数表达式是一种非常有用的技术.使用函数表达式可以无须对函数命名,从而实现动态编程.匿名函数,也称为拉姆达函数,是一种使用JavaScript 函数的强大方式.以下总结了函数表达式的特点.? 函数表达式不同于函数声明.函数声明要求有名字,但函数表达式不需要.没有名字的函数表达式也叫做匿名函数.? 在无法确定如何引用函数的情况下,递归函数就会变得比较复杂:? 递归函数应该始终使用arguments.callee 来递归地调用自身,不要使用函数名——函数

【javascript高级程序设计笔记】第一章与第三章

第1章 javascript简介 1.2Javascript实现 一个完整的javascript实现由下列三个不同的部分组成 核心(ECMAScript) 提供核心语言功能 文档对象模型(DOM) 提供访问和操作网页内容的方法和接口 浏览器对象模型(BOM)提供与浏览器交互的方法和接口 ECMAScript 它规定了这门语言的下列组成部分: 语法  类型  语句  关键字 保留字 操作符 对象 ECMA-262第5版,发布于2009年. 文档对象模型(DOM) Document Object M

JavaScript高级程序设计笔记

1.1 JavaScript简史 <script> async/defer可以控制js加载顺序 把js文件放在页面底部,加快页面打开速度 3 基本概念 语法 数据类型 流控制语句 理解函数 3.4 数据类型 ECMAScript中定义了六种数据类型:Underfined.Null.Boolean.Number.String.Object 使用typeof关键字来检测类型 //Boolean()转换 var bool1 = Boolean(true); var bool2 = Boolean(&

javascript高级程序设计--笔记01

概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型(BOM)  一套提供了与浏览器交互的API ECMAScript仅仅定义了这门语言的基础,如定义了:语法.类型.语句.关键字等,实际上这门语言本身不包含输入输出定义. 而现实中,ECMAScript大多借用了某些宿主环境(如web浏览器,Node,Adobe Flash)来实现丰富的功能,这些宿主环

javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记

1.事件流:描述的是从页面中接收事件的顺序. 2.事件冒泡:IE的事件流叫做事件冒泡,即事件开始从具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到不具体的节点(文档). 3.事件捕获:指不太具体的节点应该更早接收到事件,而具体的节点应该是最后接收到事件. 4.DOM事件流:“DOM2级事件”规定的事件流包含三个阶段:事件捕获,处于目标阶段和事件冒泡阶段.(实际的目标元素在捕获阶段接不会收到事件) IE不支持DOM事件流,Opera.safari.chrome.firefox支持