blackLearning.github.io icon indicating copy to clipboard operation
blackLearning.github.io copied to clipboard

js语言精髓与编程实践笔记

Open Fadingvision opened this issue 7 years ago • 0 comments

js语言精髓与编程实践笔记


一、语法

1.1 基础语法

  1. 当'\'反斜杠字符出现在一行的末尾时,也用于连续的字符串声明,这在声明大段文本时很有用。
  2. \0表示NUL字符。虽然显示为空值,但是是真是存在的值。
  3. ()既是语法分隔符也是运算符。
  4. 变量声明语句与赋值表达式存在根本的不同:声明中的=是语句的语法分隔符,是可以省略的,而表达式中的=是不能省略的。
  5. 函数调用:
(function(){})(); // 1
(function(){}()); // 2
void function(){}(); // 3
  • 第一种方法的开始括号是强制运算符,返回的是函数自身,然后进行函数最后面的括号调用。
  • 第二种方法的开始括号也是强制运算符,但返回的是运算结果,因为函数调用符包在括号里面对函数进行调用了。

1.2 面向对象语法精要

  1. 创建对象实例的三种方法。
  • 通过构造器利用this引用来初始化。
  • 同构构造原型实例来初始化。
  • 通过Object.create()并使用属性描述符的方式来构建对象并初始化。

第一种也就是最常用的new+构造函数的方法。语法中,当参数表为空时和没有参数表是一致的。

因此:

obj = new Constructor;
obj = new Constructor();
// 上面两行代码是一样的。
// 后面的括号并不是函数调用的括号。
  1. 对象直接量声明

对象的属性名可以用一个简单的标识符来表示,当使用关键字时也可以用加上引号用字符串来表示。

  1. 对象成员

delete不能删除var声明的变量和直接继承自原型的成员。 检查一个对象是否具有某个成员,直接使用In运算符。

  1. 严格模式
  • 禁止在对象直接量声明中,存在相同的属性名。
  • 在函数声明中,禁止参数表中带有相同的参数名。
  • 禁止使用delete删除显式声明的标识符,名称或具名函数。

二、JS的非函数式语言特性

ES5中可定制的对象属性

一、

  1. 属性描述符 writable: 是否可以重写 enumerable: 是否可以枚举 configurale: 是否可以重新配置

  2. 存取属性描述符 get: function() {...}// 取值函数 set: function() {...}//赋值函数

  3. 数据属性描述符: 使用直接量形式声明或添加属性时,会初始化一个数据描述,它包括两个性质:value和writable,writable是true,enumerable和configurable默认是true,且无法自定义。。。...即总是可以读写的,可以重配置,可以使用forin枚举遍历的。 存取属性描述符: 如果使用ES5的新方式,(即用get function() {}和set(newValue)function(){}方式声明),会初始化一个存取描述符。此时除非显式声明,否则enumerable和configurable默认是false.... ps: get,set和value,writable之间无法同时存在!!

二、定制对象属性

  1. 可以使用直接向对象的一个’不存在的属性‘赋值,来声明一个新属性。并获得一个默认的、类似直接量所使用的属性描述符。(即value和writable)。也可以使用Object.defineProperty()方法来添加一个新属性并定制属性描述符,
  • defineProperty(obj,name,desc);声明一个属性
  • defineProperties(obj, props)为对象声明一组属性
  • getOwnPropertyDescriptor(obj)获取队形的属性描述符列表
  1. 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) 不能修改添加删除属性
  1. 取属性列表
  • for in方法:总是得到该对象的全部的可枚举的(enumerable为true)属性列表,包括继承而来的。
  • **object.keys(obj)**方法,得到自身的可枚举的属性名数组,不包括继承而来的。
  • **object.getOwnPropertyNames(Obj)**方法,列举所有自身的属性名数组,无论其可枚举还是不可枚举。。

二、JS的函数式语言特性

连续求职是函数式语言的基本特征。

  1. 学会优雅的使用||和三元表达式进行赋值运算。
  2. 用三元表达式代替简单的If判断
  3. 函数是消减循环语句的一个必要补充,也是一种消减代码复杂性的组织形式。
  4. js是非惰性求值。。

三、js的动态语言特性

  1. 动态执行:eval
  2. 动态方法调用: call: - 严格模式下,如果call和apply的第一个参数传入null和undefined,则this将任然指向null和undefined,可能导致异常。
  3. 类型转换
  • 有且只有NaN是自身不等值
  • 有且只有空字符串能转换为false,其他的字符串在转换后都会得到true。

四、一般性的动态函数式语言技巧

  1. 识别new运算进行的构造器调用:
  • 识别当前函数是否使用new原酸来构建实例:
if(this instanceof arguments.callee || this.constructor === arguments.callee) {
    //  是new运算
}else {
    //  是普通函数调用
}
  • 识别当前函数是否是作为方法调用:
if(this === window) {
    //  是方法调用
}else {
    //  是普通函数调用
}
  1. 在js中,布尔运算并不严格的返回true or false,而是返回布尔短路中的最后一次的表达式的值。这样我们就可以用三元运算符或者是&& || 来消减if语句。

  2. 钩子函数,是指模拟原始函数的功能与接口,在原始函数执行前、执行后增加一些特殊功能或检测代码的技术。

Fadingvision avatar Aug 14 '17 15:08 Fadingvision