js-day08

103 阅读8分钟

json

  • 前端语言有三个,分别是html、css、JavaScript
  • 后端语言有很多很多,java、php、python、go、c、c++、.net、c#、ruby、rust、node.js...

前端和后端需要相互之间传递数据,前端有自己的规范,后端每一种语言都有自己的规范,那么进行数据交互的时候成本会非常高,也非常不利于开发
为了解决数据交互的问题,有人就提出了标准化数据格式,这种数据格式每一种语言都支持,可以解决成本和不便利的问题

json:

  • json就是用于前后端数据交互的一种数据格式
  • 被绝大多数语言都支持
  • 前端开发人员来学习json成本是非常低的,因为json数据格式使用的语法就是js对象
  • json要求所有的属性名都使用双引号
  • 在js对象的外层还需要加单引号,因此说json是一种特殊的字符串类型

json转换方法

  • 把js对象转成json格式 : JSON.stringify()
  • 把json格式转成js对象 : JSON.parse()
var arr = '[{"name" : "张三", "age" : 18, "sex" : "男"}, { "name" : "李思","age" : 20,"sex": "女"}]'
console.log(arr)
console.log(typeof arr) // string
eval():

这个函数可以用来执行一段字符串形式的JS代码,并将执行结果返回

    var str = 'alert("你好啊!")'
    eval(str)

如果使用eval()执行的字符串中含有{}, 它会将{}当成代码块执行,如果不希望将其当成代码块解析,则需要在字符串前后各加一个()

var str = 'alert("你好啊!")'
eval(str)
var obj = '{a: 1}'
var res = eval(obj)
console.log(res)
var obj = eval("("+'{a:1, b:2}'+")");
console.log(obj)

xml可扩展标记语言

  • 也是一种数据格式,和json的功能是一样的,但是没有json好用,现在基本上都是在使用json
  • xml语法和html语法一样的
  • xml数据结构采用的是html标记形式,只不过它的标记可以自定义,而html标记不能自定义,是规定好的

xml和json区别

  • json是轻量级
  • xml使用起来相对比较麻烦
  • json处理数据速度更快

ES5严格模式 'use strict'

  • 全局严格模式,把进入严格模式的代码放在全局作用域的最顶端
  • 局部严格模式,把进入严格模式的代码放在函数里面
    • 全局变量声明时,必须加关键字(var)
    • 函数内不允许出现重名参数
    • arguments对象不允许被动态改变
    • 不允许使用arguments.callee
    • 注意点:arguments.callee()在ES5的版本中被废弃掉了

this对象

  • 指的是函数执行上下文对象
  • this是函数内部隐含的一个参数,它会根据函数的调用方式不同而指向不同的对象
  • 作用:最大的作用就是根据函数调用方式不同,指向的对象不同
  • 规则:
    • 函数名称加括号调用函数时,this指向的是window。在ES5严格模式下,通过这种方式this是无法执行全局对象window的
    • 当通过对象调用函数的时候,里面的this指向的是当前的对象
    • 当通过事件调用函数的时候,里面的this指向的是当前事件的调用者
'use strict'
 function fn(){
     console.log(this) // window  
                       // ES5严格模式下是 undefined
 }
 fn()
var obj2 = {
    name: '王成',
    running(){
        // console.log(this)
                console.log(this.name + '喜欢晚上去公园里面跑步!')// 王成喜欢晚上去公园里面跑步!
     }
 }
 obj2.running()

提示:通过标记名称获取元素,结果是一个伪数组
需求:当点击那个元素的时候改变其背景颜色
注意:在js里面使用css属性,只需要把属性连接的中划线修改为小驼峰命名即可

<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>

通过标记名称获取元素,结果是一个伪数组

通过遍历伪数组来快速绑定事件

var aBtn = document.getElementsByTagName('button')
/*
    问题:在事件处理函数里面获取不到最新的i的值
    原因:事件是只有咱们触发了才会去调用事件处理函数,循环是不会等待事件触发后再去执行的,因此出现了,循环先执行完毕,后执行的事件,因此拿到不到i的值
    规则:当事件处理函数在循环里面的时候,会先执行完毕循环后,再去执行事件处理函数
*/

// 循环执行完毕了,在外面拿到的肯定是不满足的值
for(var i=0; i<aBtn.length; i++){}
// console.log(i) // 5

for(var i=0; i<aBtn.length; i++){
    // console.log("2");
    aBtn[i].onclick = function(){
        console.log("1");
        aBtn[i].style.backgroundColor = 'orange'
        // console.log(aBtn[i]) // undefined
        // console.log(i) // 5
    }
}
/*
    排他思想:先清除所有的样式,再给自己设置
*/
for(var i=0; i<aBtn.length; i++){
    aBtn[i].onclick = function(){
    //    for(var j=0; j<aBtn.length; j++){
    //         // aBtn[j].style.backgroundColor = ''
    //    }
        console.log(this);
        this.style.backgroundColor = 'hotpink'
    }
}

ES5数组方法

indexOf(data,start):
  • 接收两个参数:要查找的项和(可选的)表示查找起点位置的索引
  • 注意:进行查找的时候只能找到这个元素第一次在数组中出现的位置。如果没有找到那么返回-1
