博客列表 >Json和Ajax相关概念(文末有数组函数的小彩蛋)

Json和Ajax相关概念(文末有数组函数的小彩蛋)

陈强
陈强原创
2021年01月10日 19:12:26473浏览

Json概念

JSON.stringify(data,replacer,space)

JSON.stringify(data,replacer,space):将js数据转为json

  • json的数据类型是特殊格式的字符串
  1. console.log(JSON.stringify(3.14), typeof JSON.stringify(3.14));
  2. //字符串必须加""
  3. console.log(JSON.stringify("hello"), typeof JSON.stringify("hello"));
  4. //布尔值不能加""
  5. console.log(JSON.stringify(true), typeof JSON.stringify(true));

  • 对json格式字符串的特殊操作,主要通过后面二个参数;第二个参数支持数组 和 函数
  1. //数组
  2. console.log(JSON.stringify({ a: 1, b: 2, c: 3 }, ["a", "b"]));
  3. //输出{"a":1,"b":2}
  4. //Json 数组格式
  5. console.log(JSON.stringify({"a":1,"b":2,"c":3}));
  6. //输出{"a":1,"b":2,"c":3}
  7. //函数
  8. console.log(
  9. JSON.stringify({ a: 1, b: 2, c: 3 }, (k, v) => {
  10. // 将需要过滤掉的数据直接返回undefined
  11. if (v < 2) return undefined;
  12. return v;
  13. })
  14. );
  15. //输出{"b":2,"c":3}
  • 第三个参数,用来格式化输出的json字符串
  1. console.log(JSON.stringify({ a: 1, b: 2, c: 3 }, null, "****"));
  2. //输出
  3. {
  4. ****"a": 1,
  5. ****"b": 2,
  6. ****"c": 3
  7. }

JSON.parse(str,reviver),将json转为js对象

  1. let obj = JSON.parse(`{"a":1,"b":2,"c":3}`);
  • 第二个参数可以对json的数据进行处理后再返回
  1. obj = JSON.parse(`{"a":1,"b":2,"c":3}`, (k, v) => {
  2. // json对象是由内向外解析
  3. if (k === "") return v;
  4. return v * 2;
  5. });
  6. console.log(obj);
  7. //输出{"a":2,"b":4,"c":6}

Ajax概念

ajax-get

  1. <button>ajax-get</button>
  2. <p></p>
  3. <script>
  4. const btn = document.querySelector("button");
  5. btn.onclick = () => {
  6. // 1. 创建 xhr 对象:
  7. const xhr = new XMLHttpRequest();
  8. // 2. 配置 xhr 参数:
  9. xhr.open("get", "demo1.php?id=1");
  10. // 设置返回的格式为json
  11. xhr.responseType = "json";
  12. // 3. 处理 xhr 响应:
  13. xhr.onload = () => {
  14. console.log(xhr.response);
  15. let user = `${xhr.response.name} ${xhr.response.email} ${xhr.response.password}`;
  16. document.querySelector("p").innerHTML = user;
  17. };
  18. xhr.send(null);
  19. };
  20. </script>

ajax-post

  1. const form = document.querySelector(".login form");
  2. const btn = document.querySelector(".login button");
  3. const tips = document.querySelector(".tips");
  4. btn.onclick = (ev) => {
  5. // 建立xhr对象
  6. const xhr = new XMLHttpRequest();
  7. // 设置传输格式post
  8. xhr.open("post", "demo2.php");
  9. //处理 xhr 响应
  10. xhr.onload = () => {
  11. tips.innerHTML = xhr.response;
  12. };
  13. //发送xhr数据
  14. xhr.send(new FormData(form));
  15. };

Cors 跨域概念

cors: 跨域资源共享

  • 同源策略: 为请求的安全,浏览器禁止通过脚本发起一个跨域的请求
    • 只允许通过脚本发起基于同源的请求
    • 同源指: 协议相同,域名/主机名相同,端口相同

ajax-get-cors

  1. <button>ajax-get-cors</button>
  2. <p class="tips"></p>
  3. <script>
  4. // cors: 跨域资源共享
  5. const btn = document.querySelector("button");
  6. const tips = document.querySelector(".tips");
  7. const btn = document.querySelector("button");
  8. btn.onclick = ev => {
  9. // 1. 创建 xhr 对象:
  10. const xhr = new XMLHttpRequest();
  11. // 2. 配置 xhr 参数:
  12. xhr.open("get", "http://world.io/cors1.php");
  13. // 3. 处理 xhr 响应:
  14. xhr.onload = () =>
  15. (document.querySelector("p").innerHTML = xhr.response);
  16. // 4. 发送 xhr 请求:
  17. xhr.send(null);
  18. };
  19. </script>

ajax-post-cors

  1. <button>ajax-post-cors</button>
  2. <p class="tips"></p>
  3. <script>
  4. // cors: 跨域资源共享
  5. const btn = document.querySelector("button");
  6. const tips = document.querySelector(".tips");
  7. btn.onclick = ev => {
  8. // 1. 创建 xhr 对象:
  9. const xhr = new XMLHttpRequest();
  10. // 2. 配置 xhr 参数:
  11. xhr.open("post", "http://world.io/cors2.php");
  12. // 3. 处理 xhr 响应:
  13. xhr.onload = () => (tips.innerHTML = xhr.response);
  14. // 4. 发送 xhr 请求:
  15. let formData = new FormData();
  16. formData.append("email", "admin@php.cn");
  17. formData.append("password", "123456");
  18. xhr.send(formData);
  19. };
  20. </script>
  21. //跨域文件头设置 *为全部同意,可以设置单独的域名只允许这个域名
  22. header('Access-Control-Allow-Origin: *');

