Javascript知识整理

一、类型和变量

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属性有三个特殊行为:

  1. 如果为一个数组元素赋值,它的索引超出或等于当前长度时,length自动变为 n + 1
  2. 当length被赋值小于当前数组长度时,数组会被截取
  3. 当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 }
原文地址:https://www.cnblogs.com/sunken/p/4387489.html