js=es+dom+bom,dom和bom前面已经讲完了

es是js的本体,是指数据类型,和对于数据的操作手段,他的版本更新得很快

这些功能不是html文件提供的,也不是浏览器提供的,即使脱离了dom和bom,在nodejs服务器端,es照常使用,照样运行,他是最底层的操作方式,所有的js框架都是基于es的api封装的,包括前端的三大框架,vue,react,anglues;所以框架可以不学,es的更新一定要跟上,跟不上es的更新就真的落伍了,而且es学得好,框架什么的上手特别的快

数据类型在所有电脑语言上都是一样的,js有数字,有字符串,java有,php有,python有,而且连操作方法都几乎是一样的,虽然写法不一样,但原理相同,所以懂一个语言去学另一个速度飞快

es是写在script标签里或者js文件里的,否则不会被识别

》》正式内容(这一篇只会讲es第五代和五代以下的内容)

声明

声明就是被一个数据起名字的意思

  1. // 把数字123叫做aa
  2. var aa = 123;
  3. // 把字符串123叫做bb
  4. var bb = "123";
  5. // 后续可以直接用aa,bb进行操作,并且数据被aa和bb的名字锁住了,于是可以反复操作

es5总共有数据类型是

  • number 数字类型,整数,小数,没内容可讲
  • Boolean 布尔类型,只有true/false
  • string 字符串
  • RegExp 正则表达式
  • date 日期
  • math 数学
  • array 数组
  • object 对象
  • function 函数/方法
  • json/xml
  • error 错误

如何检查数据类型

有三种方法

  1. typeof "aa"
  2. "aa" instanceof String
  3. Object.prototype.toString.call("aa")

前两种验证都有漏洞,用第三种,具体看面试题二

number

  1. // 精度丢失
  2. // 为了应付这种情况,需要乘法要套一层四舍五入
  3. console.log(0.7*0.1) //0.06999999999999999
  4. console.log(0.7*0.7) //0.48999999999999994
  5. // 解决方案,都乘以100,1000后变成整数再计算

boolean

常用在判断是不是第一次执行,也就是只有对错的判断上使用

  1. // true 和 false 不能加双引号""
  2. var isCan = true;
  3. isCan = false;
  4. // 取反
  5. isCan = !isCan;

String

字符串用双引号""声明,用单引号''也行,只是java的字符串只能用双引号,做个习惯记忆

  1. var str = "a1b2c3d4";
  2. // 字符串的长度
  3. str.length
  4. // 拼接字符串,加等于+=是逻辑运算符,下面会讲
  5. str += "e5f6" + "...";
  6. str.concat("e5f6","...") //参数是无限的
  7. // 如果数据里有相同的引号会出错
  8. // 比如 str = "aa"666"
  9. // 他会把"aa"当做一部分然后666"没办法被识别这是什么意思,于是报错,需要转义
  10. str = "aa\"666"
  11. // 【\】斜杆在字符串里用于转义他的后一位,然后自己消失,那怎么才能让斜杆出现在字符串里呢,用斜杆转义斜杆
  12. str = "aa\\666"
  13. // 转义最常用的就是在拼接标签元素时
  14. str = "<div style=\"width=100px\" onclick=\"click(\"aa\")\">哈哈</div>"
  15. // 字符串的拼接不能直接换行,换行需要用加号收尾,而且这样的转义太恶心,也很难理解
  16. // 但是在新es还有更简易的方法,查看《es678910篇》
  17. // 字符串的切割split,会改变原值,支持正则
  18. // 是一个从开始到结尾的循环,只要找到符合条件的,会切割,然后判断切割前后是否都有数据,没有会补上一个空字符串
  19. var str = "aaxaa"
  20. str.split("x") // ["aa","aa"]
  21. var str = "xaax"
  22. str.split("x") // ["","aa",""]
  23. // 字符串的替换,不会改变原值,所以需要新声明,返回的是新字符串
  24. // 把str里的第一个找到的x改成y
  25. var newStr = str.replace("x","y")
  26. // 如果要改所有的x,不是第一个,使用正则,第一个参数支持正则
  27. var newStr = str.replace(/x/g,"y")
  28. // 第二个参数可以是函数,可以做更多的处理,比如所有的数字加一,所有的字母大写,但需要返回值
  29. var newStr = str.replace(/\d/g,function(x){ return x+1; })
  30. // 字符串的大小写,不会改变原值,所以需要新声明,返回的是新字符串
  31. var newStr = "1a2x45".toUpperCase()
  32. var newStr = "X66L6".toLowerCase()
  33. // 去除字符串两边的空格,不会改变原值,所以需要新声明
  34. var newStr = " 666 ".trim() // "666"
  35. // 找出想要的某些数据match,不会改变原值,所以需要新声明,返回的是数组
  36. // 可以传字符串,但是这个函数是设计给正则使用的,传字符串毫无意义,
  37. // 常用在把日期的数字取出来,重新改格式
  38. var arr = "2019-11-05".match(/\d+/g) //["2019","11","05"]
  39. // 转码加密加密,用于把字符串里的特殊符号
  40. encodeURIComponent(",/?:@&=+$#"); // %2C%2F%3F%3A%40%26%3D%2B%24%23
  41. decodeURIComponent("%2C%2F%3F%3A%40%26%3D%2B%24%23") // ",/?:@&=+$#"

