JS 中的 in 运算符
MDN 解释:
如果指定的属性在指定的对象或其原型链中,
则 in 运算符返回 true。
由上面的解释可以得出 in 判断的是属性是否存在。
in 操作符的右边必须是一个对象,而左边需要一个字符
串。当左侧传入的不是字符串时,则调用toString()转为
字符串。
ES6 中 constructor 属性 和 super 的作用
constructor 属性返回所有 JavaScript 变量的构造函数
super 不仅仅是一个关键字,还可以作为函数和对象使用
super 作为函数调用
当 super 作为函数调用时,它指向的父类构造函数,在
子类的构造函数中必须执行一次。
super 作为对象使用
super作为对象使用时,分为在普通方法中使用和在静态
方法中使用。
普通方法使用:super指向父类的原型,可以访问到原型
上的方法和属性。
静态方法使用:如果 super 作为对象,用在静态方法之
中,这是 super 将指向父类,而不是父类的原型对象。
JS 创建对象的七种方式
1. 工厂模式
function Person() {
var o = new Object();
o.name = 'hanmeimei';
o.say = function() {
alert(this.name);
}
return o;
}
var person1 = Person();
优点:完成了返回一个对象的要求
缺点:
1. 无法通过 constructor 识别对象
2. 每次通过 Person 创建对象的时候,所有的 say
方法都是一样的,但是却存储了多次,浪费资源。
2. 构造函数模式
function Person() {
this.name = 'hanmeimei';
this.say = function() {
alert(this.name);
}
}
var person1 = new Person();
优点:
1. 通过 constructor 或者 instanceof
可以识别对象实例的类别
2. 可以通过 new 关键字来创建对象实例
缺点:多个实例的 say 方法都是一样的实现效果,但是
却存储了很多次。
3. 原型模式
function Person() {
Person.prototype.name = 'hanmeimei';
Person.prototype.say = function() {
alert(this.name);
}
}
Person.prototype.friends = ['lilei'];
var person1 = new Person();
优点:
1. say 方法是共享的了,所有的实例的 say 方法
都指向同一个。
2. 可以动态的添加原型对象的方法和属性,并直接
反应在对象实例上。
缺点:
1. 所有的实例的属性都指向的是同一块存储区域。
2. 第一次调用方法或属性时会搜索两次,第一次在
实例上寻找,没有找到就取原型对象上找。
3. 所有的方法都是共享的,没有办法创建实例自己
的属性和方法,也就没有办法像构造函数那样传递参
数。
4. 构造函数和原型组合模式
function Person(name) {
this.name = name;
this.friends = ['lilei'];
}
Person.prototype.say = function() {
console.log(this.name);
}
var person1 = new Person('hanmeimei');
person1.say();
优点:
1. 解决了原型模式对于引用对象的缺点
2. 解决了原型模式没有办法传递参数的缺点
3. 解决了构造函数模式不能共享方法的缺点
缺点:通过字面量给Person.prototype进行赋值时会导致
constructor 改变,所以需要手动设置,其次就是通过字
面量给 Person.prototype 进行赋值,会无法作用在之前
创建的对象实例上。
5. 动态原型模式
function Person(name) {
this.name = name;
if (typeof this.say != 'function') {
Person.prototype.say = function() {
alert(this.name);
}
}
}
优点:
1. 可以在初次调用构造函数的时候就完成原型对象
的修改
2. 修改能体现在所有的实例中
6. 寄生构造函数模式
function Person(name) {
var o = new Object()
o.name = new Object();
o.name = name;
o.say = function() {
alert(this.name);
}
return o;
}
var person1 = new Person('hanmeimei');
优点:和工厂模式基本一样,除了多了个 new 操作符
缺点:和工厂模式一样,不能区分实例的类别
7. 稳妥构造模式
function Person(name) {
var o = new Object();
o.say = function() {
alert(name);
}
}
var person1 = new Person('hanmeimei');
person1.name
person1.say()
优点:安全,参数只能通过 say 方法去访问
缺点:不能区分实例的类别
JS 中数据类型检测的四种方式以及优缺点
JS 中数据类型检测的四种方式:
1. typeof [value]: 检测数据类型的运算符
2. [example] instanceof [class]:
检测某一个是否属于这个类
3. [example].constructor === [class]:
检测实例和类关系,从而检测数据类型
4. Object.prototype.toString.call([value]):
检测数据类型
闭包
官方说法:闭包就是指有权访问另一个函数作用域中的变
量的函数。
别人文章的理解:把函数执行,形成私有上下文,并且保
存和保护私有变量的机制,称之为"闭包",它是一种机制
。
”==” 隐式转换规则
字符串和数字之间的相等比较,将字符串转换为数字之后
再进行比较。
其他类型和布尔类型之间的相等比较,先将布尔值转换
数字后,再应用其他规则进行比较。
null 和 undefined之间的相等比较,结果为真。其他它
们进行比较都返回假值。
对象和非对象之间的相等比较,对象先调用 ToPrimitive
抽象操作后,再进行比较。
如果一个操作值为 NaN ,则相等比较返回 false( NaN
本身也不等于 NaN )。
如果两个操作值都是对象,则比较它们是不是指向同一个
对象。如果两个操作数都指向同一个对象,则相等操作符
返回true,否则,返回 false。
正则表达式
正则表达式的基本组成元素可以分为:字符和元字符。字
符就是基础的计算机字符编码,通常正则表达式里面使用
的就是数字、英文字母。元字符也被称为特殊字符,是一
些用来表示特殊语义的字符。

