一、类型和变量
1. js中数据类型分为两类:原始类型和对象类型。原始类型包括数字、字符串和布尔值
2. 对象是属性的集合,每个属性都由键值对构成。
3. 字符串是由字符组成的数组,它是不可变的
4. 在任何使用二进制浮点数的编程语言,都会遇到浮点精度问题。使用大整数进行重要计算可以减小误差(更细小的单位)
5. 两个date对象可以进行加减法以计算时间
6. 数字和字符串并不是对象,但他们拥有方法。原因是当调用他们的方法时,会自动执行 new String/Number来生成一个临时对象。当引用结束,临时对象将被销毁
7. 如果想进行对象/数组复制,必须显式复制对象的每个属性或数组的每个元素。同样的如果要比较两个单独的对象或数组,也需要如此
8. js中没有块级作用域(直到ES 5),只有函数作用域和全局作用域
9. 在函数中,变量的声明会被提前至函数顶部,但初始化仍在原来的位置。这被称为“声明提前”
10. 当声明全局变量时,其实是定义了全局对象的一个属性,所以可以使用delete删除它们
11. 当定义一个函数时,其实保存了一个作用域链。当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加到保存的那个作用域链上。同事创建一个新的更长的表示函数调用作用域的“链”
二、表达式和运算符
1. 严格相等运算符 “===” 首先计算其操作数的值,比较过程没有任何类型转换
2. NaN与任何指都是不相等的,包括它自身
3. instanceof操作符希望左侧是一个对象,右侧是标识对象的类。如果左侧对象是右侧类的实例,则返回true
4. eval() 只有一个参数,如果传入的参数不是字符串,它直接返回这个参数,如果参数是字符串,它会把字符串当成js代码进行编译。如果编译成功,则开始执行这段代码,并返回字符串中最后一个表达式或语句的值
5. typeof放在单个操作数的前面,操作数可以是任意类型。返回表示操作数类型的一个字符串
6. delete是一元操作符,用来删除对象的属性或数组的元素
三、语句
1. 使用var name = function 和 直接使用function 声明的函数有一点区别,使用函数声明语句定义的函数会被提前,无论函数定义还是函数体,它对整个作用域都是可见的。而使用函数定义表达式声明的函数则只有声明被提前(与var声明变量一致)
2. switch后面的expression判断是使用 “===” 进行比较的
3. 抛出异常时,Javascript解释器会立即停止当前正在执行的逻辑,并跳转到就近的异常处理程序。如果抛出异常的函数没有异常处理程序,异常会沿着Javascript方法的词法结构和调用栈向上传播。如果没有找到任何异常处理程序,Javascript将把异常当做错误来处理,并报告给用户。
4. with对象是用来扩展作用域链,绝大多数情况下都不应该使用
四、对象
1. 除了字符串、数字、true、false、null和undefined之外,Javascript中的所有值都是对象
2. 除了名字和值之外,每个属性还有一些与之相关的值。成为“属性特性”
3. 可以通过直接量、关键字new和Object.create() 函数来创建对象
4. Object.create() 是一个静态函数,使用它的方法是传入所需的原型对象
var child = Object.create(father)
5. 可以通过Object.create(null) 来创建一个没有原型的新对象,但通过这种方式创建的对象没有继承任何基础方法,例如toString()。也就是说它不能和 “+” 运算符一起正常工作
6. 如果想创建一个普通的空对象,可以使用{} 或 new Object() 或 Object.create(Object.prototype)
7. 可以通过对象直接读取原型中的属性,但给这个属性赋值并不会影响原型中的值
8. delete运算符只能删除自有属性,不能删除继承属性
9. 可以使用对象的hasOwnProperty() 方法来检测给定的名字是否是对象的自有属性,对于继承属性它将返回false
10. propertyIsEnumerable() 是hasOwnProperty()的增强版,只有检测到自有属性,并且这个属性可枚举时才会返回true
11. 每个对象都有原型、类和可扩展性
12. ES 5提供了内置函数JSON.stringify() 和JSON.parse() 用来序列化和还原Javascript对象
五、数组
1. Javascript数组是无类型的,数组元素可以是任意类型,并不一定是常亮,也可以是变量
2. Javascript数组是动态的,根据需要他们会增长或缩减
3. Javascript数组可能是稀疏的,数组元素的索引不一定是连续的,他们之间可以有空缺
4. 足够稀疏的数组通常在实现上比稠密的数组更慢、内存利用率更高,在这样的数组中查找元素的时间与常规对象属性的查找时间一样长
5. 数组的length属性有三个特殊行为:
- 如果为一个数组元素赋值,它的索引超出或等于当前长度时,length自动变为 n + 1
- 当length被赋值小于当前数组长度时,数组会被截取
- 当length被赋值大于当前数组长度时,数组不会默认添加新的元素,只是在尾部留出一段空白区域
6. Array.push() 方法向数组末尾添加一个元素,使用Array.pop() 可以删除末尾的一个元素,数组索引会自动维护
7. Array.unshift() 方法向数组顶部添加一个元素,使用Array.shift() 可以删掉数组的第一个元素,数组索引会自动维护
8. Array.json() 方法,用于将数组中的所有元素转为字符串并连在一起,默认使用 “,” 连接。也可以传入连接符。
9. Array.reverse() 方法将数组中的元素颠倒顺序,返回逆向的数组。它采用替换,原数组将被改变
10. Array.sort() 方法将数组中的元素排序并返回排序后的数组,当不带参数调用sort() 时,数组元素以字母表顺序排序
11. Array.concat() 方法创建并返回一个新数组,它的元素包括调用concat() 的原始数组,和concat() 的每个参数
var a = [1, 2, 3]
a.concat(5, 6) // a = [1, 2, 3, 5, 6]
12. Array.slice() 方法返回数组的一个片段,它返回索引从第一个数字到但不包含第二个数字的数组
13. Array.splice() 的前两个参数指定了需要删除的数组元素,从第三个参数开始,将依次插入以参数1为索引的位置
var a = [1, 2, 3]
a.splice(1, 0, 'a', 'b', 'c') // a = [1, 2, 'a', 'b', 'c', 3]
14. ES 5中可以使用Array.isArray() 函数来判断该对象是否为数组。ES 3中的 isArray() 函数的代码如下:
1 var isArray = Function.isArray || function(o) { 2 return typeof o === 'object' && 3 Object.prototype.toString.call(o) === '[object Array]' 4 }
五、函数
1. 当方法不需要返回值时,最好就是返回它本身(this),这样就可以进行 “链式调用”
2. 在调用函数时,如果传入的实参比函数声明时所指定的形参要少,则缺省的形参将被赋值为undefined
3. 函数对象可以通过作用域链联系起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中被称为“闭包”
4. 从技术的角度讲,所有的Javascript函数都是闭包,他们都是对象,他们都关联到作用域链
5. 如果函数定义了嵌套的函数,并将它作为返回值返回或存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数。他不会被当做垃圾回收,并且它所指向的变量绑定对象也不会被当做垃圾回收
6. 函数体内的arguments.length表示传入函数的实参的个数,函数对象本身的length属性则表示形参的个数
7. call() 和 apply() 都用来调用方法,第一个参数都是this,区别在于第二个参数,apply传入的是数组,而call则直接传入参数列表。
以对象o的方法形式调用函数f(),可以写成这样:
f.call(o, 1, 2)
f.apply(o, [1, 2])
8.ES 5 中的bind() 方法可以将函数绑定至某个对象,在ES 3中可以轻松模拟:
1 function bind(f, o) { 2 if (f.bind) { 3 4 return f.bind(o) 5 6 } else { 7 8 return function() { 9 10 return f.apply(o, arguments) 11 } 12 } 13 }
六、Cookie
1 /* 2 功能:保存cookies函数 3 参数:name,cookie名字;value,值 4 */ 5 setCookie: function(name, value) { 6 var Days = 360 //cookie 将被保存两个月 7 var exp = new Date() //获得当前时间 8 exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000); //换成毫秒 9 document.cookie = name + "="+ escape(value) + ";expires=" + exp.toGMTString() + ";path=/;domain=.sunken.me" 10 }, 11 /* 12 功能:获取cookies函数 13 参数:name,cookie名字 14 */ 15 getCookie: function(name) { 16 var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)")) 17 if (arr != null) { 18 return unescape(arr[2]) 19 } 20 return null 21 }, 22 /* 23 功能:删除cookies函数 24 参数:name,cookie名字 25 */ 26 delCookie: function(name) { 27 var exp = new Date() //当前时间 28 exp.setTime(exp.getTime() - 3600) 29 var cval = this.getCookie(name) 30 if (cval!=null) document.cookie=name + "="+escape(cval)+";expires="+exp.toGMTString() + ";path=/;domain=.sunken.me" 31 }