RegExp

正则是用来操作字符串的,除了上面String里出现的split,match,replace外

正则需要去记住背诵他的操作方式,表达式怎么写,可以百度,如果能手写就更牛逼了

全面的笔记查看《正则RegExp》笔记

  1. // 声明正则
  2. var reg = /\d/
  3. var reg = new RegExp("/\d/")
  4. // 检查正则的格式对不对,test方法,返回的是boolean
  5. // 常用来检查电话号码,邮箱,身份证
  6. /\d/.test(1)
  7. reg.test(2)

Date

  1. // 当前时间对象
  2. var date = new Date();
  3. // 当前时间戳
  4. var now = new Date().getTime()
  5. // 当前时间的详细信息
  6. now.getFullYear() // 年份(4位,1970)
  7. now.getMonth() // 月份(0-11,0代表1月,用的时候记得加上1)
  8. now.getDate() // 日(1-31)
  9. now.getTime() // 时间戳(从1970.1.1开始的毫秒数)
  10. now.getHours() // 获取小时数(0-23)
  11. now.getMinutes() // 分钟数(0-59)
  12. now.getSeconds() // 秒数(0-59)
  13. now.getDay() // 星期几(0-6,0代表星期天)
  14. // 这个月第一天0点时刻
  15. var monthBegDate = new Date(now.getFullYear(),now.getMonth(),1)
  16. // 这个月最后一天0点时刻
  17. let monthEndDate = new Date(date.getFullYear(),date.getMonth() + 1,0)
  18. // 日期转时间戳
  19. // str支持的格式有"2019-06-11 12:12:50" 或者 "2019/06/11 12:12:50"
  20. // 但是第一个横杆拼接的数据苹果手机api不识别,统一用第二种,还有其他兼容查看兼容篇
  21. var time = new Date(str).getTime()

Math

  1. // 字符串转数字,最准确,但是是骚操作,
  2. // 不能用加号,加号除了是数学运算符,还能拼接字符串,自带强转类型的缺点
  3. "15.11" - 0
  4. // 丢弃小数部分,保留整数部分,这个不是Math的方法,传(字符串 | 数字)都行
  5. parseInt("2.75")
  6. // 向上取整,有小数就整数部分加1 ,传(字符串 | 数字)都行
  7. Math.ceil("2.15")
  8. // 向下取整,传(字符串 | 数字)都行
  9. Math.floor("2.75")
  10. // 四舍五入,传(字符串 | 数字)都行
  11. Math.round("2.4")
  12. // 去小数点后几位,没有会留0,最后一位数字会四舍五入
  13. (21.5).toFixed(2) // 21.50
  14. (21.55).toFixed(1) // 21.6
  15. // 随机数
  16. Math.random()
  17. // max | min,可以无限传
  18. Math.max(10,"4",8)
  19. Math.min(10,"4",8)
  20. // 知识点apply,让max和min支持传 数组
  21. Math.max.apply("",[10,"4",8])
  22. Math.min.apply("",[10,"4",8])

Array