var arr = ['a', 'b', 'c', 'b', 'h', 's', 'b']
var index = arr.indexOf('b', 4)
var index1 = arr.indexOf('l')
console.log(arr[index])
console.log(index)

// lastIndexOf() 从后面往前面进行查找
var arr = ['a', 'b','h', 'b','d', 'h', 's', 'b']
console.log(arr.lastIndexOf('b', 5))

findIndex():
  • 查找数组元素的位置的,但是它里面可以写条件
  • 参数是一个回调函数
  • 回调函数参数
    • 参数1表示的是当前数组的元素
    • 参数2表示的是当前数组元素的下标
    • 参数3表示的是当前数组
var index = list.findIndex(function(item){
    return item.id == 2
})
list[index].cart_num = 1;
console.log(list)
var list = [
    {
        id: 1,
        title: 'Xiaomi 14 Pro',
        price: 4999,
        cart_num: 0
    },
    {
        id: 2,
        title: 'Xiaomi 14',
        price: 3999,
        cart_num: 0
    },
    {
        id: 3,
        title: 'Redmi Note 13 Pro',
        price: 1399,
        cart_num: 0
    }
]

var index = list.findIndex(function(item){
    return item.id == 2
})
console.log('index:',index)
list[index].cart_num = 1
console.log(list)
forEach():
  • 循环 对数组进行遍历循环,对数组中的每一项运行给定函数。这个方法没有返回值
  • 参数是一个回调函数
  • 回调函数参数
    • 参数1表示的是当前数组的元素
    • 参数2表示的是当前数组元素的下标
    • 参数3表示的是当前数组
  • 注意:forEach是没有返回值的
var arr = [10, 3, 2, 1, 7, 8]
var newArr = []
arr.forEach(function(item){
    item *= (1+0.3)
    newArr.push(item)
})
console.log(newArr)
map():
  • 会遍历当前数组,然后调用参数中的方法,返回当前方法的返回值。
  • map可以改变当前循环的值,返回一个新的被改变过值之后的数组(map需return),一般用来处理需要修改某一个数组的值。映射
  • 参数是一个回调函数
  • 回调函数参数
    • 参数1表示的是当前数组的元素
    • 参数2表示的是当前数组元素的下标
    • 参数3表示的是当前数组
var data = [
    {
        id: 1,
        name: '成',
        age: 18,
        phone: 18600614567
    },
    {
        id: 2,
        name: '俊骏',
        age: 20,
        phone: 18300614566
    }
]
var res = data.map(function(item){
    // return item.phone
    // return item.name
    return item.name += 'vip'
})
console.log(res)
filter():
  • 遍历和过滤。返回符合条件的元素的数组。filter需要在循环的时候判断一下是true还是false,是true才会返回这个元素
  • 参数是一个回调函数
  • 回调函数参数
    • 参数1表示的是当前数组的元素
    • 参数2表示的是当前数组元素的下标
    • 参数3表示的是当前数组
var data = [
    {
        id:1,
        name:'泥甘哞',
        age:'18'
    },
    {
        id:2,
        name:'梅狸猫',
        age:'20'
    },
    {
        id:3,
        name:'蔡徐坤',
        age:'23'
    }
]
var res = data.filter(function(item){
    return item.age > 18
})
console.log(res)

模糊搜索功能

includes() 字符串方法,查找到字符串里面是否有满足条件的,只有有就返回true

var res = data.filter(function(item){
    return item.name.includes('猫')
})
console.log(res)
// includes() 字符串方法,查找到字符串里面是否有满足条件的,只有有就返回true
var str = 'abc'
console.log(str.includes('b'))

实例练习:去重

var arr = ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'f', 'd', 's', 'd', 's']
// indexOf()只会查找数组元素第一次在数组中出现的位置
var res = arr.filter(function(item, index){
    //     'a' 0 == 0
    //     'a' 0 == 1 不满足
    //     'a' 0 == 2 不满足
    //     'b' 3 == 3 满足
    //     'b' 3 == 4 不满足
    // console.log(index)
    // console.log('--------')
    // console.log(arr.indexOf(item))
    return arr.indexOf(item) == index
})
console.log(res)
find():
  • 根据条件返回数组中满足条件的数组元素,但是返回是当前的数组元素,不会放在一个新数组里面
  • 参数是一个回调函数
  • 回调函数参数
    • 参数1表示的是当前数组的元素
    • 参数2表示的是当前数组元素的下标
    • 参数3表示的是当前数组
var res1 = data.filter(function(item){
    return item.id == 2
})
console.log(res1)
var res = data.find(function(item){
    return item.id == 2
})
console.log(res)

字符串创建

字面量

var str = 'hello'

构造函数

var str = new String('hello')
console.log(str)
console.log(typeof str) // object

包装类

var str = String('hello')
console.log(str)
console.log(typeof str) // string
js使用属性和方法规则:

规定基本数据类型是无法使用属性和方法的,只有引用数据类型才能使用属性和方法

包装类类型:
  • 基本数据类型无法使用属性和方法的,但是有时候需要让基本数据类型使用属性和方法,但是又不能违法规则,因此提出了包装类
  • 当基本数据类型在使用属性和方法的时候,会先把基本数据类型转成引用数据类型,当你使用完毕后再转成基本数据类型(自动)
包装类
  • String()
  • Number()
  • Boolean()