blackLearning.github.io
blackLearning.github.io copied to clipboard
js语言精髓与编程实践笔记
js语言精髓与编程实践笔记
一、语法
1.1 基础语法
- 当'\'反斜杠字符出现在一行的末尾时,也用于连续的字符串声明,这在声明大段文本时很有用。
- \0表示NUL字符。虽然显示为空值,但是是真是存在的值。
- ()既是语法分隔符也是运算符。
- 变量声明语句与赋值表达式存在根本的不同:声明中的=是语句的语法分隔符,是可以省略的,而表达式中的=是不能省略的。
- 函数调用:
(function(){})(); // 1
(function(){}()); // 2
void function(){}(); // 3
- 第一种方法的开始括号是强制运算符,返回的是函数自身,然后进行函数最后面的括号调用。
- 第二种方法的开始括号也是强制运算符,但返回的是运算结果,因为函数调用符包在括号里面对函数进行调用了。
1.2 面向对象语法精要
- 创建对象实例的三种方法。
- 通过构造器利用this引用来初始化。
- 同构构造原型实例来初始化。
- 通过Object.create()并使用属性描述符的方式来构建对象并初始化。
第一种也就是最常用的new+构造函数的方法。语法中,当参数表为空时和没有参数表是一致的。
因此:
obj = new Constructor;
obj = new Constructor();
// 上面两行代码是一样的。
// 后面的括号并不是函数调用的括号。
- 对象直接量声明
对象的属性名可以用一个简单的标识符来表示,当使用关键字时也可以用加上引号用字符串来表示。
- 对象成员
delete不能删除var声明的变量和直接继承自原型的成员。 检查一个对象是否具有某个成员,直接使用In运算符。
- 严格模式
- 禁止在对象直接量声明中,存在相同的属性名。
- 在函数声明中,禁止参数表中带有相同的参数名。
- 禁止使用delete删除显式声明的标识符,名称或具名函数。
二、JS的非函数式语言特性
ES5中可定制的对象属性
一、
-
属性描述符 writable: 是否可以重写 enumerable: 是否可以枚举 configurale: 是否可以重新配置
-
存取属性描述符 get: function() {...}// 取值函数 set: function() {...}//赋值函数
-
数据属性描述符: 使用直接量形式声明或添加属性时,会初始化一个数据描述,它包括两个性质:value和writable,writable是true,enumerable和configurable默认是true,且无法自定义。。。...即总是可以读写的,可以重配置,可以使用forin枚举遍历的。 存取属性描述符: 如果使用ES5的新方式,(即用get function() {}和set(newValue)function(){}方式声明),会初始化一个存取描述符。此时除非显式声明,否则enumerable和configurable默认是false.... ps: get,set和value,writable之间无法同时存在!!
二、定制对象属性
- 可以使用直接向对象的一个’不存在的属性‘赋值,来声明一个新属性。并获得一个默认的、类似直接量所使用的属性描述符。(即value和writable)。也可以使用Object.defineProperty()方法来添加一个新属性并定制属性描述符,
- defineProperty(obj,name,desc);声明一个属性
- defineProperties(obj, props)为对象声明一组属性
- getOwnPropertyDescriptor(obj)获取队形的属性描述符列表
- Object.create()创建一个对象
在回顾此前的原型继承的观念,它在本质上市复制原型,在这个思路上,构造器函数本身是无意义的。更确切的说,构造器函数对实例的修饰作用可有可无。因此ES5实现了object.create()这样一种更简单的方法。 用法: newObj = Object.create(prototypeObj, PropertyDescriptors)
prototypeObj是新对象所要继承的对象,PropertyDescriptors是新添加的属性,与defineProperties的props用法一样。 3.属性状态维护
- getOwnPropertyNames(obj)// 取得对象自有的属性名数组
- keys(obj)// 取得对象自身、可见的属性名数组
- preventExtensions(obj) //使得obj不能添加新属性
- seal(obj)// 不能添加也不能删除属性
- freeze(obj) 不能修改添加删除属性
- 取属性列表
- for in方法:总是得到该对象的全部的可枚举的(enumerable为true)属性列表,包括继承而来的。
- **object.keys(obj)**方法,得到自身的可枚举的属性名数组,不包括继承而来的。
- **object.getOwnPropertyNames(Obj)**方法,列举所有自身的属性名数组,无论其可枚举还是不可枚举。。
二、JS的函数式语言特性
连续求职是函数式语言的基本特征。
- 学会优雅的使用||和三元表达式进行赋值运算。
- 用三元表达式代替简单的If判断
- 函数是消减循环语句的一个必要补充,也是一种消减代码复杂性的组织形式。
- js是非惰性求值。。
三、js的动态语言特性
- 动态执行:eval
- 动态方法调用: call: - 严格模式下,如果call和apply的第一个参数传入null和undefined,则this将任然指向null和undefined,可能导致异常。
- 类型转换
- 有且只有NaN是自身不等值
- 有且只有空字符串能转换为false,其他的字符串在转换后都会得到true。
四、一般性的动态函数式语言技巧
- 识别new运算进行的构造器调用:
- 识别当前函数是否使用new原酸来构建实例:
if(this instanceof arguments.callee || this.constructor === arguments.callee) {
// 是new运算
}else {
// 是普通函数调用
}
- 识别当前函数是否是作为方法调用:
if(this === window) {
// 是方法调用
}else {
// 是普通函数调用
}
-
在js中,布尔运算并不严格的返回true or false,而是返回布尔短路中的最后一次的表达式的值。这样我们就可以用三元运算符或者是&& || 来消减if语句。
-
钩子函数,是指模拟原始函数的功能与接口,在原始函数执行前、执行后增加一些特殊功能或检测代码的技术。