对象常用方法,对象拷贝

  • string

方法 描述
charAt() 返回在指定位置的字符。
charCodeAt() 返回在指定的位置的字符的 Unicode 编码。
concat() 连接字符串。
indexOf() 检索字符串。
match() 找到一个或多个正则表达式的匹配。
replace() 替换与正则表达式匹配的子串。
search() 检索与正则表达式相匹配的值。
slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。
split() 把字符串分割为字符串数组。
toLocaleLowerCase() 把字符串转换为小写。
toLocaleUpperCase() 把字符串转换为大写。
toLowerCase() 把字符串转换为小写。
toUpperCase() 把字符串转换为大写。
substr() 从起始索引号提取字符串中指定数目的字符。
substring() 提取字符串中两个指定的索引号之间的字符。
  • 数组

方法 属性
slice[start,end) 返回从原数组中指定开始下标到结束下标之间的项组成的新数组(不影响原数组)
. 1个参数:n.即:n到末尾的所有
. 2个参数:[start,end]
splice():
. 删除:2个参数,起始位置,删除的项数
. 插入:3个参数,起始位置,删除的项数,插入的项
. 替换:任意参数,起始位置,删除的项数,插入任意数量的项
pop() 删除数组的最后一个元素,减少数组的长度,返回删除的值。(无参)
push() 将参数加载到数组的最后,返回新数组的长度。 (参数不限)
shift() 删除数组的第一个元素,数组长度减1,返回删除的值。 (无参)
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。(参数不限)
sort() 按指定的参数对数组进行排序 ,返回的值是经过排序之后的数组(无参/函数)
concat(3,4) 把两个数组拼接起来。 返回的值是一个副本 (参数不限)
join() 将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符
indexOf() 从数组开头向后查找,接受两个参数,要查找的项(可选)和查找起点位置的索引
lastIndexOf() 从数组末尾开始向前查找,接受两个参数,要查找的项(可选)和查找起点位置的索引
every() 对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
filter() 对数组中的每一项运行给定函数,返回该函数会返回true的项组成数组。
forEach() 对数组的每一项运行给定函数,这个方法没有返回值。
map() 对数组的每一项运行给定函数,返回每次函数调用的结果组成的数组。
some() 对数组的每一项运行给定参数,如果该函数对任一项返回true,则返回true。以上方法都不会修改数组中的包含的值。
reduce()和reduceRight() 缩小数组的方法,这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。
  • Math

方法 描述
ceil(x) 尽可能取最大。
floor(x) 尽可能取最小。
round(x) 把数四舍五入为最接近的整数。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次幂。
random() 返回 0 ~ 1 之间的随机数。
sqrt(x) 返回数的平方根。
  • 对象的深拷贝/浅拷贝

在javascript中的数据类型可以分为基础数据类型和引用数据类型,只有引用类型才会用到拷贝;

对象就是引用类型的数据;拷贝根据层次可以划分为深拷贝和浅拷贝两种;

浅拷贝只是对对象的各个属性进行一次复制,并不会进行递归复制;

简单的说,就是只会复制对象的第一层属性;深拷贝并不仅仅拷贝对象的第一层属性,而且会递归拷贝目标对象的所有属性

1 使用JSON.parse(JSON.stringify(obj))

会返回原对象的副本,可以进行深拷贝

let newObj = JSON.parse(JSON.stringify(obj));

注意:
当原对象中某个属性值为函数时,会将此属性丢失,拷贝后的对象中没有此属性,因此该方法不可以拷贝用户自定义的方法属性;
同时, 不能用于复制循环引用对象

2 使用ES6中的 Object.assign()

Object.assign() 方法用于将从一个或多个源对象中的所有可枚举的属性值复制到目标对象(即参数中的第一个对象),并返回合并后的对象.
可以复制循环引用对象

let objCopy = Object.assign({}, obj);

注意:
Object.assign 只是浅拷贝,只能复制第一层属性;

3 使用ES6中的展开操作符(…)

const array = ["a","c","d", {four: 4},];
const newArray = [...array];

注意:只对浅拷贝有效

4 使用递归进行深拷贝

function copy (obj) {
    var newobj = obj.constructor === Array ? [] : {};
    if(typeof obj !== 'object') return;   
    for(var i in obj){
        newobj[i] = typeof obj[i] === 'object' ? copy(obj[i]) : obj[i];
    }
    return newobj
}
var copyArray = copy(array)

注意:不适用于循环引用对象,对于循环引用对象,可以使用插件将循环解开.

总结:
(1 )JSON.parse(JSON.stringify(obj))适用于深拷贝属性中没有值为方法的对象,适用于非循环引用的对象;
(2) Object.assign()适用于浅拷贝对象,循环或者非循环都可以;
(3) 递归深拷贝适用于非循环引用的对象.

放到最后:关于数组的拷贝,修改后对原数组无影响

var array = [1, 2, 3, 4];
var newArray = array.slice();

var array = [1, 2, 3, 4];
var newArray = array.concat();

猜你喜欢

转载自blog.csdn.net/weixin_43931047/article/details/90896090
今日推荐