ES5给Object扩展了一些静态方法,常用的2个
作用:以指定对象为原型创建新的对象
为新对象指定新的属性,并对属性进行描述
作用: 为指定对象定义扩展多个属性
var arr = [2, 4, 3, 2, 6, 5, 4]
console.log(arr.indexOf(4)) //1
console.log(arr.lastIndexOf(4)) // 7
arr.forEach(function(item, index) {
console.log(item, index)
})
var arr1 = arr.map(function(item, index) {
return item + 10
})
console.log(arr1) // [12, 14, 13, 12, 16, 15, 14]
var arr2 = arr.filter(function(item, index) {
return item > 3
})
console.log(arr2) //[4, 6, 5, 4]
作用:将函数内的this绑定为obj,并并将函数返回
bind的点: 绑定完this不会立即调用当前函数,而是将函数返回
bind传参数的方式同call一样
都能指定函数中的this
call()/apply()是立即调用函数
bind()是将函数返回
var obj = {username: 'lanfeng'}
function foo(data) {
console.log(this, data)
}
foo(); //window
//传人参数的形式
foo.call(obj, 33) // 直接从第二个参数开始,依次传入
foo.apply(obj, [33]) //第二个参数必须是数组,传入参数放在数组里
//bind的点: 绑定完this不会立即调用当前函数,而是将函数返回
foo.bind(obj)()
// ----------
var obj = {username: 'lanfeng'}
setTimeout(function() {
console.log(this) //obj
}.bind(obj), 1000)
let username = 'lanfeng'
保存不用改变的数据
let fun = () => console.log('我是箭头函数')
fun();
//形参的情况
// 1. 没有形参的时候,小括号不能省略
let fun1 = ()=> console.log('我是箭头函数')
// 2. 只有一个形参的时候,小括号可以省略
let fun2 = (a) => console.log(a)
fun2('langfeng')
//3. 两个及两个以上的形参的时候,小括号不能省略
let fun3 = (x, y) => console.log(x, y)
fun3(25, 36)
// 函数体的情况
// 1. 函数体只有一条语句或者是表达式的时候,大括号可以省略,会自动返回语句执行的结果或者是表达式的结果
let fun4 = (x, y) => x+y
console.log(fun4(24, 36))
// 2. 函数体不止一条语句或者是表达式的额情况,{}不可以省略
let fun5 = (x, y) => {
console.log(x, y)
return x + y
}
console.log(fun5(35, 49))
let promise = new Promise((resolve, reject)) => {
//初始化promise状态为pending
//执行异步操作
if(异步操作成功) {
resolve(value) //修改promise的状态为fullfilled
} else {
reject(errMsg) //修改promise的状态为rejected
}
}
promise.then(
result => console.log(result),
errorMsg => alert(errorMsg)
)
let symbol = Symbol();
let obj = {}
obj[symbol] = 'hello'
let symbol = Symbol('one')
let symbol2 = Symbol('two')
console.log(symbol) // Symbol('one')
console.log(symbol2) // Symbol('two')
除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法
Symbol.iterator
对象的Symbol.iterator属性,指向该对象的默认遍历器方法
async function foo() {
await 异步操作
await 异步操作
}
class Person {
//类的构造方法
constructor(name, age) {
this.name = name;
this.age = age
}
showName() {
console.log(this.name)
}
}
let person = new Person('kobe', 39)
console.log(person)
console.log(person.showName())
//子类
class StartPerson extends Person {
constructor(name, age) {
super(); //调用父类构造方法
}
}
let startPerson = new StartPerson('lanfeng', 28, 10000)
console.log(startPerson.showName()) // lanfeng
判断2个数据是否完全相等
将源对象的属性复制到目标对象上
let obj2 = {}
obj2._ proto_ = obj1
console.log(Object.is(0, -0)) // false
console.log(Object.is(NaN, NaN)) // true
let obj = { username: 'lanfeng'}
let obj1 = obj; // obj1 复制了obj在堆内存的引用
拷贝数据:
//拷贝数组/对象,没有生成新的数组而是复制了一份引用
let obj = {username: 'lanfeng', age: 30}
let obj1 = obj
console.log(obj1) // {username: "lanfeng", age: 30}
obj1.username = 'qiuqiu'
console.log(obj.username) //qiuqiu
拷贝数据的方法:
let obj = {username: 'lanfeng'}
let obj2 = Object.assign(obj)
console.log(obj2) // {username: "lanfeng"}
obj2.username = 'qiuqiu'
console.log(obj) // {username: "qiuqiu"}
// ---------
let arr = [1, 3, {username:'lanfeng'}]
let arr2 = arr.concat()
// console.log(arr2) //[1, 3, {username:'lanfeng'}]
arr2[1] = 'a'
console.log(arr) //[1, 3, {username:'lanfeng'}]
arr2[2].username = 'qiuqiu'
console.log(arr) //[1, 3, {username:'qiuqiu'}]
// ------
let arr = [1, 3, {username:'lanfeng'}]
let arr4 = JSON.parse(JSON.stringify(arr))
arr4[2].username = 'lanfeng2'
console.log(arr) // [1, 3, {username:'lanfeng'}]
浅拷贝(对象/数组)
特点:拷贝的引用,修改拷贝以后会影响原数据
深拷贝(深度克隆):拷贝的时候生成新的数据,修改拷贝以后不会影响原数据
在实现深拷贝之前,我们需要掌握以下知识点
如果判断数据类型:
let result = 'abcd'
result = null;
result = [1, 3]
console.log(Object.prototype.toString.call(result).slice(8, -1)); // Array
for in 循环 对象(属性名) 数组(下标)
let obj = {username: 'lanfeng', age: 39}
for(let i in obj) {
console.log(i)
}
let arr = [1,3, 'abc']
for(let i in arr) {
console.log(i)
}
定义检测数据类型的功能函数
function checkType(target) {
return Object.prototype.toString.call(result).slice(8, -1)
}
实现深度克隆 ,一般针对数组或者对象
function checkedType(target) {
return Object.prototype.toString.call(target).slice(8, -1)
}
function clone(target) {
// 首先判断拷贝数据的类型
//
let result, targetType = checkedType(target);
if(targetType === 'Object') {
result = {};
} else if(targetType === 'Array') {
result = [];
} else {
return target
}
// 遍历目标数据
for(let i in target) {
// 获取遍历数据结构的每一项值
let value = target[i]
// 判断目标结构里的每一项值是否存在对象或数组
if(checkedType(value) === 'Object' || checkedType(value) === 'Array') {
// 继续遍历获取到value值
result[i] = clone(value)
} else {
// 获取都的value值是最基本的数据类型或者是函数
result[i] = value
}
}
return result
}
let arr3 = [1,2, {username: 'lanfeng'}]
let arr4 = clone(arr3)
console.log(arr4)
arr4[2].username = 'qiuqiu'
console.log(arr3, arr4)
let set = new Set([1,2,4,2,5])
console.log(set)
for (let value of target) {} 循环遍历
let set = new Set([1,2,4,5,2,3])
let arr = []
for(let i of set) {
arr.push(i)
}