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