读JavaScript权威指南-小结一
javascript 学习笔记
语句
跳转
标签:identifier: statement
- 标签可跳转
- break,当有需要跳出最近的循环体或者switch语句,将会用到标签
- continue
对象
属性的特性
数据属性的特性
- 值
- 可写性
- 可枚举性
- 可配置性
存取器属性的特性
- 读取
- 写入
- 可枚举性
- 可配置性
存取器属性
- get
- set
获得某个属性的特性
Object.getOwnPropertyDescriptor()
修改某对象的某属性的特性
Object.definePeoperty()
Object.definePeoperties()
原型属性
判断属性是否自有属性
object1.hasOwnProperty()
判断属性是否可被枚举
object1.propertyIsEnumerable()
获得对象的原型
Object.getPrototypeOf()
判断当前对象是否另一个的原型
object1.isPrototypeOf()
类属性
可传递对象的函数调用
call()
获得类型字符串
Object.prototype.toString // 可以获得类似于 [object class] 的字符串
截取字符串
str.slice()
可扩展属性
对象的可扩展属性指的是是否可以给对象添加新属性
判断对象是否是可扩展的
Object.isExtensible()
转换对象为不可扩展属性
Object.preventExtensions()
注意,一旦将对象转换为不可扩展之后,则无法再转换成可扩展
将对象的所有自有属性都设置为不可配置的,即不能删除属性和更改属性特性
Object.seal()
注意,同样被设置后不可解封
检测对象是否被封闭
Object.isSealed()
冻结对象,即除了具有上述功能外还会将自有的所有数据属性都置为只读
Object.freeze()
对象的序列化
JSON
- 全称,Javascript Object Notation,Javascript对象表示法
序列化
JSON.stringify()
只能序列化对象可枚举的自有属性
还原
JSON.parse()
对象的toJSON()方法
JSON.stringify()将会调用对应的对象的toJSON()
valueOf()
将对象转换为某种原始值而非字符串时会调用
数组
特性
- 同数组元素种类不唯一
- 动态增长
- 索引稀疏,有空缺
与对象关系
- 即特殊的对象
- a[-1] 被转化为 a["-1"],浮点数类似
- length属性表示长度,当使用小于2^23 的非负整数作为属性时,自动维护length
继承
- 继承自 Array.prototype
创建
使用数组直接量
- 元素可以使用变量
- 被省略的数组直接量将被置为undefined,注意这种方法创建的数组并不是稀疏数组,这个元素是存在的
调用构造函数 Array()
- 空数组 new Array()
- 固定个数元素 new Array(10)
- 指定元素 new Array(1, 3, "haha")
数组长度
特性
- 在尾位置 i 增加一个元素时,数组长度变为 i+1
- 当数组长度 -1 时,数组的第 i 位置的元素将被删除
增加和删除
增加元素
- 直接设置属性值
- push() // 尾增加
- unshift() // 首增加
删除元素
- delete
- pop() // 尾删除
- shift() // 首删除
通用方法
splice()
遍历
for/in
- 不保证一定是顺序的
- 一般是升序的
- 如果同时含有对象属性和数组元素,一般是按创建顺序
length 按长度遍历
forEach()
- 可以传函数调用
数组函数
拼接数组元素字符串
- join()
- 是String.split()方法的逆向操作
将原数组逆序
- reverse()
排序
- sort()
- 无参,则按字母排序
- 排序函数参
用已有数组创建新数组
- concat()
获取子数组
- slice()
遍历数组中的元素作为指定函数参数,结果插入到新数组并返回
- map()
通过指定函数判断数组中的元素来获取数组的子集
- filter()
数组中的所有是否都满足条件
- every()
数组中是否存在元素满足条件
- some()
函数折叠操作
- 将数组中的元素结合,生成单个值
- reduce()
- reduceRight()
期望传入的实参个数
arguments.callee.length
函数调用
- call()
- apply()
函数绑定到对象
- bind() // 也可实现设置默认参数,即 ‘柯里化’
定义构造函数
- function关键字
- new Funtion()构造函数
函数式编程
使用函数处理数组
- reduce()
- map()
高阶函数
即操作函数的函数
- 接受函数作为参数
- 返回一个新的函数
记忆
当使用递归等操作时,使用记忆功能能节省开支
function memrosize(f){
var cache = {}
return function (){
var key = arguments.length + Array.prototype.join.call(arguments, ",")
if ( key in cache )
return cache[key];
else
return cache[key] = f.apply(this, arguments)
}
}
var leijia = memrosize(function(n){
console.log("run times")
return (n <= 1)? 1 : n*leijia(n-1);
});
console.log(leijia(5));
console.log(leijia(6));
类和模块
类和原型
- 直接创建个对象在创建函数中返回
- 同时设定对象的原型
类和构造函数
- 使用 new 关键字调用构造函数自动创建一个新的对象
- 因此构造函数只需初始化这个新对象的状态即可
- 所有使用这个构造函数创建出来的对象都以构造函数的 prototype 属性为原型
- 所以使用同一个构造函数初见出来的对象都具有相同的原型
判断某个对象是否某个类
obj instanceof classConstructFunc
- 实质是去判断对比对象和类构造函数的原型
constructor 属性
- 构造函数中的prototype原型属性是个对象
- 原型对象的 constructor属性指向了 类的构造函数
类继承
类静态成员
- 通过在构造函数外面追加构造的变量属性即为类静态成员属性
类方法
- 通过在构造函数外面追加构造的函数属性即为类静态方法
实例属性
- 通过在构造函数对象中添加的变量属性即为实例成员属性
实例方法
- 通过在类的原型中添加的函数属性即为实例方法
常量
- 约定命名使用大写字母
私有成员
- 约定命名使用前置下划线_
- 或者采用闭包模拟
类的扩充
- 通过给类的原型添加方法来做类的扩充
- 可以直接给类的原型增加属性
- 也可以对类的原型采用 Object.defineProperty(),这么做的目的是避免被枚举到
类和类型
识别对象
1. instanceof 运算符
- 判断一个对象是否处于继承链中
- 左操作数是对象
- 右操作数是构造函数,但是检测条件是构造的原型
- 缺点:无法通过对象来检测类名,只能检测对象是否是指定类的对象;多个上下文结果出错
2. constructor 属性
- 通过对比对象的 constructor属性和构造函数来判断
- 缺点:并不是所有的对象都具有 constructor 属性;多个上下文结果出错
3. 通过构造函数的名字
- 缺点:并不是所有构造函数都具有名字
4. 鸭式辩型
- 关注“对象能解决什么”,而非“对象是什么”
- 例如:“包含非负整数值是属性length”是数组的一个‘会走路’特征