基本数据类型number,string,boolean

typeof 操作符去判断一个数据的类型

  1. // 基本数据类型 number string boolean
  2. var a = 10;
  3. var str = "hello world";
  4. var b = true;
  5. console.log(typeof a); // number
  6. console.log(typeof b); // string
  7. console.log(typeof c); // boolean

引用数据类型 Array,Function,Object

数组Array

  1. // 数组 array [] typeof不能识别数组
  2. // 使用 Array.isArray 来判断
  3. var arr = [1,2,3];
  4. console.log(arr.length);//3
  5. console.log(Array.isArray(arr)) // true
  6. // 数组下标从0开始,下标越界之后输出undefined

Json对象

  1. // 声明JSON对象
  2. // {key:value} {键:值}
  3. // 在js中key的引号可以省略
  4. var zheng = {
  5. "name":"zheng",
  6. "sex":"女"
  7. }
  8. var obj ={
  9. name:"zhang",
  10. age:18
  11. }
  12. // 2.读取Json对象的值
  13. console.log(zheng.name)
  14. console.log(zheng["name"])
  15. // 3.给对象添加属性
  16. zheng.skill = "javascript"
  17. console.log(zheng)

json-array结合

  1. var obj = [{name:"zcy",age:18},{name:"mhm",age:18}]
  2. console.log(obj)

函数function

  1. // function 封装一段特定功能的代码
  2. function go(){
  3. console.log("hello world")
  4. }
  5. go();
  6. // 函数的参数是局部变量
  7. function show(x){
  8. console.log(x)
  9. }
  10. show(3);

全局变量和局部变量

  1. // 函数里面使用var 定义的变量(包含函数的变量) --局部变量
  2. // 函数外面声明的变量 --全局变量
  3. var a = 10; // 全局变量
  4. function show(){
  5. console.log(a) // 10
  6. var b = 20; // 局部变量
  7. console.log(b); //20
  8. }
  9. show();
  10. console.log(b) // 报错 b is not defined

控制语句

  1. //for
  2. var arr = ["html","css","javascript","vue"]
  3. for(var i=0;i<arr.length;i++){
  4. console.log(arr[i]);
  5. }
  6. //if-else
  7. var age = 17;
  8. if(age>=18){
  9. console.log("去网吧")
  10. }else{
  11. console.log("家里蹲")
  12. }

逻辑判断

  1. //逻辑与 && 只有两边为true,结果才为true
  2. // 逻辑或 || 只要有有一边为true,结果为true
  3. //逻辑非 ! 取反
  4. console.log(10>3 && 10>7)//true
  5. console.log(10>3 && 10>11)//false
  6. console.log(10>12 || 10>3)//true
  7. console.log(!(10>12))//true

深拷贝和浅拷贝

  1. 深拷贝和浅拷贝都只针对引用数据类型
  2. 浅拷贝:指 两个js 对象指向同一个内存地址,其中一个改变会影响另一个
  3. 深拷贝: 指复制后的新对象重新指向一个新的内存地址,两个对象改变互不影响

浅拷贝

数组中每项是简单数据类型,实现浅拷贝

  1. var arr = [1,2,3]
  2. var sum = arr
  3. console.log(sum); // [1,2,3]
  4. arr.push(4)
  5. console.log(sum); // [1,2,3,4]

数组中每项是复杂数据类型 ,实现浅拷贝

  1. var arr = [{name:"zheng"},{name:"zhang"},{name:"li"}]
  2. var res = [...arr]
  3. res[0].name="huang" // arr变了
  4. res.push({name:"vue"})
  5. console.log(arr) // [{name:"huang"},{name:"zhang"},{name:"li"}]

深拷贝.png

深拷贝

每项为简单数据类型(实现深拷贝)

数组里每项是简单数据类型,实现深拷贝

  1. /* 数组里面 每一项是基本数据类型的 是深拷贝 */
  2. var arr = [1,2,3]
  3. var sum = [...arr]
  4. console.log(sum); //[1,2,3]
  5. arr.push(4)
  6. console.log(sum); // [1,2,3]
  7. var arr = [1,2,3]
  8. var sum = [].concat(arr)
  9. console.log(sum); // [1,2,3]
  10. arr.push(4)
  11. console.log(sum); //[1,2,3]
  12. var arr = [1,2,3]
  13. var sum = arr.slice(0)
  14. console.log(sum); // [1,2,3]
  15. arr.push(4)
  16. console.log(sum); // [1,2,3]

对象的属性是简单数据类型,实现深拷贝

  1. var obj = {name:"cheng",age:18}
  2. // var a = {...obj}
  3. var a = Object.assign({},obj)
  4. obj.id = 100;
  5. console.log(a) // {name:"cheng",age:18}

每项为复杂数据类型(array+object)

  1. // 遇到复杂类型(array+object)如何实现深拷贝
  2. // var obj = null
  3. var obj = {name:{name:"cheng"}}
  4. function deepClone(obj){
  5. // 1. 能够识别数组和对象了
  6. let result;
  7. if(obj instanceof Array || obj instanceof Object){
  8. // 2.对拷贝的值做初始值的设定
  9. if(obj instanceof Array){
  10. result = []
  11. }else if(typeof obj == "object"){
  12. result={}
  13. }
  14. // 3.需要将obj克隆到result中
  15. for(let key in obj){
  16. result[key] = deepClone(obj[key])
  17. }
  18. return result
  19. }else{
  20. return obj
  21. }
  22. }
  23. deepClone(obj)
  24. console.log(deepClone(obj))