.net 程序员应该知道的javascript 知识(1) : 基础篇 (持续更新中...)

  • 使用apply/call 来借用其它类型的方法.
    • js 是弱类型的.
    • 在Array 上定义的方法, array-like 对象也可以调用.
      • array-like 对象: 以正整数作为keys, 并且含有length 属性. arguments 就是一个类数组对象.
      • 过滤掉第一个参数: var args = Array.prototype.slice.call (arguments, 1);
    • 类似地, 其它对象上定义的方法, 只要是符合该对象的特征(含有特定的属性)的对象, 就可以调用方法.
  • use strict模式下, this默认为undefined.
  • NodeJs 中的console.assert 一个快捷方式, 等同于require('assert').ok.
    • 常用于验证方法的输入参数.
    • 使用var assert = console.assert; 来创建assert 快捷方式.
  • console. info / log 的唯一区别是在浏览器中, info消息会有i图标前缀.
  • 不支持关联数组, 对象的元素名称为string, 数组的元素名称只能为number.
    • 避免使用new Array(), 直接[].
      • 因为其第一个参数会有歧义: 第一个数字类型的元素/长度.
    • typeof 数组 返回 object.
  • call 的主要用途是绑定this.
    • 在继承链中, 在子类构造函数中调用父类构造时, super.constructor.apply(this).
    • 使用匿名函数给实例添加新方法, 并指定实例为this 直接调用之.
    • apply() 可以使用arguments 来代表所有的实参.
    • bind() 将当期context 绑定到方法上, 之后再调用该方法. 用于异步回调和事件.
  • Object.defineProperty.
    • 通过=赋值新增的属性,其所有的descriptor=true(可写,可枚举..).
    • 通过该函数新增的属性, 默认是immutable,其所有的descriptor=false.
    • descriptor 分为 data + access. 一个descriptor只能是其中之一(不能同时含有两边的属性)
    • 修改configurable =false的属性会得到TypeError.
    • 而修改writable = false的属性, 不会有任何效果,也没有异常.
    • 使用自定义的getter/setter 可以在属性被读写时实现额外的逻辑.
  • 变量的提升
    • var 会在作用域(全局,方法)内"占"位置(无论定义在作用域的何处).
    • 也就是无论在作用域的何处定义的var, 都等同于在作用域的开头定义的.
  • JS 对浮点数的判等, 使用差值小于一个足够小的数来进行.
  • 函数中的变量
    • 局部变量, 只能在函数里访问 var id;
    • 实例属性, 通过对象.访问 this.age;
    • 类属性, 类似static Person.name;
  • 函数的独立性.
    • 可以在A函数内定义B函数, 但是B函数还是独立于A函数(有不同的this).
  • 空参数会被当做undefined 传递.
    • 所以弱类型没有重载, 后面会覆盖前面的定义,无论参数个数.
  • 在类(函数)中定义函数会导致: 性能低下(每new一个类,都会生成一个函数); 产生闭包.
    • 使用prototype 来解决.
  • Cookie的局限性:
    • 大小限制为4KB;
    • 会被包含在每次HTTP请求中;
    • 网络传输未加密.
  • Web Storage: Session 和Local. 包含在window对象中.
  • Buffer. 类似于数组,其元素是16进制的两位数.
    • 将JS的数据处理能力从字符串扩展到了任意二进制数据.
    • 字符串是只读的, 而Buffer像数组.修改会作用于源Buffer.
    • Buffer 和字符串在制定编码后,可以互相转换.
  • a==null 写作 null == a 只是为了防御性编程, 防止少写一个=的情况.
  • undefined 代表只声明但未赋值的变量, 其类型为undefined.
    • null 是代表没有值的值, 类型为object.
    • if(!a) 来进行判断.
  • delete 只影响当前对象, 不会递归影响到继承链上.
    • 仅在删除不能被删除的自身属性时返回false.
  • prototype链的最顶端是null.
    • o ---> Object.prototype ---> null.
    • a ---> Array.prototype ---> Object.prototype ---> null.
    • f ---> Function.prototype ---> Object.prototype ---> null.
    • 当继承的方法被执行时,this指向的是当前对象(多态).
    • prototype 是构造函数的一个属性, 而proto指向了原型链.
      • ( new Foo ).__proto__ === Foo.prototype;
      • ( new Foo ).prototype === undefined;
  • 模块
    • NodeJS是参照CommonJS 规范实现的.
    • 而对于浏览器环境, 不能同步load(网速慢时假死), 只能AMD(异步模块定义).
      • require([module], callback);
      • 模块的加载不影响其后面语句的运行, 所有依赖于该模块的语句, 都定义在一个回调函数中. 在加载完毕后,才会运行回调.
  • 链式赋值而隐式创建全局变量
function foo(){
  // =的优先级是从右到左, 所以会先执行b=0; 所以b 变成了全局变量.
    var a=b=0;
}
function foo(){
    var a,b;// 均为局部变量.
}
  • 隐式创建的全局变量并不是真正的全局变量, 而只是全局对象的属性.
    • 通过delete 可以删除隐式创建的全局变量(delete 只能删除属性), 而不是删除明确定义的全局变量.

你可能感兴趣的:(.net 程序员应该知道的javascript 知识(1) : 基础篇 (持续更新中...))