str.substring(start: Number, end: Number)
//截取字符串从start到end(不包含的字符串)
str.slice(start: Number, end: Number)
// 截取字符串从start到end(不包含,可为负数)的字符串
str.replace(searchValue:{staring, RegExp}, replaceValue: string)
// 将searchValue 符合条件的替换成replaceValue
str.split(splitter: string, limit?: Number)
// 将str根据splitter拆分成长度不大于limit的数组
str.repeat(count: Number)
// 将str重复指定的次数,返回重复后的字符串
arr.toString()
// 将转换成以逗号分隔的字符串 obj.toString()=> '[object Object]'
Array.from(iterabel: Iterabel<any>)
// 将可迭代的值转换为以逗号分隔的数组
arr.join(separator?: string)
// 将数组分隔成以separator连接的字符串 空则为,
arr.push()
// 数组尾部添加元素
arr.pop()
// 删除数组尾部元素,返回删除的元素
arr.unshift()
// 数组开头添加元素 返回新的长度
arr.shift()
// 数组开头删除元素 返回第一个元素
arr.sort(Function?: (a: any, b:any) => a-b :number )
// 默认对数组进行升序 b-a执行倒叙
arr.reverse()
// 颠倒数组中元素的顺序 会改变原数组
arr.slice(start: Number, end: Number)
// 返回原数组中指定下标到结束下标直接组成的新数组
arr.splice(start: number, deleteCount: number, ...items: any[])
// start开始操作的位置,deleteCount删除的数量, items进行插入的元素
arr.forEach(callbackfn:(item, index)=>{})
// 遍历数组 没有返回值 无法中断(除了throw)
arr.map(callbackfn: (item,index)=>{})
// 返回一个新数组 无法中断
for (const key in object) {
if (Object.hasOwnProperty.call(object, key)) {
const element = object[key];
}
}
// 遍历对象,数组 key值 如果迭代的对象的变量值是null或者undefined, for in不执行循环体
for (const iterator of object) {
}
// for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象
this
JavaScript this关键字指的是它所属的对象
它拥有不同的值,具体取决于它的使用位置:
- 在方法中,this指向所有者对象
- 单独的情况下,this指向的是全局对象
- 在函数中,this指向的是全局对象
- 在函数中,严格模式下,this是undefined
- 在事件中,this指向接收事件的元素
apply: apply(obj,[a,b,c])接受两个参数,第一个参数指定了函数体内this的指向,第二参数是一个数组或类数组,用于传递被调用函数的参数列表
call: call(obj, params, paramsn…) 第一个参数指定了函数体内this的指向,后续参数依次传入
bind: bind和call一样且返回的是函数 bind(obj, params, params…)()
箭头函数:箭头函数没有自己的this,它的this是继承而来;默认指向在定义它时所处的对象(宿主对象),且this指向不能被更改。vue的methods中不能使用箭头函数,因为会导致this指向的不是vue实例$vm,而是一个xxx.a的类
匿名函数: this指向window
setInterval、setTimeout: this指向window
eval: 可计算某个字符串, this指向调用上下问中的this
异步
并行和并发:
- 并发是宏观概念,我分别有任务A和任务B,在一段时间内通过任务间的切换完成了这两个任务
- 并行是微观概念,假设cpu有两个内核,那么就可以同时完全任务A、B
Promise:
promise有三个状态:等待着(pending) 完成(resolved)拒绝(rejected)
const promise = new Promise((resolve, reject) => {
// do something here ...
if (success) {
resolve(value); // fulfilled
} else {
reject(error); // rejected
}
});
promise.then(function(value) {
// success
}, function(error) {
// failure
});
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values);
});
// [3, 1337, "foo"]
async和await:
一个函数如果加上async,那么该函数就会返回一个Promise
async function test() {
return "1"
}
console.log(test()) // -> Promise {<resolved>: "1"}
async就是将函数返回值使用Promise.resolve()包裹了下,和then中处理返回值一样,并且async必须和await配套使用。
当然也存在一些缺点,因为 await 将异步代码改造成了同步代码,如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低。
async function test() {
// 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式
// 如果有依赖性的话,其实就是解决回调地狱的例子了
await fetch(url)
await fetch(url1)
await fetch(url2)
}
setTimeout:延时后执行
setInterval:每隔多久执行
遍历
for…of:可以循环遍历它的成员(属性值),使用范围包括数组、Set和Map结构、某些类似数组的对象,generator对象,以及字符串数组的遍历器接口只返回具有数字索引的属性。对于普通的对象,for…of结构不能直接使用,会报错,必须部署了iterator接口后才能使用。可以中断循环。
for…in:遍历对象自身的和继承的课枚举的属性,不能直接获取属性值。可以中断循环
forEach:只能遍历数组,不能中断,没有返回值,会改变原数组
map:只能遍历数组,不能中断,不会改变原数组返回值是修改后的数组
闭包
原因:函数中能访问全局对象,但是全局环境中访问不了函数内的局部对象。为了实现在全局中能访问到函数内的局部对象。
function f1(){
n=999;
function f2(){
// 形成了闭包(函数内部存在着函数)
// this 指向Windows
// 闭包作用:
1.是为了能够访问局部内的变量
2.为了这些变量始终存在内存中(当变量一直被使用时,栈中不会释放掉该内存)
;
}
return f2;
}
var result=f1();
result(); // 999
弊端:容易造成内存泄露
function foo(){ // 闭包(函数),提供一个私有的空间。(foo()只调用一次,从而保证共用的私有空间是相同的空间)
var name = "张三"; //私有空间中的变量。foo()只能调用一次,从而保证多次setName所使用的变量是相同的变量(name)
var age = 20;
return { // 通过return内部函数,可以让外部获取内部函数,并通过内部函数来获取/修改私有空间中的内容。 (如果是多个内部函数,可以将多个内部函数封装成JSON对象返回)
getName: function () { //(内部函数) 不带参数表示获取
return name; //获取一定要有return语句。
},
setName: function (value) { //(内部函数) 带参数表示设置
name = value;
return name; // 设置时可以不用return, 这里的return是为了友好。
},
getAge:function(){
return age;
},
setAge:function (value) {
if(value < 0 ){ //设置安全措施,可以保证系统的安全性和稳定性
throw "数据非法";
}
age = value;
return age;
}
}
}
var obj = foo(); //foo()只调用一次,表示共用的是同一个私有空间(闭包)。 obj就是内部函数(或者多个内部函数封装成的JSON对象)
console.log(obj.getName());
obj.setName("高金彪");
console.log(obj.getName());
obj.setAge(22);
console.log(obj.getAge()); //多次设置和获取,都是共用的同一个私有空间
//闭包的作用
//最基本的作用:可以通过闭包返回的内部函数或者方法,来修改函数内部的数据
//创建一个私有的空间,保护数据
//外部想要访问数据,只能通过函数提供的内部方法
//在提供的内部方法中,我们可以设置一些校验逻辑,让数据变得更加安全
原文链接:https://blog.youkuaiyun.com/houyanhua1/java/article/details/79843328
Map
const map = new Map([
['name', '张三'],
['age', '18']
])
map.size // 2
map.has('name') // true
map.get('name') // 张三
map.has('name') // true
map.set('like', 'basketball')
map.get('like') // basketabll
map.get('from') // undefined
map.delete('age')
map.has('age') // false
[...map.keys()] // ['name', 'age']
[...map.values()] // ['张三', '18']
[...map.entries()] // [['name','张三'],['age','18']]
[...map] // [['name','张三'],['age','18']]
本文围绕JavaScript展开,介绍了this关键字在不同场景下的指向,如方法中指向所有者对象等,还提及apply、call、bind等改变this指向的方法。阐述了异步中的并行和并发概念,以及Promise、async和await的使用。此外,讲解了for…of、for…in等遍历方式,最后分析了闭包的原因和弊端。