有序的有长度的有很多数组方法的特殊对象,是复杂数据类型

  1. // 用构造函数的方式去创建数组
  2. var arr = new Array(1,2,3)
  3. // 简易写法,这其实也是调用了构造函数的方法,跟上面一样的,这叫语法糖
  4. var arr = [1,"2",["a","b"],"c",{name:"name",age:18}];
  5. // 数组的长度
  6. arr.length
  7. // 存入数据,可以无限传
  8. arr.push("d","e","f")
  9. // 快速合并,方式一
  10. arr.push.apply(arr,[1,2,3])
  11. // 跟上面实际是一样的
  12. Array.prototype.push.apply(arr1, arr2);
  13. // 存入多个数据,方式二
  14. arr.concat([1,2,3])
  15. // 新es还有更简易的方法,查看新es篇
  16. // 数组转字符串, 对象数据类型不适合转字符串
  17. // 方式一,join,参数决定了拼接间隔
  18. [1,"2",["a",[2],"b"],"c"].join(",") //"1,2,a,2,b,c"
  19. // 方式二,toString,是用逗号拼接的,还能自动解开多维数组
  20. [1,"2",["a",[2],"b"],"c"].toString() //"1,2,a,2,b,c"
  21. // 排序英文单词
  22. arr.sort()
  23. // 排序数字,sort会把数字转字符串在排序,不行,需要二次封装一下
  24. arr.sort(function(x,y){ return x-y });
  25. // 反转数组
  26. arr.reverse()
  27. // 添加/删除/替换
  28. arr.splice(start,deleteNum,...add)
  29. // 删除数组的第一个元素,并返回被删掉的值
  30. arr.shift()
  31. // 删除数组的最后一个元素,并返回被删掉的值
  32. arr.pop()
  33. // 查找数组中某元素的第一个索引值。[不改变原数组] 如果没有就返回-1
  34. arr.indexOf("xx")
  35. // 这个方式有些特殊数据找不到,新es里有新方法
  36. // 数组的循环(for,forEach)
  37. // js里有一期关于遍历的总结,去哪里看吧

谈一谈伪数组

伪数组Array-Like,是带有数字序号以及length属性的对象格式

打印出来的时候看着跟数组一样,但是数组的很多方法伪数组是没有的

最常见的伪数组是document.querySelectorAll取到的伪数组,dom元素的自定义属性以及所有参数arguments伪数组

  1. // 常见伪数组一
  2. Object.prototype.toString.call(document.querySelectorAll('div')) // [object NodeList]
  3. // 常见伪数组二
  4. function xx(){
  5. Object.prototype.toString.call(arguments) //[object Arguments]
  6. }
  7. xx(1,2,3,4)
  8. // 常见的伪数组三
  9. document.querySelector('#aa').attributes
  10. // 还有这个也是伪数组
  11. var arrayLike = {
  12. '0': 'a',
  13. '1': 'b',
  14. '2': 'c',
  15. length: 3
  16. };
  17. // 除了用正常的办法鉴别伪数据,也可以执行一下forEach,伪数组没有forEach的方法
  18. // 这也是为什么document.querySelectorAll取到的数据没办法forEach的原因
  19. // 伪数组转数组
  20. // 方法一,创建一个数组,原生for循环依次存进去
  21. // 方法二,用call
  22. Array.prototype.slice.call(伪数组)
  23. // 新es还有更简易的方法,查看新es篇

Object

无序的无长度的,键值对(key-value)格式的数据储存模式,复杂数据类型

你能遇到的对象有window对象,dom对象,自己创建的对象(来自自定义构造函数)

对象有属性(专业点叫静态属性)和方法(专业点叫静态方法)和原型属性和原型方法

  1. // 这是用构造函数去创造对象
  2. var obj = new Object();
  3. // 简易写法,这其实也是调用了构造函数的方法,跟上面一样的,这叫语法糖
  4. var obj = {name:"name",age:18,str:"aa666bb",obj:{},arr:[1,2,3]}
  5. // 取值
  6. obj.name
  7. obj["name"]
  8. // 可以传参,但不能加双引号,也不能直接用点【.】
  9. var a = "name";
  10. obj[a]
  11. // 判断有没有这个key,答案是(true/false),如果直接用取值去判断,没有会得到underfind
  12. console.log(key in obj)
  13. // 有就修改,没有就添加
  14. obj.name = "newName"
  15. obj["name"] = "newnewName"
  16. var a = "name";
  17. obj[a] = "newnewnewName"
  18. // 执行对象的方法
  19. obj.say()
  20. // 查看对象的原型,返回是对象格式,获取原型对象的属性,执行原型对象的方法【同上】
  21. obj.__proto__
  22. // 删除key-value
  23. delete obj.name
  24. // 多层也一样
  25. delete obj1.obj2.name
  26. // 对象的遍历,虽然对象没有长度,但也能循环
  27. // for-in,往下看有关于遍历的
  28. // 这个返回一个key的无序数组
  29. Object.keys(obj)
  30. // 对象的合并
  31. // 只能通过上面的遍历方式往另一个对象添加
  32. // 对象的一个神级API
  33. Object.defineProperty(obj,key, handle)
  34. // 这个牛逼的地方就在于它是Vue2.0的设计核心,这个放在《vue的设计原理》说

