ES5笔记
- use strict
严格模式:ECMAScript 中定义了语言的严格变体。语言的严格变体,排除了 ECMAScript 语言的某些特定的语法和语义特征,还修改了某些功能的详细语义。严格变体还指定了必须抛出错误异常报告的额外错误条件,即使在非严格的语言形式下这些条件不属于错误。 - 原生对象
原生对象:内置对象+宿主对象
内置对象:由 ECMAScript 实现提供,独立于宿主环境的对象,ECMAScript 程序开始执行时就存在。
宿主对象:由宿主环境提供的对象,用于完善 ECMAScript 执行环境。 - 基本类型
null、undefined、boolean、string、number - 引用类型
Object类型、Array类型
Object类型:
Object:数据属性<–named data property–>、访问器属性<–named accessor property–>(get、put进行取值和赋值)、内部属性(internal property)
javascript的方法分为三类:对象方法(需要生成实例才能实现,可继承)、类方法(不需要生成实例就可以实现,不可继承)、原型方法(主要是对系统对象进行扩展,例如array类型的通常没有可用的方法,就可以创建原型方法赋予数组方法,可继承)
数据属性:
特征名称 | 取值 | 描述 |
---|---|---|
[[value]] | 任何ES语言类型 | 通过property来取值 |
[[writeable]] | boolean类型 | 若为false,赋值操作会失败 |
[[Enumerable]] | boolean类型 | 若为true,可被for in枚举,若为false,则不可枚举 |
[[Configurable]] | boolean类型 | 若为false,改变它的attributes(value特殊)会失败 |
访问器属性:
特征名称 | 取值 | 描述 |
---|---|---|
[[get]] | Object或者undefined | 如果该值是一个Object对象,每次有对该属性进行 get 访问时,该函数的内部方法 [[Call]]会被一个空参数列表调用,以返回该属性值 |
[[set]] | Object或者undefined | 如果该值为一个 Object 对象,那么它必须是一个函数对象。每次有对该属性进行 set 访问时,该函数的内部方法 [[Call]]会被一个参数列表调用,这个参数列表包含分配的值作为唯一的参数。property 的内部方法 [[Set]] 产生的影响可能会,但不是必须的,对随后的 property 内部方法 [[Get]] 的调用返回结果产生影响 |
[[Enumerable]] | boolean | 决定是否可被枚举 |
[[Configurable]] | boolean | 如果为 false,试图删除该属性,改变该属性为访问器属性,或改变它的 attributes(和 [[Value]] 不同),都会失败 |
(访问器属性和数据属性的默认参数值:
特性名称 | 参数值 |
---|---|
[[value]] | undefined |
[[get]] | undefined |
[[set]] | undefined |
[[Writable]] | true |
[[Enumerable]] | true |
[[Configurable]] | true |
)
内部属性:
内部属性 | 取值 | 说明 |
---|---|---|
[[prototype]] | object或null | 此对象的原型 |
[[class]] | String | 说明规范定义的对象分类的一个字符串值 |
[[Extensible]] | boolean | 说明是否可为对象添加自身属性 |
[[Extensible]] | SpecOp(propertyName) → any | 返回命名属性的值 |
[[GetOwnProperty]] | SpecOp (propertyName) → Undefined 或 Property Descriptor | 返回此对象的自身命名属性的属性描述,如果不存在返回 undefined |
[[GetProperty]] | SpecOp (propertyName) → Undefined 或 Property Descriptor | 返回此对象的完全填入的自身命名属性的属性描述,如果不存在返回 undefined |
[[Put]] | SpecOp (propertyName, any, Boolean) | 将指定命名属性设为第二个参数的值。flog 控制失败处理。 |
[[CanPut]] | SpecOp (propertyName) → Boolean | 返回一个 Boolean 值,说明是否可以在 PropertyName 上执行 [[Put]] 操作。 |
[[HasProperty]] | SpecOp (propertyName) → Boolean | 返回一个 Boolean 值,说明对象是否含有给定名称的属性。 |
[[Delete]] | SpecOp (propertyName, Boolean) → Boolean | 从对象上删除指定的自身命名属性。flog 控制失败处理 |
[[DefaultValue]] | SpecOp (Hint) → primitive | Hint 是一个字符串。返回对象的默认值 |
[[DefineOwnProperty]] | SpecOp (propertyName, PropertyDescriptor, Boolean) → Boolean | 创建或修改自身命名属性为拥有属性描述里描述的状态。flog 控制失败处理。 |
所有的对象都有一个内部属性[[prototype]],此对象的值是一个Null或者一个对象,并且用它实现继承,一个原生属性是否可以把宿主对象作为它的prototype,取决于实现,并且所有的prototype链都是有限长度的
所有对象都有一个[[Extensible]] 的内部属性,一旦这个属性更改为false,就无法修改未true,并且无法给对象添加命名属性,不得更改[[prototype]][[Class]]的值
注:ECMAScript语法和内置函数没办法修改prototype和class的值,并且无法将Extensible从false改为true
- 对象内部方法的算法:
GetOwnProperty(P){
let discription;
let x = findProperty(P);
if(x == 数据属性){
discription.[[value]]=x.[[value]];
discription.[[Writable]]=x.[[Writable]]
}
else if(x == 访问器属性){
discription.[[Get]] = x.[[Get]];
discription.[[Put]] = x.[[Put]];
}
return discription;
GetProperty(P){
let prop = GetOwnProperty(P);
let proto = prop.[[prototype]];
if()
}