1.JS中数据类型的存储
date:2019.12.21
JavaScript中将数据类型分为基本数据类型和引用数据类型,它们其中有一个区别就是存储的位置不同。
JavaScript中的基本数据类型有:
String
Number
Boolean
Undefined
Null
Symbol(暂时不管)
基本数据类型都是一些简单的数据段,它们是存储在栈内存中。
JavaScript中的引用数据类型有:
Array
Object
引用数据类型是保存在堆内存中的,然后再栈内存中保存一个对堆内存中实际对象的引用。所以,JavaScript中对引用数据类型的操作都是操作对象的引用而不是实际的对象。
可以理解为,栈内存中保存了一个地址,这个地址和堆内存中的实际值是相关的。
2.export 和 export default 的区别
date:2020.09.05
总结一句话,export default是默认输入,只能有一次,在import导入时不需要指定导入哪一个,不用加大括号,只能唯一对应export default命令。而export则是导出多个,按照导入一个个对象,import在按需导入一个个对象。
3.原型链
date:2020.09.16
//基于原型链的面向对象
var a = {
x: 10,
calculate: function(z) {
return this.x + this.y + z
}
}
var b = {
y: 30,
__proto__: a //自己理解类似于Java继承
}
var c = {
y: 50,
__proto__: a
}
console.log(b.calculate(100));
console.log(c.calculate(200));
function Foo(y) {
this.y = y
}
Foo.prototype.x = 100
Foo.prototype.calculate = function(z) {
return this.x + this.y + z
}
var a = new Foo(10)
var b = new Foo(20)
console.log(a.calculate(50));
console.log(b.calculate(80));
console.log(b.__proto__ == Foo.prototype);
console.log(b.constructor == Foo);
简短总结:
proto 主要是安放在一个实际的对象中的,一个原型链接,寻找属性和方法
prototype 用来创建一个对象时构建__proto__用的
4.继承
date:2020.09.16
- 继承属性和方法,但数据写死
原型链接实现继承
function Person() {
this.name = "zhansan"
}
Person.prototype.getName = function() {
console.log(this.name);
}
function Student() {
this.subject = "java"
}
Student.prototype = new Person(); //实现继承
Student.prototype.constructor = Student;
new Student().getName(); //继承方法
console.log(new Student().name); //继承属性
console.log(new Student().__proto__===Student.prototype); //true
console.log(new Student().__proto__.constructor === Student); //true
- 继承属性,没有继承方法
包含知识点: call绑定this 用来继承父构造函数,父的this指向子
function Person(name) {
this.name = name
}
Person.prototype.getName = function() {
console.log(this.name);
}
function Student(name, subject) {
console.log(this);
Person.call(this, name) //this指向即将要创建出来的对象,父this指向子,
this.subject = subject
}
var obj1 = new Student("zhangsan", "java")
console.log(obj1.name); //可以继承属性,但不能继承方法
- 实现继承属性和方法
function Person(name) {
this.name = name
}
Person.prototype.getName = function() {
console.log(this.name);
}
function Student(name, subject) {
console.log(this);
Person.call(this, name) //this指向即将要创建出来的对象,父this指向子,
this.subject = subject
}
Student.prototype=new Person() //实现继承
Student.prototype.constructor=Student
var obj1=new Student("zhangsan", "java")
console.log(obj1.name);
obj1.getName() //继承方法
5.闭包
date:2020.09.16
闭包 指的是有权访问另一个函数作用域的变量的函数
function base() {
var x = 100
return {
getX: function() {
return x //可以访问外部变量
}
}
}
var obj = base()
console.log(obj.getX());
var arr = []
for (var i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i);
}
}
arr[6]() //调用方法for循环已经执行完了
var arr1 = []
for (var i = 0; i < 10; i++) {
arr1[i] = (function(item) {
return function() {
console.log(item);
}
})(i)
}
arr1[6]() //通过闭包修改函数
function module() {
var name = "zhangsan"
var age = 19
function person() {
console.log("姓名:" + name + ",年龄:"+age);
}
return {
person: person
}
}
var module = module()
console.log(module.name); //undefined 私有变量获取不到
module.person()