JavaScript ES5新增方法(数组字符串对象)错误处理浅拷贝和深拷贝
Posted YuLong~W
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript ES5新增方法(数组字符串对象)错误处理浅拷贝和深拷贝相关的知识,希望对你有一定的参考价值。
ES5新增方法
ES5 中给我们新增了一些方法,可以很方便的操作数组或者字符串,这些方法主要包括
数组方法
迭代(遍历)方法:forEach()、map()、filter()、some()、every()
array.forEach(function(currentValue, index, arr))
foreach() 方法:
- currentValue:数组当前项的值
- index:数组当前项的索引
- arr:数组对象本身
array.filter(function(currentValue, index, arr))//后两个参数不写 默认从0开始且为该数组
filter() 方法:
- 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素,主要用于筛选数组
- 注意它直接返回一个新数组
- currentValue: 数组当前项的值
- index:数组当前项的索引
- arr:数组对象本身
array.some(function(currentValue, index, arr))
some() 方法:
- 用于检测数组中的元素是否满足指定条件 通俗点来说是查找数组中是否有满足条件的元素
- 注意它返回值是布尔值,如果查找到这个元素, 就返回true , 如果查找不到就返回false
- 如果找到第一个满足条件的元素,则终止循环,不再继续查找
- currentValue: 数组当前项的值
- index:数组当前项的索引
- arr:数组对象本身
forEach()和some的区别: 终止遍历,提高效率
//查询数组唯一的元素,用some方法更合适
var arr=[1,2,3,4,5]
arr.forEach(function(value){
if(value==3){
console.log("找到了")
return true //不能终止遍历
}
console.log("结束了")
})
console.log("-------------------")
arr.some(function(value){
if(value==3){
console.log("找到了")
return true //终止遍历 效率更高
}
console.log("结束了")
})
console.log("-------------------")
//filter也不会终止遍历
arr.filter(function(value){
if(value==3){
console.log("找到了")
return true //不会终止遍历
}
console.log("结束了")
})
字符串方法
trim() 方法会从一个字符串的两端删除空白字符,不会去除中间的空格
str.trim()
- trim() 方法并不影响原字符串本身
- 返回的是一个新的字符串,需要定义变量去接收
对象方法
keys() 方法用于获取对象自身所有的属性
Object.keys(obj)
- 效果类似 for…in
- 返回一个由属性名组成的数组
defineProperty() 方法定义对象中新属性或修改原有的属性
Object.defineProperty(obj, prop, descriptor)
- obj:必需。目标对象
- prop:必需。需定义或修改的属性的名字 字符串格式
- descriptor:必需。目标属性所拥有的特性
参数 descriptor 说明: 以对象形式 { } 书写
属性 | 说明 |
---|---|
value | 设置属性的值 默认为undefined |
writable | 值是否可以重写。true / false 默认为false |
enumerable | 目标属性是否可以被枚举。true / false 默认为 false |
configurable | 目标属性是否可以被删除或是否可以再次修改特性 true / false 默认为false |
var obj = {
id:1,
name: '张三',
sex: '男'
}
Object.defineProperty(obj,'score',{
value:100
})
Object.defineProperty(obj,'sex',{
value:'女',
writable:true, //设置该属性可更改 默认为false
enumerable:true, //设置该属性允许遍历 默认为false
configurable:true //设置该属性可以被删除 默认为false
})
console.log(obj)
delete obj.score //默认为false 不能删除
delete obj.sex //configurable:true 可以删除
delete obj.id //没有用Object.defineProperty() ,可以被删除
console.log(obj)
错误处理
try catch处理
//错误处理
try{
var o={}
o.fun()
console.log("hello") //如果前面代码出错,这行不会被执行
}catch(e){ //捕获错误 e表示错误对象
console.log(e) // 打印的是对象 结果是:TypeError: o.fun is not a function
console.log(e.message) // 打印的是对象的成员 结果是: o.fun is not a function
}
console.log("hello") //如果错误被处理会执行,不会终止程序的运行 会输出:hello
throw抛出错误对象
//抛出错误对象
try{
var e1=new Error('错误信息') //创建错误对象
throw e1 //抛出错误对象
}catch(e){
console.log(e.message) //输出错误信息
console.log(e1===e) //输出:true 判断e1和e是否为同一对象
}
错误类型
类型 | 说明 |
---|---|
Error | 表示普通错误,其余6种类型的错误对象都继承自该对象 |
EvalError | 调用eval()函数错误,已经弃用,为了向后兼容,低版本还可以使用 |
RangeError | 数值超出有效范围,如“new Array(-1)” |
ReferenceError | 引用了一个不存在的变量,如“var a = 1; a + b;”(变量b未定义) |
SyntaxError | 解析过程语法错误,如“{ ; }”“if()”“var a = new;” |
TypeError | 变量或参数不是预期类型,如调用了不存在的函数或方法 |
URIError | 解析URI编码出错,调用encodeURI()、escape()等URI处理函数时出现 |
浅拷贝和深拷贝
浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用(地址)
ES6 新增方法可以浅拷贝:Object.assign(target, …sources)
var obj = {
id: 1,
msg: {
age: 18
},
name: 'San'
}
//采用for...in方法
var o = {}
for (var k in obj) {
o[k] = obj[k]
}
console.log(o)
o.msg.age=20 //原对象的值会改变
console.log(obj)
console.log("----------------")
//采用Object.assign(target, ...sources)
var x = {}
Object.assign(x, obj)
console.log(x)
x.msg.age=20
console.log(obj)
深拷贝拷贝多层, 每一级别的数据都会拷贝
var obj = {
id: 1,
name: 'sam',
msg: {
age: 18
},
color: ['pink', 'red']
};
var o = {}
// 封装函数
function deepCopy(newobj, oldobj) {
for (var k in oldobj) {
// 判断我们的属性值属于那种数据类型
// 1. 获取属性值 oldobj[k]
var item = oldobj[k]
// 2. 判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = []
deepCopy(newobj[k], item)
} else if (item instanceof Object) {
// 3. 判断这个值是否是对象
newobj[k] = {}
deepCopy(newobj[k], item)
} else {
// 4. 属于简单数据类型
newobj[k] = item
}
}
}
deepCopy(o, obj)
console.log(o)
o.msg.age=20 //原对象的值不会改变
console.log(obj)
以上是关于JavaScript ES5新增方法(数组字符串对象)错误处理浅拷贝和深拷贝的主要内容,如果未能解决你的问题,请参考以下文章