JavaScript 回顾(四)

118 阅读5分钟

这是我参与更文挑战的第27天,活动详情查看: 更文挑战

1, 垃圾回收(GC)

就像是人生活的时间长了就会产生垃圾一样,程序运行过程中会产生垃圾,这些垃圾积攒过多以后,会导致程序运行速度过慢,所以我们需要一个垃圾回收机制来处理程序运行过程中产生的垃圾

当一个对象没有任何的变量或属性对它进行引用,此时我们将永远无法操作该对象,此时这种对象就是第一个垃圾, image.png

注意: 在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作, 我们需要做的只是将不需要的对象设为null

2, 内建对象

(1) 数组

JS中常用的内置对象:Array对象、Date对象、正则表达式对象、string对象、Global对象

(1) 数组

数组也是一个对象,它和我们普通的对象功能类似,是用来存储一些值的

concat()     表示把几个数组合并成一个数组
join()       设置分隔符连接数组元素为一个字符串
pop()       移除数组最后一个元素
shift()      移除数组中第一个元素 
slice(start,end)  返回数组中的一段
splice()      可以用来删除,可以用来插入,也可以用来替换 
push()        往数组中新添加一个元素,返回最新长度
sort()       对数组进行排序
reverse()    反转数组的顺序 
toLocaleString()   把数组转换为本地字符串
array对象属性: 
length        表示取得当前数组长度 (常用)
constructor     引用数组对象的构造函数
prototype     通过增加属性和方法扩展数组定义

(2) Global对象

全局属性和函数,可用于所有内建的JavaScript对象

escape()     对字符串编码
eval()       把字符串解析为JavaScript代码并执行
isNaN()      判断一个值是否是NaN 
parseInt()      解析一个字符串并返回一个整数
parseFloat()     解析一个字符串并返回一个浮点数 
number()     把对象的值转换为数字
string()     把对象的值转换为字符串

(3) 正则表达式对象

语法 1 
re = /pattern/[flags] 
​
语法 2 
re = new RegExp("pattern",["flags"]) 
re         为将要赋值正则表达式模式的变量名 
pattern      为正则表达式 
flags             为标记:有如下3种
1:g(全文查找) 
2:i(忽略大小写) 
3:m(多行查找) 

当预先知道查找字符串时用语法 1。当查找字符串经常变动或不知道时用语法 2,比如由用户输入得到的字符串。

(4) String对象

charAt()          返回指定索引的位置的字符 
indexOf()           从前向后检索字符串,看是否含有指定字符串
lastIndexOf()        从后向前检索字符串,看是否含有指定字符串
concat()          连接两个或多个字符串
match()             使用正则表达式模式对字符串执行查找,并将包含查找结果最为结果返回
replace()         替换一个与正则表达式匹配的子串
search()          检索字符串中与正则表达式匹配的子串。如果没有找到匹配,则返回 -1。 
slice(start,end)     根据下表截取子串 
substring(start,end)   根据下表截取子串 
split()            根据指定分隔符将字符串分割成多个子串,并返回素组
substr(start,length)    根据长度截取字符串 
toUpperCase()       返回一个字符串,该字符串中的所有字母都被转化为大写字母。 
toLowerCase()       返回一个字符串,该字符串中的所有字母都被转化为小写字母。

(5) Math对象

ceil()    向上取整。
floor()     向下取整。
round()   四舍五入。
random()  取随机数。

3, JS 构造函数

(1) Object.assign()

通过复制一个或多个对象来创建一个新的对象。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
​

(2) Object.create()

使用指定的原型对象和属性创建一个新对象。

const person = {
  isHuman: false,
  printIntroduction: function () {
    console.log('xxx');
  }
};
const me = Object.create(person);
​

(3) Object.defineProperties()

给对象添加多个属性并分别指定它们的配置。

方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
})

(4) Object.entries()

方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)

const object1 = { foo: 'bar', baz: 42 };
console.log(Object.entries(object1)[1]);
const object2 = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(object2)[2]);
const result = Object.entries(object2).sort((a, b) => a - b);
​

(5) Object.freeze()

该方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

const object1 = {
  property1: 42
};
const object2 = Object.freeze(object1);
 
object2.property1 = 33;
 
console.log(object2.property1)
​

(6) Object.is()

该 方法判断两个值是否是[相同的值

Object.is('foo', 'foo');     // true
Object.is(window, window);   // true
 
Object.is('foo', 'bar');     // false
Object.is([], []);           // false
 
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo);         // true
Object.is(foo, bar);         // false
 
Object.is(null, null);       // true
 
// 特例
Object.is(0, -0);            // false
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

(7) Object.keys()

该方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。

var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']var myObj = Object.create({}, {
  getFoo: {
    value: function () { return this.foo; }
  } 
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']

(8) Object.values()

该方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。

var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
 
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']
 
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']
 
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = 'bar';
console.log(Object.values(my_obj)); // ['bar']
console.log(Object.values('foo')); // ['f', 'o', 'o']