jsonp-cors

  • jsonp 原理
  1. function getUser(data) {
  2. console.log(data);
  3. let user = data.name + ": " + data.email;
  4. document.querySelector("p").innerHTML = user;
  5. }
  • 举例
  1. const btn = document.querySelector("button");
  2. btn.onclick = () => {
  3. // 1. 动态生成一个允许跨域请求的html元素
  4. let script = document.createElement("script");
  5. // 2. 将跨域请求的url添加到src属性上
  6. script.src = "http://world.io/cors3.php?callback=getUser";
  7. // 3. 将script挂载到页面中
  8. document.body.insertBefore(script, document.body.firstElementChild);
  9. };

数组常用方法

栈和队

栈: 后进先出
队: 先进先出
他们是仅允许在一端进行增删的数组

  • 声明空数组
  1. let arr = [];
  • push(),pop()在数组的尾部进行增删
  1. //输出3,为添加的元素个数
  2. console.log(arr.push(1, 2, 3));
  3. //从尾部开始删除,每次删除一个元素
  4. console.log(arr.pop());

  • unshift(), shift()在数组的头部进行增删
  1. //输出3,为添加的元素个数
  2. console.log(arr.unshift(1, 2, 3));
  3. //从头部开始删除,每次删除一个元素
  4. console.log(arr.shift());

  • push()+shift(): 模拟队列, 尾部进入,头部出去
  1. console.log(arr.push(4, 5, 6));
  2. console.log(arr.shift());
  3. console.log(arr.shift());
  4. console.log(arr.shift());

  • pop()+unshift(): 模拟队列, 头部进入,尾部出去
  1. console.log(arr.unshift(4, 5, 6));
  2. console.log(arr.pop());
  3. console.log(arr.pop());
  4. console.log(arr.pop());
  • join(): 与字符串的split()相反,将数组转为字符串返回
  1. arr = ["iphone", "vivo", "huawei"];
  2. let res = arr.join("--");
  3. console.log(res);
  4. //输出 iphone--vivo--huawei
  5. //可以把字符串用数组方式输出
  6. let str = "china";
  7. console.log(str[0], str[1], str[2]);
  8. //输出 c h i
  • concat()数组合并
  1. console.log("hello".concat(" word"));
  2. //输出 hello word
  3. console.log([1, 2, 3].concat("hello").concat({ x: 1, y: 2 }));
  4. //输出[1, 2, 3, "hello", {…}]
  5. //不论内容是什么,都会被合并成数组
  • slice(): 返回数组中的部分成员
  1. arr = [1, 2, 3, 4, 5];
  2. console.log(arr.slice(0, 3));
  3. //输出[1,2,3]:从索引0位置开始,取3个元素
  4. console.log(arr.slice(-4));
  5. //输出[2,3,4,5]:从结尾位置开始,取4个元素
  • splice(开始索引,删除的数量,插入的数据…): 数组的增删改,它的本职工作是删除元素
  1. arr = [1, 2, 3, 4, 5];
  2. console.log(arr.splice(2));
  3. //输出[3,4,5]:从索引2的位置开始,后边的都删除
  4. console.log([1, 2, 9, 8, 7]);
  5. //输出[3,4,5]:从索引2的位置开始,后边的都删除
  6. res = arr.splice(2, 2, ...[8, 99]);
  7. console.log(arr);
  8. //输出[1, 2, 8, 99, 5]:第一个2表示从索引2位置开始,第二个2表示替换几个元素
  9. res = arr.splice(1, 0, ...[88, 99]);
  10. //第二个数字为0表示不替换,只新增
  • 排序 sort()
  1. arr = ["a", "z", "o", "p", "w"];
  2. res = arr.sort();
  3. console.log(res);
  4. //输出["a", "o", "p", "w", "z"]:字母按照顺序排列
  5. arr = [1, 99, 89, 7, 64, 57];
  6. res = arr.sort();
  7. console.log(res);
  8. //输出[1, 57, 64, 7, 89, 99] :数字排序只针对第一个数字
  9. //解决办法 [1, 7, 57, 64, 89, 99]
  10. arr.sort((a, b) => a - b);
  • forEach 遍历
  1. arr = [1, 2, 3, 4, 5];
  2. arr.forEach(item => console.log(item));
  3. //map方法
  4. res = arr.map((item) => item * 2);
  5. console.log(res);
  6. //输出[2,4,6,8,10]
  • filter过滤
  1. //过滤掉偶数
  2. arr = [1, 2, 3, 4, 5];
  3. res = arr.filter((item) => item % 2);
  4. console.log(res);
  5. //过滤掉奇数
  6. arr = [1, 2, 3, 4, 5];
  7. res = arr.filter((item) => !(item % 2);
  8. console.log(res);
  • reduce归纳
  1. arr = [1, 2, 3, 4, 5];
  2. res = arr.reduce((prev, curr) => prev + curr);
  3. console.log(res);
  4. //输出15:1+2+3+4+5
  5. res = arr.reduce((prev, curr) => prev + curr,1000);
  6. //输出1015,第二个值为默认开始值
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议