Function

function叫函数,也叫方法,他的参数写在中括号里,他的内容在大括号里,他自带作用域(函数作用域),并且函数被执行时有个隐藏的this对象,在dom就说过,一切的函数执行都有执行者,执行者就是函数内部隐藏的this对象

  1. // 声明一个函数
  2. var init = function(){ ... }
  3. function init(){ ... }
  4. var init = new Function(["canshu1","canshu2"],`console.log(arguments)`)
  5. // 两种声明方式用第二种,第一种有变量提升的缺点
  6. // 参数,js的参数是无限的,什么类型都能传
  7. // 实参,实参在括号里拿,如果没有就是underfind,如果数量不够就拿不到
  8. function init(x,y){ console.log(x,y) }
  9. init(1) //x是1,y是underfind
  10. init(1,2,3) // 第三个拿不到
  11. // 形参,形参就是不需要从中括号里拿的,在作用域里有一个隐藏的值叫arguments
  12. // 就是上面说过的伪数组之一
  13. function init(){ console.log(arguments) } //[1,2,3]
  14. init(1,2,3)
  15. // 自执行函数,window加载就会自动执行,不需要名字,匿名
  16. // 自执行函数被用来制造插件
  17. // 自执行函数也是第一版本的全局变量安全作用域
  18. (function(){ ... })();
  19. // 构造函数
  20. // 构造函数是保存作用域变量,用来批量生产统一格式但内容不同的对象,是一个对象的生产工厂
  21. // 构造函数是用new去执行的,new命令把函数的静态属性/方法,原型属性/方法赋予一个空对象
  22. // 一般来说静态用添加属性,原型添加方法
  23. function User(name){
  24. // 静态属性
  25. this.name = name;
  26. // 静态方法
  27. this.say = function(){ ... }
  28. }
  29. // 原型属性
  30. User.prototype.prototypeName = "proName";
  31. // 原型方法
  32. User.prototype.prototypeSay = function(){ ... }
  33. // new一个对象,这个user就是上面对象部分的截图
  34. var user = new User("pdt")
  35. // 查看function的原型,返回格式是对象,可以往里面添加属性和方法
  36. User.prototype
  37. // 跳出function执行
  38. return;
  39. // 其实最上面的声明function的写法也是一种语法糖,function是可以用构造函数创造的
  40. // 没错function也是一个对象,是一个畸形的变异的对象
  41. var init = new Function()
  42. // 因为function是对象,所以他有自己的属性和方法,继承自Function
  43. // function的原型上有个name属性是指这个function的名字
  44. // function的原型上还有apply,call,bind三个改变执行者的方法
  45. // 在上面的笔记里有Array.prototype.slice.call() 和 Math.max.apply() 就是执行了Function的方法
  46. // 这些方法不常用,但是要知道,详细查看《上下文和作用域》

新手建议 如果你不想制作一些BUG出来加班,声明函数都写在最高级的作用域里,不要在函数里声明函数,不要在if或者for里声明函数,函数可以在任何需要执行的地方并且可以执行的地方调用,但是不是说可以在任何地方声明的,否则后果自负

JSON/XML

前后端数据交互的数据格式,为什么要存在着两种格式,因为语言不通,前端直接往后端甩一个对象{}或者一个数组[] ,后端是不识别的,而共同的数据格式是JSON和XML

在最开始是用xml用标签的格式去传的

  1. <name>pdt</name>
  2. <age>18</age>

