- 使用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一个类,都会生成一个函数); 产生闭包.
- 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 只影响当前对象, 不会递归影响到继承链上.
- 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 只能删除属性), 而不是删除明确定义的全局变量.
网友评论