一. js的数据类型和数据结构。
数据类型: String,Number,Boolean,Undefined,Null,Object。
除Object之外,其他都属于原始值(值本身无法改变)。我们平时对原始类型的操作,比如对字符串的操作,都是重新生成一个新的字符串,原始的字符串没有改变。
二. 构造函数中带有return的时候,如果return的是原始类型,则忽略这个值,返回构造的新对象,可以理解为返回this对象。如果ruturn的是引用类型,则直接返回该引用。
三. js采用一种按共享传递的策略传递参数,具体取决于传递的类型。如果参数类型是值类型,那么按值传递。如果参数是引用类型,则传递引用地址。一句话概括就是:改属性不改对象。
四. 对象拥有两种属性:数据属性和访问器属性(get,set)。
五. 相等判断
==将值的类型转换成相同的值类型,然后使用===比较;而===不会类型转换,弱类型不等,直接返回false。
NaN和任何值相比(包括自己)都不相等。除非Object.is(NaN,NaN)会返回true。
一般情况下,一个对象不会等于(==)null或者undefined。
undefined == null为真。
Object.is(+0,-0)返回false,但是 +0 == -0返回真。
六. 继承和原型链(http://dudodo.cc/2017/04/11/%E7%90%86%E8%A7%A3JS%E4%B8%AD%E7%9A%84%E7%BB%A7%E6%89%BF/)
1. 语法结构创建的对象实现继承
var obj = { name: 'jack' }; // 此时obj继承自Object对象,原型链是: obj =>Object.prototype => null
2. 构造函数创建的实例实现继承
var person = function(){}; var p1 = new Person();
p1.__proto__ === Object.getPrototypeOf(p1) === person.prototype
3.Object.create创建的对象
新创建的对象的原型指向调用函数是的第一个参数
var obj = Object.create(O);
原型链: obj => O=> Object.prototype => null
4. 原型链: 每个对象都会有一个私有属性[[ prototype ]](也就是浏览器实现的非标准的__proto__),它指向该对象的原型对象(prototype)。该原型对象又具有自己的prototype,层层往上直到一个对象(Object)的原型是null。这样构成的一条链称为原型链。
注意: 区分对象的[[prototype]]和构造函数的prototype。
5. 性能: 在原型链上查找属性比较耗费性能,试图访问不存在的属性会遍历整个原型链。如果需要检查对象本身上是否存在某个属性可以使用hasOwnProperty方法。
6. new 操作符调用函数的时候,js做了什么:
首先new Object()创建一个对象,将函数内部的this指向该对象,将该对象的__proto__指向构造函数的原型对象(fun.prototype),默认返回该对象。
eg: var o = new Foo(); ===> 1.var o = new Object(); 2.o.__proto__ = Foo.prototype; 3.Foo.call(o);
7. 严格模式
开启方式: 'use strict';
特点:1. 意外创建的全局变量,也就是不使用var,直接声明变量,会抛出错误。
2. 为原始值(number,boolean,string等)增加属性会抛出错误。
3. 给不可写和只读属性赋值,给不可扩展的对象增加,删除属性会抛出错误。
4. 对象的属性名称必须是唯一的。
5. 函数参数名唯一。
6. 禁止使用八进制的数字。
7. 禁止删除声明的变量。禁止使用eval,width语法。
8. 垃圾回收机制
js创建变量是为变量分配内存,并且在不需要用到这些变量时自动释放内存,这个过程叫垃圾回收机制。
垃圾回收机制原理:引用计数垃圾收集(只要该变量不被其他变量引用则可以回收),标记-清除算法(从根作用域查找,找不到的变量可以回收)。方法一的限制:循环引用。
9. Array
Array.of: 根据一组参数创建新的数组实例,支持任意的参数类型和数量。
eg: Array.of(1,'2',{},[]); ===> [ 1, '2', {}, [] ];
Array.copyWithIn(target,start,end): 浅复制数组的一部分(start到end不包括end)到另一位置(target)。不会改变数组的大小。
10. Date
Date对象基于1970年1月1日(世界标准时间)起的毫秒数。
格式: 1>new Date(年(四位数返回正常年份,两位数表示1900-1999之间的年份),
月(0-11),
日(一个月的第几天,从1开始),
小时(24小时制),
分钟,
秒,
毫秒);
2>new Date(表示毫秒的数值)
3> new Date(表示时间的字符串,eg: '2018-12-3')
eg:new Date(1000) ==> Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)。
new Date('1995-12-17T03:24:00')===> Sun Dec 17 1995 03:24:00 GMT+0800
new Date(2018,2,27,17,55,10,10)===>Tue Mar 27 2018 17:55:10 GMT+0800
11. JSON方法
JSON.parse(target, reviver): 将一个JSON字符串序列化成JSON对象。target是需要序列化的JSON字符串,reviver是可选的函数用以在返回之前对所得到的对象进行操作。
JSON.stringify(target, replacer,space):将一个JSON对象或者数组转成JSON字符串,target是需要转换的数组或者对象,replacer如果是一个数组,表示只转换该数组包含的属性,该数组不包含的属性不转换,如果是一个函数,则被序列化的值的每个属性都会经过该函数处理然后返回。space指定需要缩进的指定字符串。
注意: JSON.stringify传参
1. 非数组对象的属性不能保证按照特定的顺序出现在序列化后的字符串中。
2. 布尔值,数字,字符串的包装对象会被序列化为对应的原始值。
3. undefined,null,function,symbol值会被忽略或者转换成null。
4. 以symbol为属性键的属性值会被忽略。
5. 不可枚举的属性会被忽略。(enumerable:false)
12. Math
abs: 绝对值。
floor: 向下取整。
log: 自然对数。
max(x,y,z....): 最大值。
min(x,y,z...): 最小值。
random: 0到1的随机数。
round:四舍五入的整数。
sign: 判断正负。
13. number
parseFloat: 解析一个字符串参数返回一个浮点数。如果遇到正负号,数字,小数点,e以外的字符,则舍弃该字符和该字符后面的部分,返回当前已经解析到的浮点数。参数首位的空白符会被忽略。如果参数的第一个字符无法解析成数字,则直接返回NaN。
parseInt: 解析一个字符串,转换成一个以指定基数的整数。如果被解析的参数不是字符串,则使用toString方式转换成字符串。如果被解析的字一个字符不能转换成数值类型,则返回NaN。
14. Object
assign: 复制一个或者多个对象来创建一个新对象。(浅复制)
create: 以指定对象为原型对象创建一个对象。
defineProperty: 给对象添加一个属性并且指定该属性的配置(enmuerable可枚举,configurable可更改或者删除,value:属性对应的值,writable)。
entries: 返回指定对象可枚举属性的【key,value】的数组。
getPrototypeOf:返回指定对象的原型对象。
isPrototypeOf: 检查一个对象是否是另一个对象的原型。
setPrototypeOf: 设置对象的原型对象。
is: 判断两个值是否相同。(特例:Object.is(NaN,NaN)返回true,Object.is(+0,-0)返回false)。
keys: 返回给顶对象自身可枚举属性组成的数组。
values: 返回给定对象自身可枚举属性的值组成的数组。
hasOwnProprerty: 判断某个对象自身是否存在某个属性。
valueOf:返回对象的原始值。
toString: 返回对象的字符串表示。
15. Promise
resolve: 返回一个状态由给定value决定的peomise对象。
reject: 返回一个状态是失败的promise对象。
race: 当参数里面任何一个promise被成功或者失败返回后,父promise马上用这个promise返回的结果作为参数调用父promise绑定的then函数,并返回该promise对象。
all:当参数里面所有的promise都成功返回后才会触发成功回调,一旦有一个promise返回失败,则立即触发该失败promise的失败回调。
16. 正则
语法: 1.字面量:/pattern/flag 2. 构造函数: new RegExp(pattern,flag) 3.工厂: RegExp(pattern,flag)。
pattern:正则匹配规则文本。
flag: 标志参数。可以是:g:全局匹配。i: 忽略大小写。m: 将(^$)开始和结束符视为多行上工作。y: 粘性匹配。仅匹配目标字符串中此正则表示式中lastindex属性指定的索引。
字符类型:
. :匹配一个任意字符,行结束符除外。
\d: 匹配任意阿拉伯数字(0-9)。
\D:匹配任意一个非阿拉伯数字。
\w: 匹配任意字母(A-Z,a-z)和数字(0-9)和下划线(_);
\W: 匹配任意不是字母数字下划线的字符。(eg: %)。
\s: 匹配一个空白符。
\S: 匹配一个非空白符。
\r: 匹配一个回车符。
\n: 匹配一个换行符。
x|y: 匹配x或者y。
*:匹配模式0或者多次。eg: /x*/表示匹配x字符0个或者多个。
+:匹配默认的一次或者多次。
?:匹配默认的0次或者多次。
{n,}: 匹配模式连续出现至少n次时匹配。eg:/x{3,}/表示x连续出现至少三次是匹配。
{n,m}:匹配默认连续出现至少n次,至多m次时匹配。
x(?=y): 仅匹配被y跟随的x。eg:/v(?=f)/,匹配f紧前的v字符。
x(?!y): 仅匹配不被y跟随的x。
17. +运算符
+是将其他类型的对象转换成数字对象的最推荐的做法,如果其无法解析则返回NaN。 eg: +'1.23' ==> 1.23
运算
Number + Number ==>数字相加 eg: 1 + 2 == 3
Number + Boolean ==>数字相加 eg: 1 + true == 2, 1 + false == 1
Boolean + Boolean ==>数字相加 eg: true + true == 2 // true被转换成1,false被转换成0
其次只要有字符串参与运算的,都作为字符串连接看待(也就是都转成字符串运算)。
18. 比较运算符涉及类型转换时
当比较数字和字符串时,字符串会转换成数字。
boolean类型的值会被转换成数字,其中true ===》1,false ===》0
如果对象也字符串或者数字比较时,会通过valueOf或者toString将对象转换成原始值(字符串或者数字)。如果转换失败,则跑出一个运行时错误。
如果对象和对象比较,当且仅当引用同一个对象是才会返回true。
19. delete操作符
delete操作符从某个对象上删除属性。成功返回true,否则返回false。以下为特殊情况
1. 删除一个不存在的属性,会返回true。
2. delete操作符只会在自身属性上操作,不会去自身的原型链上操作。
3. delete操作符无法删除全局作用域中的函数。任何使用var声明的属性不能在全局作用域和函数作用域中删除。
4. 使用let和const声明的属性不能在当前作用域中删除。
5. configurable描述是false的属性不能删除。
20.Function
函数表达式: var fun = function name(){} // 不存在变量声明提升
函数声明: function name(){} // 存在变量声明提升
21. in操作符
如果指定的属性在指定的对象或者对象对原型链中存在,则返回true。
对于被delete删除的属性,返回false;如果某个属性存在,但是属性值是undefined,返回true。
22. new操作符做了什么
1. 创建一个原型对象指向构造函数的prototype属性的对象。
2. 利用指定参数运行构造函数,并且将构造函数的this指向第一步创建的对象。
3. 构造函数返回的对象就是new的结果。但如果不显示的返回,则默认返回第一步创建的对象。
23. 词法作用域和动态作用域
作用域是指代码中定义变量的区域。
作用域确定了当前执行代码查找变量的规则。
词法作用域:又称静态作用域,是指函数的作用域在函数定义的时候就确定了。
动态作用域:函数的作用域在函数运行的时候才会确定。
24. isPrototypeOf和instanceOf
前者是判断一个对象是否是另一个对象的原型(__proro__);后者是判断在一个对象的原型链上是否存在一个构造函数的原型对象(prototype)属性,也就是判断该对象是否是该构造函数的实例。
eg: function Person(){}; // 构造函数
var p = new Person(); // 实例对象
Person.prototype.isPrototypeOf(p) // true 判断Person.prototype是否是p对象的原型
p instanceof Person // true 判断在p的原型链上是否存在Person的prototype属性。