1.为什么学习前端?
我其实大学学的专业是网络工程,然后自己的专业也不太适合女生,在学校的时候,经常听老师说起前端,然后就很好奇,后来偶然间接触到了前端,发现所有的页面都是前端来写的,就很感性,而且前端不仅仅可以写页面,还有很多有趣的东西,而且感觉也很适合自己,再加上姐姐也是学后端的,学得很溜,所以我也想学一门适合自己的技术,然后就来学习了前端,也希望在未来十年自己的工作也是前端,虽然说前端这几年不太好找工作,但是,我觉得很喜欢某一样东西,就可以去深入接触。
2.怎么学习前端?
我觉得首先得有学习前端的思维,知道什么是前端,我们可以用前端做些什么,然后最基础学习前端三件套,熟练记得常用标签和css样式,懂js的原理和用法,特别是要多敲代码,将常用标签和css样式多练几遍,记住它们的原理,而不是死记硬背,然后用三件套实现页面和基本的功能后,再去学习框架和小程序,比较好。像我自己,刚开始学习前端的时候,真的很痛苦,因为没有编程的思想,特别是在学习js的时候,也是自己将代码敲了很多很多遍,只要有时间就是在敲代码,所以前端虽说很多人说简单,但其实要真正学好学精,不是一件很容易的事。
3.js的数据类型
基本数据类型:Btring(字符串)、Bumber(数字)、Boolean(布尔)、null、undefined
引用数据类型(对象类型):Array(数组)、Function(函数)、Object(对象)、还有两个特殊的对象:RegExp(正则)、Date(日期)
ES6新增的Symbol
4.写一个判断数据类型的函数
function getType(data) { let originType = Object.prototype.toString.call(data); // 获取内部属性值 let index = originType.indexOf(' '); // 以空格分割 空格的位置在哪儿 并返回下标 let type = originType.slice(index + 1, -1); // 截取 return type.toLowerCase(); } console.info(getType("小猪课堂")); // string console.info(getType(123)); // number console.info(getType(true)); // boolean console.info(getType(null)); // null console.info(getType(undefined)); // undefined console.info(getType({ name: "小猪课堂" })); // object console.info(getType([1, 3, 2])); // array console.info(getType(Promise.resolve())); // promise console.info(getType(new Set())); // set console.info(getType(new WeakMap())); // weakmap console.info(getType(new Date())); // date console.info(getType(() => {})); // function console.info(getType(new Map)); // map console.info(getType(BigInt(100))); // bigint console.info(getType(new RegExp(''))); // regexp console.info(getType((Symbol()))); // symbol
5.手写深浅拷贝
深拷贝:
方法一:递归的方式实现
let o1 = { a: 1, b: 2, c: 3, e: [1, 2, 3], d: { d1: 'aaa', d2: 'bbb', }, }; function deepClone(target, option) { for (let key in option) { console.log(option[key].constructor); if (option[key].constructor === Object) { target[key] = {}; deepClone(target[key], option[key]); } else if (option[key].constructor === Array) { target[key] = []; deepClone(target[key], option[key]); } else { target[key] = option[key]; } } } let o2 = {}; deepClone(o2, o1); console.log(o2); console.log(o1);
let o1 = { a: 1, b: 2, c: 3, e: [1, 2, 3], d: { d1: 'aaa', d2: 'bbb', }, }; function deepClone(target, origin) { for (let key in origin) { //遍历原始对象 console.log(origin[key].constructor); if (origin[key].constructor === Object) { //如果原始对象的属性值的构造函数是对象 那么就将新的对象的属性值也赋值为对象 然后再次调用deepClone target[key] = {}; deepClone(target[key], option[key]); } else if (origin[key].constructor === Array) { //如果原始对象的属性值的构造函数是数组,那么就将新的对象的属性值赋值为数组,然后再次调用deepClone target[key] = []; deepClone(target[key], origin[key]); } else { //其他情况,一律直接将原始对象的属性值赋值给新的对象 target[key] = origin[key]; } } } let o2 = {}; deepClone(o2, o1); console.log(o2); console.log(o1);
方法二:JSON.parse(JSON.stringify(obj))
这是最常用的一种深拷贝的方式,一般大部分深拷贝都可以用JSON的方式解决,本质上JSON对自己构建新的内存来存放新对象。
注意:
(1)会忽略undefined和symbol;
(2)不可以对Function进行拷贝,因为JSON格式字符串不支持Function;
(3)诸如Map、Set、RegExp、Date、ArrayBuffer和其它内置类型在进行序列化时会丢失;
(4)不支持循环引用对象的拷贝
方法三:lodash的_.cloneDeep()
这是最最完美的深拷贝的方式,他已经将出现问题的各种情况都考虑在内了,所以日常开发中,建议使用这种成熟的解决方案。
var _ = require('lodash') //lodash库 需要进行下载 官网Lodash 简介 | Lodash 中文文档 | Lodash 中文网 (lodashjs.com) var obj1 = { a:1, b: {f:{g:1}}, c:[1,2,3] } var obj2 = _.cloneDeep(obj1) console.log(obj1.b.f===obj2)
浅拷贝:
1.Object assign(新对象,原始对象)
又两个参数,第一个参数是新的对象,第二个参数是原始对象。
2.for..in遍历
var obj = [1,2,3,[4,5,6],{a:1}]
var obj1 = {}
for(var key in obj){
obj1[key] = obj[key]
}
3.展开运算符
obj1={...obj}