- 如何复制一个Js对象?
① 通过 JSON 对象提供的 stringify 和 parse 方法组合使用的方式实现
// 勉强也算一句话解决了,问题在于性能不理想。
var a = {}
var b = JSON.parse(JSON.stringify(a))
② 通过在函数中以返回值的形式生成新对象。
// 这种方式的缺点在于要以字面量的形式定义一个原始对象作为模板。
a = function(){
return { prop:"123" }
}
b = a()
d = a()
b === d // false
③ 通过 ES2015 中提供的 Object.assign() 方法来复制。
// 简洁明了,性能良好的解决方案
var a = {}
var b = Object.assign({},a)
复制一个对象的最佳方案是采用 Object.assign()
方法来实现。
- 如何判断一个元素是否在集合中
由于 Js 并没有实现类似array.contains(item)
的方法,因此只能通过元素在集合中的索引判断
var isSelected = function (row) {
return (selection || []).indexOf(row) > -1;
}
- 判断一个变量是否为非空对象
首先 null 的类型是对象,如果在控制台输入 typeof null 会返回 "object",事实上我们要检测一个非空数组,就要先排除 null 值的可能。
var isObject = function(obj) {
return obj !== null && typeof obj === 'object'
}
- 如何查询一个数组并返回元素的子集
这里用到了数组的 filter 方法,此方法具有以下特点:
a. 需要传入一个回调函数作为参数,此函数应返回一个布尔值。
b. filter 执行时会对数组中的每一个元素执行一边回调函数。
c. filter 的返回值为一个新数组,其成员为原数组中返回值为 true 的元素。
var users = allUsers.filter((user) => user.loged === true)
- 如何判断一个对象没有任何属性
在 Js 中两个空对象进行比较会有什么结果呢?
var a = {}
a === {} // false
在 Js 中对 object 类型的数据应用等于操作符时,比较的是两个变量是否指向同一个引用,也就是说在内存中是否为同一个地址。
而我们期待的结果是比较两个对象在逻辑上是否具有相同的属性,空对象是一个特例,它们不具有任何属性。
if (Object.keys(search).length !== 0) {
args = Object.assign({}, args, search)
}
这里用到 Object.keys() 方法,获取对象键的集合并判断其长度是否为 0 即可。
- 如何使用循环删除数组中的多个元素
for (let i = 0, let j = delIds.length - 1; i < j; i++) {
allItems.splice (delIds[i], 0)
}
如上根据索引来循环删除原始数组中的元素是否可行呢,如果我们执行这段代码是无法得到预期结果的。原因在于当前面的元素被删除时,后面元素的索引发生了变化,在用删除前的索引就无法定位正确的元素,解决的方法有两种:
- 通过倒序循环,获取被删除元素的索引,从后向前遍历删除。
for (let i = delIds.length - 1; i > 0; i++) {
allItems.splice (delIds[i], 0)
}
- 通过数组的两个方法即 forEach 配合 indexOf 删除,这种方法需要获取被删除元素本身,动态获取它的索引。
delItems.forEach ((item) => {
allItems.splice (allItems.indexOf(item), 0)
})
ps: 此文章抄的,感觉很好想做笔记摘抄的。
网友评论