读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")

数组长度

特性

  1. 在尾位置 i 增加一个元素时,数组长度变为 i+1
  2. 当数组长度 -1 时,数组的第 i 位置的元素将被删除

增加和删除

增加元素

  1. 直接设置属性值
  2. push() // 尾增加
  3. unshift() // 首增加

删除元素

  1. delete
  2. pop() // 尾删除
  3. 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”是数组的一个‘会走路’特征
posted @ 2016-09-07 19:12  -浮云骑士-  阅读(790)  评论(0编辑  收藏  举报