JS 乱记

  1. JS 中不存在块级作用域,也就是说在全局作用域下 if ,for 语句中用 var 声明的变量是全局变量。
  2. JS 中浮点数运算的值为近似值,比如:0.1 + 0.2 不等于 0.3 ,所以避免使用浮点数来进行比较。
  3. NaN != NaN ,NaN == undefined ,NaN !== undefined。
  4. 使用 undefined 或者 null 与数值进行比较时,undefined 转换为数值 NaN ,null 转换为数值 0。
  5. 在 if ,for 等条件语句中进行条件判断时,会将值转换为布尔值再判断;而在相等运算符(==)中进行比较时,大多数情况是将值转换为数值来比较。当字符串与字符串对象进行比较时,将对象转换为字符串来比较,只有当字符串与字符串比较时,才比较字符串值。
  6. 对象转换为字符串时,会先调用对象的 toString() 方法,如果转换不了,便会接着调用 valueOf() 方法,非数值返回 NaN。对象转换为数值时,先调用 valueOf() 方法,再调用 toString() 方法。
  7. 用逻辑运算符进行赋值时(根据短路的特性,短路返回左值,否则返回右值)会返回数据转换之前的值。如:var a = 1 || 2 此时 a 等于 1 ,而不是等于 true 。
  8. 如果一个变量在声明之后没有赋值,它的值是 undefined 。对同一变量重复进行声明(不赋值),并不会改变原有的值(返回原值)。引用一个未被声明的变量会报错(ReferenceError)。访问不存在的属性,值为 undefined ,访问 undefined 会报错。比如:var x = {}; x.y;/* undefined */ x.y.z;//TypeError。
  9. 字符串是不可变类型。
  10. window 属性既是全局对象的属性,又是全局对象的引用。
  11. 调用构造函数时,会隐式的 return this ,也就是说会隐式的返回一个对象。如果显式的 return 一个对象,那么会将这个对象作为返回值(忽略本该返回的对象)。如果 return 的是一个基本类型的值(比如数值),会被无视,从而返回原本的对象。若无特殊要求,建议避免在构造函数使用 return 语句。
  12. delete 操作符不能删除用 var 显式声明的变量,也不能删除从原型继承而来的成员(删除原型来的成员会返回 true 值,看起来好像真的成功删除了),但可以删除隐式声明(不使用 var)的变量(估计没人会这么做吧)。
  13. 因为变量会提升至所在作用域的顶端,为了避免出错,建议一开始便把变量都声明在作用域顶端。这样做只使用一个 var 就可以了,顺便节约了些字节(好稀罕)。
  14. 枚举对象推荐使用 for in 或 for each in 语句,枚举数组推荐使用 for 循环。特殊情况例外。
  15. 当使用 new 操作符来创建一个数组时(new Array()),传递一个参数且为数值时,它的含义是数组的长度,比如 new Array(5);// 创建 length 为 5 的数组 。2 个参数以上时,认作数组的元素。
  16. 复制数组时,有深复制和浅复制两种。深复制是一种完全的复制,如果该对象的属性还引用了其它对象,则那些对象也会一起被复制。而浅复制则只会复制属性值以及元素值,并不会复制相关的引用对象。通过 从 concat()方法 以及 slice() 方法进行的复制都是浅复制。
  17. document.getElementById() 是只存在于 Document 对象的方法。ducoment.getElementsByTagName() 则是同时存在于 Document 对象 与 Element 对象的方法。通俗点来说,getElementsByTagName() 方法既可以从文档中遍历查找 (document.getElementsByTagName()),也可以从某个元素中遍历查找(div.getElementsByTagName())。
  18. getElementsByTagName() 方法获得的对象是一个 NodeList 对象,不是一个单纯的节点对象的数组。而 NodeList 对象的一大特征就是它是一个 Live 对象,Live 对象的特点与数组的 length 属性相似,所以当为页面增加某个节点时,不用再次调用 getElementsByTagName() 方法来获得新的节点列表。
  19. 使用 firstChild 等节点方法来获得元素节点时,当小心空白符也会作为文本节点来处理。获得元素节点更直接的方法就是使用元素节点方法,如:firstElementChild() 等方法。
  20. 通过 querySelectorAll() 方法取得的对象不同于通过 getElementsByTagName() 方法或 childNodes 属性等方式所取得的 NodeList 对象,通过 querySelectorAll() 方法取得的是一个 staticNodeList 对象,它们的区别在于,更改对象之后是否会将该更改反映于 HTML 文档中,顾名思义,当你在页面添加某个节点时,需要再次调用 querySelectorAll() 方法来获得新的节点列表。
  21. 如果事件处理程序返回 false 值,则会取消该事件的默认行为(比如提交表单时,返回 false 值会阻止提交)。
  22. 通过在 HTML 标签中(<button onclick="">)或在 DOM 元素中(btn.onclick = function (){}) 只能添加一个事件操作。想要多添加几个事件得使用 addEventListener() 方法(在 IE 中使用 attachEvent())。
  23. 一般情况,在事件处理程序中的 this 所引用的对象是设定了该事件处理程序的元素。

小结:这是俺阅读《JavaScript编程全解》时所断断续续写下来的一些比较基础的笔记。花了 5 天时间, 终于将前面基础的 200 多页慢慢(龟速)的看完(后面的都是些什么 JQery, HTML5, node.js 之类的),此番复习,收获甚微。鸡肋啊鸡肋,食之无肉,弃之不舍。好了,见笑了!如果上面有出错的地方,请诸位不吝赐教。

posted @ 2015-10-31 15:34  微日月  阅读(256)  评论(0编辑  收藏  举报