后来xml不好写,而且数据量大,升级成了json

  1. // json可以长这样
  2. var json = '{"name":"pdt","age":18,"arr":[1,"2","tom"]}'
  3. // json也可以长这样
  4. var json = '[1,2,{"name":"pdt"}]'

注意,json不是对象,也不是数组,他是字符串,是字符串

ajax篇里说的能传递复杂数据类型方式就是用post-json,因为那个上传方式是把数据转成了一个json字符串,后端拿到一个字符串后可以用自己的方法拆成他看得懂的格式

  1. // 由对象转字符串
  2. JSON.stringify({
  3. name: "name",
  4. age: 18
  5. })
  6. // 由数组转字符串
  7. JSON.stringify([1,"2","tom"])
  8. // 由字符串转对象,最两边不能是双引号
  9. JSON.parse('{"name":"pdt","age":18,"arr":[1,"2","tom"]}')
  10. // 由字符串转数组,最两边不能是双引号
  11. JSON.parse('[1,2,{"name":"pdt"}]')

注意,JSON.stringify() 的参数是有规定的,这个参数内容必须是有限的,也就是有尽头的,什么是没有尽头的,function,如果是一个function,或者含有function,是没法转字符串的,不信你可以试试能不能把function一层层打开直到打不开为止

Error

错误对象,抛出错误,这个对象可以用来阻断正在执行的无法return的函数,是个骚操作

  1. throw new Error("我是一个错误")

》》数学运算符

等于,加减乘除余,加加,减减

  • 等于【=】用在声明变量上作为赋值
  • 加号【+】
  1. // 当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。
  2. // 当一侧为Number类型,另一侧为原始类型,则将原始类型转换为Number类型。
  3. // 当一侧为Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接。
  4. 123 + '123' // 123123 (规则1)
  5. 123 + null // 123 (规则2)
  6. 123 + true // 124 (规则2)
  7. 123 + {} // 123[object Object] (规则3)
  • 减号【-】,普通的数学计算
  • 乘号【*】,普通的数学计算
  • 除号【/】,普通的数学计算
  • 取余【%】,取余最常用在循环判断间隔
  1. for(var i==0;i<100;i++){
  2. if(i%3==0){ ... }
  3. else if(i%3==1){ ... }
  4. else if(i%3==2){ ... }
  5. }
  • 加加【++】,加加就是加一的意思,跟加一不同的是,加加会把值添加给原值,加一不会
  1. var i = 0;
  2. i++; // 实际是指 i = i+1;
  3. i+1; // 实际是指 i+1; 没有赋值给原值
  4. // 还有一个面试题叫i++和++i的区别,一个是先加后赋值,一个是赋值后加
  • 减减【--】,同上

》》逻辑运算

大于小于

  1. // 基础用法
  2. if(a > 1){ ... }
  3. // 多条件
  4. if(a > 1 && a < 5){ ... }
  5. // 上面的多条件不能这么写
  6. if(1 < a < 5){ ... }
  7. // 为什么
  8. 1 < 2 < 5 // true
  9. 1 < 10 < 5 // true
  10. // 因为1<10 是true,true是1,1<5 所以是true

等于等于和全等于

  • 等于等于【】用在判断上,若两侧类型相同,则比较结果和=相同,否则会发生隐式转换,隐式转换表在面试题二
  • 全等于【===】用在判断上,应该习惯用这个

或者,并且

  1. // 或者【||】,这个就是一个if-else,一个个往下判断,直到找到一个true的值就返回这个值,所有到了最后一个还没有true,就返回最后一个
  2. console.log(0 || 1); //1
  3. console.log(0 || ""); //""
  4. console.log(0 || 1 || NaN ); //1
  5. // 并且【&&】,这也是一个if-else,一个个往下判断,直到找到一个false的值就返回这个值,所有到了最后一个还不是,就返回最后一个
  6. console.log(1 && 2) //2
  7. console.log(1 && 0) //0
  8. console.log(1 && 0 && 2) //0
  9. //两者并用
  10. console.log( false&&"A" || 1&&"B" || ""&&"C") //"B",自己捋捋

if-else

