美文网首页程序员
.net 程序员应该知道的javascript 知识(1) :

.net 程序员应该知道的javascript 知识(1) :

作者: 沪上最强亚巴顿 | 来源:发表于2015-11-02 18:53 被阅读55次
    • 使用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) :

        本文链接:https://www.haomeiwen.com/subject/xwsqhttx.html