【进阶】深拷贝

目录:
1 深拷贝
2 浅拷贝
3 文字超出两行显示省略号
4 height: 100%如何才能生效
5 path不包括 ?和 #

前言

(1) 基本数据类型,引用数据类型

基本数据类型:number, string, boolean, null, undefined, symbol
引用数据类型:object, array, function

  • 区别:
    基本类型没有属性和方法,保存在栈区。
    引用类型有属性和方法,保存在栈区和堆区。
    引用类型按引用访问
    引用类型: 栈区保存变量标识符和指针,指针指向堆内存中该对象,保存在变量中的是对象在堆内存中的地址
  • 浅拷贝只能用于对象中只包含基本类型的数据,修改其中一个的属性后,相互不影响,当对象中仍然包含对象类型的数据时,则是引用关系,修改会相互影响,所以这种情况需要用到深拷贝
const arr = [1];
const obj = { a: 1 };
const newArr = arr;   
const newObj = obj; ------------------ 变量 newObj 和 obj 保存的都是指向同一对象堆内存的指针(引用), 是指针
arr[0] = 2;
obj.a = 2;
console.log(arr, newArr, obj, newObj);  // [2] [2] {a: 2} {a: 2}






var a = {}; // a保存了一个空对象的实例
var b = a;  // a和b都指向了这个空对象
a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'
b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22
console.log(a == b);// true
QQ截图20190219105922.png

深拷贝方法一

JSON.parse(JSON.string(obj))

  • 缺点: 只能拷贝对象和数组,无法拷贝函数,无法拷贝原型链上的属性和方法(Date, RegExp, Error等)
 const ojbComplex = {
      name: 'wu',
      age: 20,
      address: {
        city: 'chongqing',
        district: 'yubei',
        town: 'jiazhou',
        detail: ['chognqing', 'yubei', 'jiazhou']
      },
      bwh: [20, 30, 40, {l: 20, w: 30, h: 40}],
      fn: function(){},
      date: new Date(),
      err: new Error(),
      reg: new RegExp(),
      null: null,
      undefined: undefined,
    }
    const deepClone = JSON.parse(JSON.stringify(ojbComplex));
    console.log(ojbComplex, 'ojbComplex')
    console.log(deepClone, 'deepClone');


缺点:
不能拷贝fn, date, err, reg
QQ截图20190219111653.png

深拷贝方法二

for...in 循坏递归


function deepClone(obj) {
  let objClone = Array.isArray(obj) ? [] : {};
  if (obj && typeof obj === 'object') {
    for(let key in obj) {
        if ( obj.hasOwnProperty(key) ) {
          if ( obj[key] && typeof obj[key] === 'object') {
            objClone[key] = deepClone(obj[key]);   --------- 递归调用,deepClone()函数的返回值是objClone
          } else {
            objClone[key] = obj[key];
          }
         }
        }
      }
  return objClone;
}




    const params = {
      name: 'wang',
      address: {
        city: ['china', 'choing'],
        district: {
          town: 'jiazhou'
        }
      }
    };
    const b = deepClone(params);
    console.log(b)


缺点: 和JSON.parse(JSON.stringify(ojb)) 一样, 不能拷贝 fn, date, reg,err

https://zhuanlan.zhihu.com/p/41699218 lodash deepclone 源码分析
https://www.jianshu.com/p/c651aeabf582
https://www.jianshu.com/p/b08bc61714c7
https://segmentfault.com/a/1190000015455662

浅拷贝

  • slice()
  • concat()
  • Object.assign(target, ...sources)
  • {...obj} 和 [...arr]
  • 循坏push
浅拷贝

const a = [1, {name: 'wang'}];
const b = [...a];
a[0] = 2;
a[1].name = 'li';
console.log(b)   
b // [1, { name: 'li' } ]




const a = [1,2,3];
const b = a.concat();
const c = a.slice();
a[0] = 111111;
console.log(b);
console.log(c);
b // [1,2,3]
c // [1,2,3]




const a = { name: 'wang' };
const b = Object.assign({}, a);
a.name = 'li';
console.log(b);
b  // { name: 'wang'}

文字超出两行显示省略号

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;



英文单词时:
word-wrap:break-word; --- word-wrap: 属性允许长单词或URL地址换行到下一行, break-word: 单词内换行
word-break:break-all;  ------------------ word-break: 规定自动换行的处理方式,break-all: 允许单词内换行



总结:
word-wrap: break-word;  ------------ 整个单词换行
word-break: break-all;   ------------ 单词内换行
white-space: nowrap;     ------------ 单词不换行

文字超出单行不换行,显示省略号

.word {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;   --------------- 单词不换行

  word-wrap: break-word; --------------- 整个单词换行
  word-break: break-all; --------------- 单词内换行 (单行显示省略号,后面两个属性可以不加)
}

https://www.cnblogs.com/ldlx-mars/p/6972734.html

height: 100%如何才能生效?

  • 原理:height: 100%是根据父元素作为参照的,如果父元素的高度是一个缺省值,即height:auto,则子元素设置height: 100%将不能达到效果。
  • 结论:普通文档流中的元素,百分比高度值要想起作用,其父级必须有一个可以生效的高度值!
让div充满整个屏幕


方法1
解析:当html和body都设置了height: 100%时,子元素的height:100%就会生效
<!DOCTYPE html>
<html>
<head>
  <style>
    html, body {  
      height: 100%;
      width: 100%;
      background: red;
      padding: 0;
      margin: 0;
    }
    .a {
      height: 100%;
      width: 100%;
      background: black;
    }
  </style>
</head>
<body>
  <div class="a">
    <div class="b">居中</div>
  </div>
</body>
</html>





方法2
解析:使用绝对定位,当所有父节点都没有设置定位信息时,是根据html来定位的
<!DOCTYPE html>
<html>
<head>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    .a {
      height: 100%;
      width: 100%;
      position: absolute;
      background: yellow;
    }
  </style>
</head>
<body>
  <div class="a">
    <div class="b">居中</div>
  </div>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,472评论 1 45
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,748评论 1 92
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,746评论 2 9
  • 还没想好怎么写,敬请期待下期,谢谢~ 到了的小伙伴请留下足迹,哈哈~
    Wheat__阅读 213评论 1 1