1.知识点

1.png
2.列如

2.png
3.变量类型和计算
1.变量类型
(1).值类型(null、undefined、boolean、number、string)
var a=100;
var b=a;
a=200;
console.log(b); //100
(2).引用类型(对象、数组、函数)
var a={age:20};
var b=a;
b.age=21;
console.log(b); // 21
(3).typeof运算符详解
typeof undefined //undefined
typeof 'abc' // string
typeof 123 //number
typeof true // boolean
typeof {} // object
typeof [] // object
typeof null // object
typeof console.log // function
2.变量计算-强制类型转换
(1).字符串拼接
var a=100+10; // 110
var b=100+'10'; // '10010'
(2).==运算符
100 == '100' // true
0 == '' // true
null == undefined // true
(3).if语句
1.var a=true;
if(a){
//....
}
2.var b=100;
if(b){
//...
}
3.var c= '';
if(c){
//..
}
(4).逻辑运算
console.log(10 && 0); // 0
console.log('' || 'abc'); // 'abc'
console.log(!window.abc); // true
3.何时使用===和==
if(obj.a == null){
//这里相当于obj.a === null || obj.a===undefined,简写形式
//这是jQuery源码中推荐的写法
}
4.JS中的内置函数
Object
Array
Boolean
Number
String
Function
Date
RegExp
Error
5.如何理解JSON
JSON.stringify({a:10,b:20})
JSON.parse('{"a":10,"b":20}')
4.原型和原型链

3.png

4.png
1.构造函数
function Foo(name,age){
this.name=name;
this.age=age;
this.class="class-1;
//return this //默认有这一行
}
var f = new Foo("小林",20);//创建多个对象
2.构造函数-扩展
(1).var a={}其实是var a=new Object()的语法糖。
(2).var a=[]其实是var a=new Array()的语法糖。
(3).function Foo(){....}其实是var Foo=new Fuction(...)
(4).使用instanceof判断一个函数是否是一个变量的构造函数。
3.原型规则和示例
(1).所有的引用类型(数组、对象、函数 ),都具有对象特性,即可自由扩展属性(除了"null"之外)。
var obj={};obj.a=100;
var arr=[];arr.a=100;
function fn(){} fn.a=100;
(2).所有的引用类型(数组、对象、函数 ),都有一个__proto__属性,属性值是一个普通的对象。
console.log(obj.__proto__);
console.log(arr.__proto__);
console.log(fn.__proto__);
(3).所有的函数,都有一个prototype属性,属性值也是一个普通的对象。
console.log(fn.prototype)
(4).所有的引用类型(数组、对象、函数 ),__proto__属性值指向它的构造函数的"prototype"属性值。
console.log(obj.__proto__===Object.prototype);
(5).当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的__proto__(即它的构造函数的prototype)中寻找。
//构造函数
function Foo(name, age){
this.name=name;
}
Foo.prototype.alertName = function(){
alert(this.name);
}
//创建示例
var f=new Foo('小林');
f.printName=function(){
console.log(this.name);
}
//测试
f.printName();
f.alertName();
f.toString();//要去f.__proto__.__proto__中查找。

6.png

5.png
5.instanceof
1.f instanceof Foo的判断逻辑是:
2.f的__proto__一层一层往上,能否对应到Foo.prototype。
3.再试着判断f instanceof Object。

7.png

8.png

9.png
6.原型继承实例
1.function Elem(id) {
this.elem = document.getElementById(id);
}
Elem.prototype.html = function (val){
var elem = this.elem;
if(val){
elem.innerHTML = val;
return this; //链式操作
}else {
return elem.innerHTML;
}
}
Elem.prototype.on = function (type, fn){
var elem = this.elem;
elem.addEventListener(type, fn);
}
var div1 = new Elem('box');
// console.log(div1.html());
// div1.html('<p>2222</p>');
// div1.on("click", function(){
// alert("111");
// })
div1.html('<p>2222</p>').on("click", function(){
alert("this.text()");
})
7.作用域和闭包

10.png

