1、垃圾回收
JavaScript 的内存管理是自动的,不能强制执行或者阻止执行
可达性
JavaScript中主要的内存管理概念是可达性。
什么是可达性?
定义一个对象
let user = {
name:"XiaoMing"
};
user 应用了这个对象。 通过 user.name 可以取到“XiaoMing"这个值,则认为XiaoMing这个值是可达的。
当 user= null; ”XiaoMing“ 这个值就不可达了,此时JavaScript的垃圾回收机制就会自动从内存中将其清除。
2、Symbol 类型
对象的属性键,根据规范只能使用 String 类型 和 Symbol 类型
Symbol 表示唯一的标识符。
创建方式; let id = new Symbol("id"); Symbol("id")中的id 为对id 的描述,
并且即使描述相同,只要定义的变量不同,这个Symbol 这个对象就不一样
字面量中的Symbol
通过变量的方式将Symbol 对象作为属性的键
示例:
let id = Symbol("id");
let user = {
name:"XiaoMing",
[id]:123
};
Symbol 在 for...in 中被跳过
for(let key in user)
alert(key);
//Symbol 这个属性不会被展示出来,可以作为隐藏属性
可以通过"."的方式使用 user.[id]。
全局symbol
在应用程序中想要访问同一个symbol 的时候可以使用 全局symbol 注册表
使用方法: Symbol.for(key);
let id = Symbol("id); //从全局注册表中获取,如果不存在则创建。
let idAgain = Symbol.for("id"); //再次读取
此时id 和 idAgain是相同的
Symbol.keyFor
Symbol.keyFor 在内部全局注册表中来查找symbol 的键,只适用于全局,如果是非全局的则返回undefined
let sym = Symbol.for("name");
alert(Symbol.keyFor(Symbol.for(”name")));//name
alert(Symbol.keyFor(Symbol.for(”id")));//undefined
系统Symbol 不做展示。
3、对象方法和 this
在对象方法中使用this
let user ={
name:"XiaoMing",
sayHi:function(){
alert(this.name);
}
};
javaScript 中的this 和其它语言中的this 有些不同,JavaScript中的“this” 只有在执行的时候才确定它指向的是哪一个对象。
简单总结:
存储在对象中的函数称之为方法
对象执行方法进行操作,obj.doSomething();
方法可以将对象应用为this;
this的值是在运行的时候求值的
函数声明使用this 只有等到调用时才会有值
函数可以在对象之间进行公用
箭头函数没有this。在箭头函数中访问this,是外部传进来的。
4、构造函数 和操作符“new"
构造函数
构造函数在技术上是常规函数。不过有两个约定。
1)它们的首字母必须大写
2)只能用”new“ 操作符来执行
例子:
function User(name){
this.name= name;
this.isAdmin=false;
}
let user = new User('jack');
alert(user.name);//jack
双语法构造函数: new.target
function User(name){
if(!new.target){
return new User(name);
}
this.name= name;
}
let Xiao = User("Xiao");//内部已经封装好了,如果不用new关键字,则在构造函数内部自动使用new
构造函数 Return
通常情况下构造函数是没有Return 的
如果有,规则如下:
1)如果return 对象,则返回它,而不是this
2)如果return 一个原函数,则忽略。
换一种说法,带有对象的 return
返回该对象,在所有其他情况下返回 this
。
例如,这里 return
通过返回一个对象覆盖 this
:
1 function BigUser() { 2 3 this.name = "John"; 4 5 return { name: "Godzilla" }; // <-- returns 一个 object 6 } 7 8 alert( new BigUser().name ); // 哇哦,得到了对象,name 属性值为 Godzilla ^^
这里有一个 return
空的例子(或者我们可以在它之后放置一个原函数):
1 function SmallUser() { 2 3 this.name = "John"; 4 5 return; // 完成执行,returns this 6 7 // ... 8 9 } 10 11 alert( new SmallUser().name ); // John
构造函数中的方法
1 function User(name) { 2 this.name = name; 3 4 this.sayHi = function() { 5 alert( "My name is: " + this.name ); 6 }; 7 } 8 9 let john = new User("John"); 10 11 john.sayHi(); // My name is: John 12 13 /* 14 john = { 15 name: "John", 16 sayHi: function() { ... } 17 } 18 */