1.原型和原型链
(1)原型
所有函数都有prototype属性,prototype在英语中就是“原型”的意思。prototype的属性值是一个对象,默认拥有constructor属性指回函数。
最重要的一点是:构造函数的prototype属性是它的实例的原型。
原型的作用有:
数据共享,节约内存空间;实现继承。
Class 的typeof 类型是函数;
原型分为隐式原型( __proto__ )和显式原型 (prototype );
原型关系:每class都有显式原型 prototype ,每个实例都有隐式原型__proto__ ;
实例的 __proto__ 指向对应 class 的 prototype 。
基本原型的执行规则:
获取属性或执行方法时,先寻找自身属性和方法,如果找不到则自动去__proto__中查找。
(2)原型链
一个对象有原型对象,它的原型对象又有原型对象,一直向上找,找到object对象,object对象的原型对象为null,null是原型链的终点,再往上找没了。像链子一样的结构就是原型链。原型链的作用是:查找对象的属性或者方法。
2.undefined和null的区别
(1)undefined是基本数据类型
缺少值或者一个没有被赋值的变量的默认值是undefined,而undefined的类型也是undefined。
即:undefined又是值,又是一种类型,这种类型只有它自己。
注意:
typeof undefined = undefined;
转为数值为NaN;
应用场景:变量被声明但是没有赋值时为undefined;函数没有返回值时为undefined;对象的属性没有赋值时为undefined等。
(2)null也是基本数据类型
null表示“空”。
typeof null = null;
转为数值为0;
应用场景:是原型链的终点;作为函数的参数,表示参数不是对象
在“==”运算符中认为null与undefined相等;
在“===”运算符中认为null与undefined不相等。
3.== 与 === 运算符的区别
两种符号的定义:
"==" 叫做相等运算符; "===" 叫做严格相等运算符(全等运算符)
它们之间的区别:
"==" 允许隐式类型转换,只判断等号两边的值是否相等,而不判断类型是否相同。值相同则返回 true ;
"===" 允许隐式类型转换,既要判断值是否相等,也要判断类型是否相同,即全等才能返回 true ;
“==”运算符认为null和undefined是相等的;
“===”运算符认为null和undefined是不相等的。
4.Truly变量、falsely变量和逻辑判断
Truly变量:!!a === true 的变量;
Falsely变量:!!a === false 的变量;
5. substring()、substr()和slice() 三种截取子字符串方法的区别
substring(a,b)和slice(a,b)都是截取从a到b结束(不包括b)的字串,他们的区别是:
substring(a,b)可以自动交换两个参数的位置,而slice(a,b)不行;
slice(a,b)的参数a可以是负数,但是substring(a,b)不行。
substr(a,b)中参数b是字串长度,而不是位置编号。
6.Instanceof 判断引用类型
用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。可以判断数组,对象等。