if是可以不写大括号的,但是别这么做,不仅不装而且很傻

  1. // 如果符合就...,如果不符合什么事都不做
  2. if(true){ ... }
  3. // 如果符合就...,如果不符合就...
  4. if(true){ ... }else{ ... }
  5. // 如果符合A就...如果符合B就...最后支持else
  6. if(A){ ... }else if(B){ ... }else{ ... }
  7. // if-if
  8. if(A){ ... }
  9. if(B){ ... }
  10. // 当两个if并列会同时判断,那个符合就执行那个,当两个同时符合会同时执行
  11. // 但是这是不建议这么写的,因为当判断量很大,逻辑很乱
  12. // 如果只想执行一个,可以改用if-else
  13. // 如果想执行多个可以改成先判断A,再A里再判断B
  14. // if的代替写法
  15. function find(color){
  16. if(color=="red"){ return "..." }
  17. else if(color=="green"){ return "..." }
  18. }
  19. // 改成
  20. function find(color){
  21. var ifObj = {
  22. "red": "..."
  23. "green": "..."
  24. }
  25. return ifObj[color];
  26. }
  27. // 0是代表false,"0"是true,""是false,underfind是false,null是false,
  28. // NaN是false,空数组[]是false,非数组![]也是false,空对象{}是false

循环

原生的循环有for,for-in

封装在数组方法上的遍历方法有forEach

更优秀的遍历方式出现在新es版本里,会有一期循环的专题

  1. // 循环数组
  2. for(var i=0;i<5;i++){ console.log(i) }
  3. // 循环对象
  4. for(var key in obj){ console.log(key,obj[key]) }
  5. // for-in会遍历原型链上的属性,需要判断
  6. if(obj.hasOwnProperty(key)){ console.log("这个key是原型属性") }
  7. // forEach,回调函数第一个参数是value,第二个参数是序号
  8. [1,2,3].forEach(function(x,index){ console.log(x,index) })

三元运算符

  1. // 如果A就X,否则Y
  2. var realSex = (sex=="1") ? "男" "女"

》》其他

变量提升

查看《js树和调试》那一篇

作用域

作用域会专门挑出来发

外层的作用域没有办法取到内层的作用域的数据

内层可以取到外层作用域的数据

这是就是如果把所有的js写在非全局作用域,比如写在一个自执行函数里,我们就没办法在F12的console调试区里取到别的作用域里的值,这也就是数据安全的第一层保护机制

目前的已知的作用域是function

  1. var a = 1;
  2. function x(){
  3. var b = 2;
  4. }
  5. console.log(a); // 1
  6. console.log(b); // underfind

队列和栈和堆

这三个是看起来高端但是一点都不高端的词

队列是一种模式,是指先进先出的一种存取模式,用数组模拟队列,就是存值用push,取值有shift,被人称为拉屎模式

栈也是一种模式,是指先进后出的一种存取模式,用数组模拟栈,就是存值用push,取值用pop,被人称为呕吐模式

堆也是一种模式,没有顺序,没有存的顺序也没有取的顺序,对象的存取就是堆模式,内存的分配也是堆模式

复杂数据类型

简单数据类型和复杂数据类型的区别就是

简单数据类型A被另一个变量引用B时,会被完全拷贝,即使修改了B的值,A的值也不会改变

  1. var A = 1;
  2. var B = A;
  3. B = B+1;
  4. console.log(B) //2
  5. console.log(A) //1

复杂数据类型因为数据量太大,拷贝成本太高,所以被重新指向的是同一个数据,这种拷贝叫浅拷贝

  1. var A = {
  2. name:"tom"
  3. age:18
  4. }
  5. var B = A;
  6. B.age = 19;
  7. console.log(B.age) //19
  8. console.log(A.age) //19
  9. // 数组和对象和函数都属于复杂数据类型
  10. // 但是也有需要用到完全拷贝的情况,所以就有了一个技术叫【深拷贝】
  11. // 深拷贝的最简单应用就是JSON
  12. // 把数据改成字符串再改回来,就跟原来灯独立了
  13. // 有个缺点是JSON不能操作无限无尽的数据,所以JSON只是个骚操作
  14. // 要完全适用所有的格式拷贝,是个很高深的学问,需要判断很多的数据类型
  15. var B = JSON.parse(JSON.stringify(A));

实战:array 和 object 的灵活应用

需求是:页面上要显示一个列表,列表需要有删除功能,当请求数据获得一个装着10个对象的数组,每个对象都有id,name等详细数据,我们把数组循环,显示到页面上,要求用户操作后最后一次性把数据提交