11.png
1.执行上下文
(1).范围:一段<script>或者一个函数。
(2).全局:变量定义、函数声明。一段<script>。
(3).函数:变量定义、函数声明、this、argument、函数
(4).函数声明和函数表达式的区别。
console.log(a); //undefined
var a = 100;
fn('zhangsan') // 'zhangsan' 20
function fn(name) {
age=20;
console.log(name,age);
var age;
}
2.this指向
(1).this要执行时才能确认值,定义时无法确认
(2).场景
1.作为构造函数执行
function Foo(name){
this.name=name;
}
var f=new Foo("小林")
2.作为对象属性执行
var obj = {
name:"A",
printName: function(){
console.log(this.name);
}
}
obj.printName()
3.作为普通函数执行
function fn(){
console.log(this)//window
}
fn()
4.call、Apple、bind
function fn1(name, age){
alert(name);
console.log(this)//window
}
fn1.call({x:100}, "zhangsan", 20);//{x:100}this指向
fn1.call({x:100}, ["zhangsan", 20]);//{x:100}this指向
var fn2 = function(name, age){
alert(name);
console.log(this);
}.bind({y:200})
fn2('zhangsan', 20)
var a={
name: "A",
fn: function(){
console.log(this.name);
}
}
a.fn() // this===a
a.fn.call({name:'B'}) // this ==={name: 'B'}
var fn1 = a.fn;
fn1 // this===window
3.作用域
(1).没有块级作用域。
if(true){
var name="zhangsan";
}
console.log(name);
(2).只有函数和全局作用域。
var a=100;
function fn(){
var a=200;
console.log('fn', a);
}
console.log('global', a);
fn();
(3).作用域链
var a=100;
function fn(){
var b=200;
console.log(a)//当前作用域没有定义的变量,即“自由变量”
console.log(b)
}
4.闭包
(1).闭包的使用场景
1.函数作为返回值。
function f1(){
var a=10;
return function (){
console.log(a)//自由变量,父作用域寻找
}
}
var f =f1();
var a=2000;
f();// 10
2.函数作为函数传递。
function f1(){
var a=10;
return function (){
console.log(a)//自由变量,父作用域寻找
}
}
var f =f1();
function f2(fn){
var a=200;
fn();
}
f2(f1);

12.png

13.png
8.异步和单线程

14.png

15.png
1.何时需要异步
(1).在可能发生等待的情况。
(2).等待过程中不能像alert一样阻塞程序运行。
(3).因此,所以的'等待的情况'都需要异步。
2.异步的场景
(1).定时任务:setTimeout,setInverval。
(2).网络请求:ajax请求,动态<img>加载。
(3).事件绑定
3.同步和异步的区别是什么
(1).同步会阻塞代码执行,而异步不会。
(2).alert是同步,setTimeout是异步。

16.png
9.日期、Math、数组api、对象api

17.png
上面解答

21.png

22.png

23.png
1.日期

18.png
2.Math
(1).获取随机数Math.random()。
3.数组api

19.png
1.forEach
var arr=[1,2,3];
arr.forEach(function(item, index){
//遍历数组的所有元素
console.log(index, item);
})
2.every
var arr=[1,2,3];
var result=arr.every(function (item, index){
//用来判断所有的数组元素,都满足一个条件
if(item < 4){
return ture;
}
})
console.log(result);
3.some
var arr=[1,2,3];
var result = arr.some(function (item, index){
//用来判断所有的数组元素,只要有一个满足条件即可
if(item < 2){
return ture
}
})
console.log(result);
4.sort
var arr=[1,4,2,3,5];
var arr2 = arr.sort(function(a, b){
//从小到大排序
return a-b;
//从大到小排序
// return b-a
})
console.log(arr2);
5.map
var arr=[1,2,3,4];
var arr2 = arr.map(function(item, index){
//将元素重新组装,并返回
return '<b>'+item+'</b>';
})
console.log(arr2);
6.filter
var arr=[1,2,3];
var arr2=arr.filter(function(item, index){
//通过某一个条件过滤数组
if(item >= 2){
return true;
}
})
console.log(arr2);
4.对象api

20.png
总结:

24.png
8.JS-WEB-API

25.png

26.png
1.DOM操作
(1).获取DOM节点。
(2). ()()()

27.png

28.png

29.png

30.png

31.png

32.png

33.png

34.png
9.BOM

35.png

36.png

37.png

38.png
10.事件

39.png

40.png
10.Ajax交互

41.png

42.png

43.png
1.状态码

44.png

45.png

46.png

47.png

48.png

49.png

50.png

51.png

52.png

53.png

54.png
11.存储

55.png

56.png

57.png

58.png
12.开发工具

59.png

60.png
13.模块化

61.png

62.png

63.png

64.png

65.png

66.png

67.png

68.png

69.png
14.前端运行环境

70.png

71.png

72.png

73.png

74.png

75.png
15.性能优化

76.png

77.png
16.安全性
1.XSS跨站请求攻击
2.XSRF跨站点请求伪造