在正则表达式里,集合的定义方式是使用中括号 [ 和
]。元字符 - 可以用来表示区间范围,利用 /[0-9]/ 就
能匹配所有的数字,/[a-z]/ 则可以匹配所有的英文小写
字母。

要实现多个字符的匹配只能多次循环,重复使用之前的正
则规则就可以了。根据循环次数的多少可以分为0次,1次
,多次,特定次。
0次或1次
元字符 ? 代表了匹配一个字符或零个字符。
例子:匹配 color 与 colour 的正则表达式应该是
/colou?r/
大于0次
元字符 * 用来表示匹配零个字符或无数个字符。
通常用来过滤某些可有可无的字符串。
大于1次
元字符 + 是用于要匹配同个字符出现1次或多次的情况。
特定次数
在某些情况下,需要匹配特定的重复次数,元字符 { 和
} 用来给重复匹配设置精确的区间范围。如 'a' 我想匹配
3次,那么就是用 /a{3}/ 这个正则。
完整用法:
{x}: x次
{min, max}: 介于min次到max次之间
{min, }: 至少min次
{0, max}: 至多max次

位置边界
单词边界
例如 cat 和 scattered 两个单词匹配 cat 这个单词
如果只是使用 /cat/ 这个正则,就会同时匹配到
scattered 这个单词。这个使用需要使用边界正则表达式
\b。上面的例子改写成 /\bcat\b/ 这样就能匹配到 cat
这个单词了。
字符串边界
元字符 ^ 用来匹配字符串的开头。而元字符 $ 用来匹配
字符串的末尾。

子表达式
从简单到复杂的正则表达式演变通常要采用分组、回溯引
用和逻辑处理的思想。利用这三种规则,可以推演出无限
复杂的正则表达式。
分组
以 ( 和 ) 元字符所包含的正则表达式被分为一组,每一
个组都是一个子表达式,它也是构成高级正则表达式的基
础。
回溯引用
回溯引用指的是模式的后面部分引用前面已经匹配到的字
符串。
有时需要限制回溯引用的适用范围。那么通过前向查找和
后向查找就可以达到这个目的。
前向查找
前向查找是用来限制后缀的。凡是以 (?=regex)包含的子
表达式在匹配过程中都会用来限制前面的表达式的匹配。
后向查找
后向查找是通过指定一个子表达式,然后从符合这个子表达式的位置出发开始查找符合规则的字符串。

逻辑处理
非关系分为两种情况:一种是字符串匹配,另一种是子表
达式匹配。在字符匹配的时候,需要使用 ^ 这个元字符
。只有在 [ 和 ] 内部使用的 * 才表示非的关系。子表
达式匹配的非关系就要用到前向负查找子表达式或后向负
查找子表达式。
或关系通常给子表达式进行归类使用。