首先应该把请求到的数据存起来,看到这样的需求,我一开始想在按钮上添加序号,当点击按钮时获取序号,用splice去删掉数据的对应序号的数组里的对象,但是问题来了,删掉第三个按钮后,数组里只剩9个对象,这时再点击删掉第四个对象时,原本的第四个序号已经自动变成三个,所以我们删掉的第四个其实是第五个,千万不要用顺序去当标识

所以改成了用id做标识,每次删除一个数据后需要遍历整个对象数组,找到一样的id,然后删掉这个对象,计算量大了很多

正确操作: 先把一开始的数组循环,拆成一个只装着id的数组,和一个用id做key,value等于自身的大对象,然后点击删除时,用index去数组找到位置,把id删掉,最后提交的时候,把数组遍历,把数据从大对象里重新取出来装回到数组对应id的序号里,提交上去

es和数据类型的更多相关文章

  1. es修改数据类型

    环境:es版本:6.5.0 es创建好了mapping后是不允许修改字段类型的,要是我们想修改字段类型怎么办呢,我们可以采用reindex的方法实现,就是创建一个新的mapping,里面的字段类型按照 ...

  2. ES之值类型以及堆和栈

    ES的数据类型: 原始类型(值存在栈内存中): Number.String Boolean.undefined.null charAt(index)返回该index所在的字节,charCodeAt(i ...

  3. ES2.3.5版本的数据类型

    1,最近使用了2.3.5版本的ES,发现在创建索引的时候出了以下错误. (1)例: POST 192.168.11.166:9200/article3/article/_mapping { " ...

  4. es的rest风格的api文档

    rest风格的api put http://127.0.0.1:9200/索引名称/类型名称/文档id (创建文档,指定文档id) post http://127.0.0.1:9200/索引名称/类型 ...

  5. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

  6. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作

    http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...

  7. Elasticsearch入门,这一篇就够了

    实时搜索引擎Elasticsearch Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进 ...

  8. ElasticSearch5.5.1插件分类

    ElasticSearch5.5.1插件分类 附官网介绍:https://www.elastic.co/guide/en/elasticsearch/plugins/5.5/intro.html 一. ...

  9. elasticsearch入门使用(二) Mapping + field type字段类型

    Elasticsearch Reference [6.2] » Mapping 参考官方英文文档 https://www.elastic.co/guide/en/elasticsearch/refer ...

随机推荐

  1. GO 空白标识符 _

    空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃. _ 实际上是一个只写变量,你不能得到它的值.这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用 ...

  2. VM player无法联网问题

    情况就是vmplayer不能联网,能联网的话右上角会显示Wired Connected的 在VM里面看了网络设置,是和主机共享IP(常用)没错.那问题就在PC上了,在win+r输入services.m ...

  3. json 常用的方法

    JSON 是用于存储和传输数据的格式. JSON 通常用于服务端向网页传递数据 . -------  菜鸟网 1.  JSON.parse() :用于将一个 JSON 字符串转换为 JavaScrip ...

  4. [CMake笔记] CMake向解决方案添加源文件兼头文件

    回顾 在上一篇笔记里总结的时候说到,aux_source_directory这个函数在添加源码文件时,是不会把头文件添加进去的,这里就介经一下另外一个方法,也是我一直使用的. 添加文件*.cpp与*. ...

  5. Django 学习 之 视图层(views)

    一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何 ...

  6. js加密(九)hr.bibibi md5

    1. 寻找加密js: 2. 结果: 3. execjs调用js即可.

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:强制元素隐藏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 一、jsp和Servlet基础理论及jstl和EL表达式用法

    1.题外话:使用JSP有近一年半的时间了,但是开发量不大.昨天部门突然让做个读取EXCLE文件,然后在前台页面进行展示.并通过点击查看按钮可以对每条明细记录进行跳转后进行详情查看,并按照页面原型进行页 ...

  9. boost::program_options 解析命令行参数

    源码: #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int a ...

  10. 关于pandas增加行时,索引名称的一些问题

    学习pandas两天了,关于这个增加行的问题一直困扰着我,测试了几个代码,终于搞通了一点(昨天是因为代码敲错了...) 直接上代码: dates = pd.date_range(',periods=6 ...