一、 数据类型
1、简单/基本/原始数据类型
- number、string、boolean、undefined、null
2、复杂数据类型
object、Array、function、Date、RegExp.....
区别:在内存中的存储位置
基本数据类型的存取都发生在栈内存中
引用类型在堆中保存数据,在栈中保存数据在堆中的地址(引用)
二、数据集类型转换
-
隐式类型转换
运算过程 -
强制类型转换
Number() String() parseInt() parseFloat() toString()
三、函数
-
递归函数
function fn(num) { if (num == 1) { //终止条件 return 1 } return num * fn(num - 1) } var num = fn(10) console.log(num); /* 分析递归函数的执行过程: 10 10*fn(9) 9 10*9*fn(8) 8*fn(7) 7*fn(6) ... 2*fn(1) 1 */ -
回调函数
普通函数: function(){} 高阶函数:可以接收一个函数作为参数的函数 function show(fn) { //fn回调函数 show:高阶函数 console.log(fn); } show(function(){ console.log('hello world'); }) -
匿名函数
(function() { console.log('哈哈哈'); })();
四、什么是闭包
* 闭包:
有权在一个函数内访问另一个函数作用域中的变量(返回该函数), 闭包是连通函数内外的一个桥梁,可以实现局部变量常驻内存。
闭包常见面试题:
var arr = [];
for (var i = 0; i < 3; i++) {
(function (i) {
arr.push(function () {
console.log(i);
})
})(i)
}
// console.log(arr);
arr[0]()
arr[1]()
arr[2]()
var lis = document.querySelectorAll("ul li")
// for(var i=0;i<lis.length;i++){
// // lis[i].index=i;
// lis[i].onclick=function(){
// console.log(this.index);
// }
// }
for (var i = 0; i < lis.length; i++) {
(function (a) {
lis[a].onclick = function () {
console.log(a);
}
})(i);
// (function (i) {//0
// lis[i].onclick = function () {
// console.log(i);
// }
// })(0);
// (function (i) {//1
// lis[i].onclick = function () {
// console.log(i);
// }
// })(1);
// (function (i) {//2
// lis[i].onclick = function () {
// console.log(i);
// }
// })(2);
// (function (i) {
// lis[i].onclick = function () {
// console.log(i);
// }
// })(3);
}
五、递归
一种常见的算法思想:
求阶乘:
function fn(n){
if(n==1){
return 1;
}
return n*fn(n-1);
}
console.log(fn(10));
10*fn(9)
打印杨辉三角形:
for (var i = 1; i < 9; i++) { //行
for (var j = 1; j <= i; j++) {//列
document.write(cal(i, j) + " ")
}
document.write("<br>")
}
//数字的计算
function cal(m, n) {
//第一行、第一列、最后一列
if (m == 1 || n == 1 || m == n) {
return 1;
}
return cal(m - 1, n) + cal(m - 1, n - 1)
}
六、 call和apply
this在不同的地方,指向不同:
全局中this指向window
在事件函数中指向事件调用者
对象的方法中,this指向对象(this指向调用者,谁调用,this指向谁)
call和apply都可以修改函数中的this指向问题(功能一致,用法不一致)
call(obj,参数1,参数2,参数2)
apply()
// function show(){
// console.log(this);
// }
function show(a,b){
console.log(this,a,b);
}
// show();
// show.call({}) ;//无参
show.call({},10,20)
show.apply({}, [10, 20])
七、面向对象
对象:万物皆对象, 事物的抽象
实例:对象的实例化
1. 原型模式
原型 prototype 所有对象都包含一个原型的属性,该属性用来保存对象的公有的属性和方法
- 对象.ptototype
- 对象实例. __ proto__
constructor 原型对象的属性 指向构造函数
** 特点:属性放置在原型中,会成为公共属性**
2. 混合模式
构造函数+原型
function Person(name,age,no){
this.no=no;
this.name=name
this.age=age;
}
Person.prototype.say=function(){
console.log(this.name+" 哈哈哈");
}
Person.prototype.walk=function(){
console.log(this.name+" 跑的飞起......");
}
var p1=new Person("秦始皇",55,'001')
var p2=new Person("赵高",56,'002')
3. 动态混合
** 动态混合 **
function Person(name, age, no) {
this.no = no;
this.name = name
this.age = age;
console.log(typeof this.say);
//方法
if (typeof this.say != 'function') {
Person.prototype.say = function () {
console.log(this.name + " 哈哈哈");
}
}
// Person.prototype.walk = function () {
// console.log(this.name + " 跑的飞起......");
// }
}