.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 只能删除属性), 而不是删除明确定义的全局变量.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,077评论 19 139
  • 【第二天早上】收获是自己努力的,也有小伙伴的互助。 【握紧拳头游戏】分享一下你刚刚的用了什么方法打开了伙伴的拳头?...
    范秀红阅读 3,590评论 0 2
  • 你知道吗?乳腺癌已經成为威胁女性健康的"头号杀手"了,随着經濟越來越發達,人们生活方式也隨之而改变,但是乳腺癌的发...
    mmmnibnn阅读 3,056评论 0 0
  • 文芾 风像一把剃须刀吹过我的脸和深秋的树 我的脸和树的脸干净得能看见皮下的骨骼在动 虽然我和树一直站着未曾说话 但...
    徐文显阅读 2,224评论 0 6
  • 有时候真的挺讨厌字体的 看不到表情 感受不到语气 有的只是无尽的猜测 真的挺累的
    叶公子哥哥阅读 1,009评论 0 0

友情链接更多精彩内容