关于HarmonyOS的学习
day19
一、review
1.filter()返回满足条件的数组元,会把数组元素放在一个新的数组里面返回,也可以返回多个满足条件的数组元素(结果:数组) filter()返回满足条件的数组元,直接返回是满足条件当前的数组元素。只能返回满足第一个数组元素(结果:数组元素) includes() 字符串、数组都能使用,如果有满足条件的直接返回true,不满足返回false(结果:布尔值)
2.直接给空字符串去进行查找,相当于让它没有条件进行查找,因此直接返回原来的数据 console.log(item.title.includes('')
如果传递参数为空字符串那么它什么都不会做 console.log('abc'.includes(''))
二、子字符串
包含在一个字符串里面的字符,规定了每一个字符串里面都默认存在一个空白字符串作为子字符串。如果没有任何其他的字符串的时候,就会把空字符串作为字符串。如果有其他字符的情况下,空字符串默认也是存在的,只是看不到而已。
三、把查询字符串转为对象
var queryStr = 'https://www.baidu.com?username=zhangsan&password=123' function transiformationObj(url){ var str = url.split('?')[1] var arr = str.split('&') var obj = {} arr.forEach(function(item){ var newStr = item.split('=') obj[newStr[0]] = newStr[1] }) return obj } console.log(transiformationObj(queryStr))
四、副本问题
// forEach() 里面的item问题 var arr = [10, 3, 6] // item只是对数组元素进行了复制,可以把它当成副本。并不是真正的数组元素,所以你改变不了 arr.forEach(function(item, index){ // item *= 1.3 arr[index] *= 1.3 }) console.log(arr)
五、把对象转为查询字符串
// 把对象转成查询字符串 var obj = { username: 'zhangsan', password: '123' } // 声明一个空的字符串 var str = '?' // 遍历对象 for(var key in obj){ str += key + '=' + obj[key] str += '&' } str = str.slice(0, -1) console.log(str)
六、判断数组中是否有num这个元素,返回布尔类型
var num = prompt('请输入一个数字?') var arr = [1, 3, 6] function isNum(arr, num){ for(var i=0; i<arr.length; i++){ if(arr[i] == num){ return true } } return false } var result = isNum(arr, num) console.log(result)
七、计算下标为奇数的平均数
var arr = [2, 4, 8, 3, 7, 6, 9] var sum = 0 var count = 0 for(var i=0; i<arr.length; i++){ if(i%2!=0){ sum += arr[i] count++ } } console.log(sum/count)
八、统计字符串的个数
// var str = 'aaabbcccddffjkkadhfsseagugfbgdmfsvcvfed' // 思路:把字符串里面的字符当成对象的键,把个数当成值 // 声明一个空对象 // var obj = {a: 1} // 问题1:怎么把字符串里面的字符取出来?语法:str[0] 或者 str.charAt(0) // console.log(str[0]) // 问题2:怎么把字符串里面取出来的字符设置给对象呢?语法:obj[str[0]] // obj[str[0]] = 1 // console.log(obj) // 问题3:怎么把对象里面的属性值自增呢?语法:obj['a']++ 或者 obj[str[0]]++ // obj['a']++ // obj[str[0]] = 1 // obj[str[0]]++ // 问题4:怎么判断一个对象里面是否存在这个属性呢?语法:获取这个属性,如果拿到值就说明有,如果返回的是undefined就说明没有 // console.log(obj['a']) // undefined // console.log(obj['a']) // 1 // if(obj['a']){ // obj['a']++ // }else{ // obj['a'] = 1 // } // console.log(obj) // 问题5:发现字符串里面很多字符,咱们不可能一个一个去添加?可以直接使用遍历 var str = 'aaabbcccddffjkkadhfsseagugfbgdmfsvcvfed' var obj = {} for(var i=0; i<str.length; i++){ // 第一次循环:obj[str[0]] --- obj['a'] // 第二次循环:obj[str[1]] --- obj['a'],满足条件,进入判断体里面把之前的1自增为2 // 第三次循环:obj[str[2]] --- obj['a'],满足条件,进入判断体里面把之前的2自增为3 // ... if(obj[str[i]]){ obj[str[i]]++ }else{ obj[str[i]] = 1 } } console.log(obj)
九、this对象
+ 官方概念 => this指的是函数执行上下文对象 + 什么是函数执行上下 => 指的是函数的执行环境 => 函数的执行会根据不同的情况出现不同的结果 + 函数调用方式 => 函数名加括号 => 事件调用 => 对象打点调用 例如:obj.say() => ... + this具体指的是哪个对象,要根据函数的不同的调用方式来决定 + this是一个动态对象 + this指向规则 => 函数名称加括号调用函数,函数(函数执行上下文)里面的this指向的是window => 在全局作用域(全局执行上下文)里面查看this,指向的也是window => 对象打点调用函数,函数里面的this指向的是对象本身 => 事件调用函数时,函数里面的this指向的是当前的事件调用者(那个元素触发的事件,this就是那个元素) window + window是js里面最大的对象,可以理解为是”boss“ + 咱们平时声明的变量和定义的函数默认都会放在(挂载)window对象里面 + 由于window是最大的一个对象,因此平时写代码的时候可以省略不写 + 注意点 => 变量的名称不要使用name或者top,top也属于关键字或者理解为保留字的东西,打印出来就是window对象
注意点:top也属于关键字,打印出来是window对象
name默认值是一个空字符串,属于window的一个名称,但是没有给设置名称所以默认就是空字符串,实际没有必要添加
十、js代码执行机制
+ js是一个单线程的语言,所谓的单线程就是一次只能做一件事情。为什么设计成单线程呢?因为效率高 + 为了解决单线程的问题,提出一个异步执行机制 + 把代码执行进行了分类 => 同步,做完前面一件事情,再做后面的一件事情 => 异步,两件事情可以同时进行 + 同步代码 => 循环 => 其他的代码都属于 + 异步代码 => 事件 => ajax => 定时器、延时器 => ... 问题: + 循环里面有事件处理函数,当点击按钮触发事件的时候,事件处理函数里面拿不到循环每次遍历i的值 原因: + 当循环里面有事件处理函数时,代码会先把循环执行完毕后,再去执行事件处理函数里面的内容 解决方案 + 使用this */ // for循环属于同步代码 for(var i=0; i<aBtn.length; i++){ // 事件属于异步代码 aBtn[i].onclick = function(){ // aBtn[i].style.backgroundColor = 'hotpink' // 报错 // 注意点:事件调用函数时,函数里面的this指向的是当前的事件调用者(那个元素触发的事件,this就是那个元素) // console.log(this) // 需求2:当点击当前按钮的时候,其他按钮的背景颜色要取消 this.style.backgroundColor = 'hotpink' } }