JavaScript高级程序设计学习笔记(1)

  1. <script>放在head中会先执行 如果执行慢页面出现空白影响页面加载 建议放在 body中。
  2. defer 页面解析后执行 浏览器立即加载 延迟执行 不一定按顺序执行 确保脚本直接互不依赖 在XHTML 文档中,要把defer 属性设置为defer="defer"
  3. async 异步加载 确保加载期间不修改DOM, 在XHTML 文档中,要把async 属性设置为async="async"。
  4. //<![CDATA[     //]]> XHTML中写JavaScript 避免被解析
  5.  如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。  如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。  如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前
  6. null == undefined  任何值与NaN比较都是false NaN   (===和!== 全等不全等 比较前不做类型转换  '1'==1 true '1'===1 false switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如, 字符串"10"不等于数值10)
  7. 推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。否则,如 果函数有时候返回值,有时候有不返回值,会给调试代码带来不便。
  8. JavaScript 没有块级作用域,对于有块级作用域的语言来说,for 语句初始化变量的表达式所定义的变量,只会存在于循环的环 境之中。而对于JavaScript 来说,由for 语句创建的变量i 即使在for 循环执行结束后,也依旧会存在于循环外部的执行环境中。
  9. 判断基本类型 操作符 typeof 引用类型使用 instanceof 
  10. 数组方法
    1. 栈方法 后进先出 push()推入 pop()弹出  队列方法 先进先出  重排序 reverse()  sort(比较函数) concat()组合  slice(start,end) 返回起始位置的数组   删除splice(start,end) 插入splice(位置,个数,数组) 替换 splice(位置,1,数组)
    2. 迭代方法
      1. every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。  var everyResult = numbers.every(function(item, index, array){ return (item > 2); });
      2. filter():对数组中的每一项运行给定函数,返回该函数会返回true 的项组成的数组。
      3. forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
      4. map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
      5. some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
      6. 以上方法都不会修改数组中的包含的值。
    3. ECMAScript 5 还新增了归并方法 var values = [1,2,3,4,5];  var sum = values.reduce(function(prev, cur, index, array){ return prev + cur; }); alert(sum);  //15
  11. 正则
    1. var pattern = '/.cat/';   pattern.exec(str);   var reg=  new RegExp("/.cat/");  str.test()
    2. var expression = /pattern/ flag;  flag( g:全局找到之后继续找  i:忽略大小写 m:多行查找)
  12. 函数实际上是对象
    1. 没有重载  
    2. 函数声明   function name(){} 执行任何代码之前可用    函数表达式  var name = function(){}  在代码之前调用会报错  unexpected identifier  意外标示符
    3. 作为值的函数   将一个函数作为另一个函数的返回值返回   例子 根据对象的属性对数组排序  function compare(propertybyname) { retrun function (object1,object2){ var value1 = object1[propertybyName];  } }。
    4. 函数内部属性  arguments this  callee指向拥有这个arguments对象的函数(可以实现递归调用 而外面的函数名可以改变)
    5. 每个函数非集成的方法call (运行函数的作用域,参数1,参数2)和apply(运行函数的作用域,数组参数或arguments)
  13. 单体内置对象:不依赖于宿主环境的对象  Array String Global  Math 
    1. Global  encodeURI  不会对本身属于URL的特殊字符编码 如/  encodeURLComponent 对所有特殊字符编码 后者用的更多 对参数进行编码
    2. eval() 方法就像一个ECMAScript解析器  一个参数 把字符串 解析 将执行结果插入到原位置
  14. 原型模式:
    1. Person.prototype 指向 原型对象  而 Persion.prototype.constructor 又指回了 Persion
    2. 两个实例都包含内部属性 Prototype 指向Person.prototype 原型对象 换句话说 他们与构造函数没有直接关系,两个实例不包含属性和方法 却可以调是通过查找对象属性的过程来实现的。
    3. 原型的动态性 动态改变原型中的属性 实例中能马上看到 ,但是如果重写原型就不可以了 因为实例还是指向最初的原型
    4. 原型对象的最大问题就是  所以属性是被实例共享的 
    5. 组合使用构造函数和原型模式创建对象  不变的放在原型中 变化的放在构造函数中
    6. 寄生模式 创建一个函数 函数的作用封装创建对象的代码 然后返回新创建的对象    不好的地方 不能通过 instancesof 判断对象类型  可以使用其他模式不要使用这种模式 
    7. 原型链
      1. SubType的原型对象的 原型不是object 而是给他换了一个新原型 SuperType的实例 不但拥有SuperType的全部属性和方法 内部还有一个指针,指向了SuperType 原型。
      2. 不能使用 对象字面量创建原型方法,因为对象字面量会重写原型方法 导致找不到要继承的父类了。(对象字面量创建 SubType.prototype = { getSubValue : fucntion(){},someotherMethod:funciton(){} })
      3. 原型链的问题 还是引用 被实例共享 一但原型中的属性被修改 在其他实例中也会受影响
      4. 不能向超类的构造函数中传参数 原型链很少单独使用
      5. 在子类的构造方法 通过 SuperType.call()的方式调用父类的构造方法  这个每个SubType实例都有自己的 数据副本了  function subtype(){ SuperType.call()  }   var instances = new subtype()    还可以传递参数  SuperType.call(this,参数)  
      6. 借用构造函数问题 如果方法都在构造函数中定义,函数复用也就不存在了,很少单独使用 
      7. 组合继承   原型链和借用构造函数结合  function subtype(){ SuperType.call()  }  var instances = new SuperType();  instances.prototype.constructor = subtype     


    
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值