对JavaScript的理解

2019-03-07  本文已影响0人  面朝南的落地窗
  1. 如何复制一个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() 方法来实现。

  1. 如何判断一个元素是否在集合中
    由于 Js 并没有实现类似 array.contains(item) 的方法,因此只能通过元素在集合中的索引判断
var isSelected = function (row) {
  return (selection || []).indexOf(row) > -1;
}
  1. 判断一个变量是否为非空对象
    首先 null 的类型是对象,如果在控制台输入 typeof null 会返回 "object",事实上我们要检测一个非空数组,就要先排除 null 值的可能。
var isObject = function(obj) {
  return obj !== null && typeof obj === 'object'
}
  1. 如何查询一个数组并返回元素的子集
    这里用到了数组的 filter 方法,此方法具有以下特点:
    a. 需要传入一个回调函数作为参数,此函数应返回一个布尔值。
    b. filter 执行时会对数组中的每一个元素执行一边回调函数。
    c. filter 的返回值为一个新数组,其成员为原数组中返回值为 true 的元素。
var users = allUsers.filter((user) => user.loged === true)
  1. 如何判断一个对象没有任何属性
    在 Js 中两个空对象进行比较会有什么结果呢?
var a = {}
a === {} // false

在 Js 中对 object 类型的数据应用等于操作符时,比较的是两个变量是否指向同一个引用,也就是说在内存中是否为同一个地址。

而我们期待的结果是比较两个对象在逻辑上是否具有相同的属性,空对象是一个特例,它们不具有任何属性。

if (Object.keys(search).length !== 0) {
    args = Object.assign({}, args, search)
}

这里用到 Object.keys() 方法,获取对象键的集合并判断其长度是否为 0 即可。

  1. 如何使用循环删除数组中的多个元素
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)
}
delItems.forEach ((item) => {
    allItems.splice (allItems.indexOf(item), 0)
})

ps: 此文章抄的,感觉很好想做笔记摘抄的。

上一篇 下一篇

猜你喜欢

热点阅读