• 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 }
  • 相关阅读:
    厂商前缀
    文本阴影和边框阴影
    2D转换
    overflow属性
    margin属性
    CSS圆角边框
    浮动定位
    文档流定位
    position属性
    选择器二
  • 原文地址:https://www.cnblogs.com/sunken/p/4387489.html
Copyright © 2020-2023  润新知