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新增方法(数组字符串对象)错误处理浅拷贝和深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级之ES5 中的新增方法

带你学习ES5中新增的方法

JavaScript数组方法整理

JavaScript数组方法总结

ES5 新增方法概述

Javascript基本数组方法详解