问:说下JSON.stringify三个参数的用法
答:
console.log(JSON.stringify({name: 'a', age: 1})); //{"name":"a","age":1},只有一个参数,就对这个对象所有属性进行序列号
console.log(JSON.stringify({name: 'a', age: 1}, ['name'])); //{"name":"a"},第2个参数可以放一个数组,表示对哪些参数进行序列号
console.log(JSON.stringify({name: 'a', age: 1}, null)); //{"name":"a","age":1},第2个参数也可以放null,表示对所有参数进行序列号,一般情况下不传第2个参数,不传第2个参数表示对所有属性进行序列号
console.log(JSON.stringify({name: 'a', age: 1}, null, '\t')); //第3个参数表示用什么分割不同属性
问:大屏开发,要注意哪些东西
答:
数据要直观,不要只是一个一个的零散数据,要有最终的统计数据
屏幕主要是用来用户观看的,来访的客户是不可以直接操作屏幕的
大屏设计以固定页面为主(一般按照需要展示的那块屏幕的分辨率来编写前端代码)
一般没有滚动条
一般会有可视化图表
一般是深色背景(我见过的大屏,都是蓝色背景+白色字体的)
一般在pc端展示(可以用px作为长度单位)
问:如何合并数组?
答:
let arr1 = [1, 2];
let arr2 = [3, 4];
方法1:
let arr3 = arr1.concat(arr2);
console.log(arr3); //[1, 2, 3, 4]
方法2:
arr1.splice(arr1.length, 0, ...arr2);
console.log(arr1); //[1, 2, 3, 4]
方法3:
let arr3 = [...arr1, ...arr2];
console.log(arr3); //[1, 2, 3, 4]
方法4:
for(let i = 0;i < arr1.length;i++){
arr3.push(arr1[i]);
}
for(let j = 0;j < arr2.length;j++){
arr3.push(arr2[j]);
}
console.log(arr3); //[1, 2, 3, 4]
canvas有层级的概念,后来的会覆盖前面的
原代码:
if(params.dataIndex == 0){
return '#3fcd96';
}
else if(params.dataIndex == 1){
return '#e6738c';
}
else{
return '#29b4dc';
}
优化后的代码:
let arr = ['#3fcd96', '#e6738c', '#29b4dc'];
return arr[params.dataIndex];
问:如何判断2个数组是否相等?
答:下面这个方法很方便,但是只能用于判断两个一维数组是否相等:
let arr1 = [1, 2, [2, 1]];
let arr2 = [2, 1, [1, 2]];
arr1 = arr1.sort();
arr2 = arr2.sort();
console.log(JSON.stringify(arr1) == JSON.stringify(arr2));
问:let a = 6;
function f() {
setTimeout(function () {
alert(a); //为什么这里会报错
let a = 666;
}, 0);
}
f();
为什么第4行报错?我的理解是:因为let不会提升,所以会找到全局作用域的a也就是6,但是在浏览器的运行结果确实报错,谁知道为什么吗?
答:let这里是会提升的 只是不会初始化。放到临时死区里。 初始化之前访问就会报错了,参考链接:https://segmentfault.com/q/1010000007525551
问:登录怎么做?
答:这是我的项目的做法:第一次当然是输入账号密码,发送请求,请求成功以后,后端会返回一个token给前端,前端把token存在本地,以后每次请求时,把这个值放在headers里的Authorization发给后端,后端根据Authorization的值来判断用户登录信息是否有效
给元素设置width、height等值时,用偶数的像素值不要用奇数的像素值,比如不要用width:31px;要用width:30px;或者width:32px;今天遇到1个情况,就是用奇数的像素值,字体模糊;改成用偶数的像素值,就清晰了,下面有2张图片,这张是弹出框的width的值是奇数时的效果图:
这张是弹出框的width的值是偶数时的效果图:
h5调用app:
var send = function(url) {
setTimeout(() => {
// create iframe & set src
const iframe = document.createElement("iframe");
iframe.src = url;
iframe.style.display = "none";
document.body.appendChild(iframe);
setTimeout(() => {
iframe.parentNode.removeChild(iframe);
}, 300);
}, 0);
return this;
};
send('xxx:///page/service/upgrade?detailType=2');
问:文件在本地能正常运行,文件放在阿里云的oss服务器上,就发生错误,报错信息:
怎么回事?
答:把所有请求地址都改成https的,就没问题了
上传图片到阿里云,如果图片链接没写错,但是却访问不到图片,试下修改图片文件名称,再访问试一下,可能是有一些名称,被阿里云内部占用了,导致你不能使用一些图片名称
如果做的是后台系统,一般对样式要求比较低,如果公司没有ui设计师,或者这个项目没有ui设计师,可以去iconfont(https://www.iconfont.cn/)上面自己找,注意查找时,如果用中文搜索不到几个图片,就用英文查找
跟后端数据交互时,如果数据有问题、或者接口文档看不懂,不要看到一个问题就找他,要把所有问题放在一个word文档里,自己能做的事情做完以后,再把自己写的word文档发给他,这样时间利用率更高
问:同事的浏览器有个地方,后端返回的文字是‘英语’,但是页面显示却是‘英文’;其他人的浏览器上的页数显示是‘1’、‘2’,但是他的页面显示时第1页的页数显示却是‘1个’,为什么会这样?
答:后来发现他的chrome浏览器开启了翻译功能,禁用chrome浏览器的翻译功能,就正常显示了
后台系统如果需要根据不同身份显示不同的模块,比如admin可以看所有模块,商家能看的模块更少,这时路由信息要从后端获取,不能让前端写死,也不能让前端根据用户身份动态渲染路由,因为前端代码,都是可以被看到的
改了一个地方的代码,要马上测试下可能受到影响的地方,尽量避免一个地方的改动对其他地方产生影响,如果一定会对其他页面产生影响,要马上修复其他页面的问题
在测试环境测试项目是否正常,新建时要以自己姓名开头,比如新建某个商品,假设我的名字是‘张三’,把这个商品名称设置为‘张三1’、‘张三2’这种名称,这样以后自己知道这是自己新建的,而且其他同事就不太可能修改自己新建的这个商品的数据了
写代码要讲究秩序,比如先写新增功能、再写编辑功能、最后写删除功能
问:有时后端修改了某个参数名,这时我需要把[{a : 1}]改成[{b : 1}],谁知道有什么办法方便实现吗?除了普通的for循环,有什么其他更好的方法吗?因为如果2层数组的话,用for循环修改后端给我的数据,我会很麻烦。
答:方法其实有很多,这里只列举一个目前觉得最好的方法:
let result = [{a:1}].map(obj=>Object.fromEntries(Object.entries(obj).map(([k,v])=>[k==='a'?'b':k,v])));
console.log(result); //[{"b":1}]
尽量用const,因为用const可以避免自己不小心重复定义同一个变量
问:如何减少项目bug?
答:思考周全,对异常的判断和处理更老练,边界条件把握得更精确,变量名、文件名这些命名要规范
问:Object.freeze真的可以让对象完全冻结吗?
答:
不是,Object.freeze只是实现对象下面一层属性被冻结,下面的constantize才能真正实现完全冻结
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
const a = {name : {age : 1}};
constantize(a);
a.name.age = 2;
console.log(a); //仍然是{name : {age : 1}}
问:函数里怎么拿到函数名?
答:arguments.callee.name
最近完成了一个比较复杂的功能,当领导跟我说这个需求的时候,我有点担心自己做不出来,不过没花很多时间就做出来了,把自己的一点经验记录下来:
先把复杂情况简单化,比如把年份一开始写死为2019年,把2月份写死为28天,简单的东西做出来以后,再解决细节问题,就不会太焦虑、不会太着急,这个在解决数学题上叫做‘特殊值法’,所以可以把以前做数学题的一些经验放在写代码上是通用的
问:如何做瀑布流?比如下面这个效果图:
答:以前我会把每个图片作为一个模块,全部浮动,每个图片设置宽度,高度自适应,这种写法会有问题,部分地方会有间隙,这张图是有问题的图:
更好的做法是:
图片分成几列,从上往下排列,不要从左往右排列
问:js怎么检测网速?
答:拿一个img标签,根据图片的大小和图片加载时间来判断网速,代码大致如下:
<img id="img" src="图片链接" >
<script>
img.onload = function () {
网速 = 图片大小 / 加载时间
}
</script>
如果一条静态数据(比如数组)在一个地方以上使用,就要把这条数据放在一个js文件里,再在各个页面import导入这条静态数据,这样可以在需求改变以后,只改一个地方
记住密码,是一个参数,可以参考豆瓣,如果选择了记住密码,请求参数有一个是‘remember: true’,如果没有选择记住密码,请求参数里remember的值就是false了
问:如何理解对象是一种无序数据的集合?
答:{name : 1,age : 2}和{age : 2,name : 1}没有区别,
但是2个数组[1, 2]和[2, 1]有区别
问:今天遇到1个问题,我把ie浏览器的脚本禁用了,广告全部消失了,图片也加载不出来了,这是正常的,但是我点击百度的‘百度一下’按钮,结果,去发送请求了,这是为什么呢?正常逻辑应该是给按钮绑定一个点击事件,如果我禁用js了,就不会发送请求呀
答:form 有 规范的,第一个 input button type 是 submit 默认触发 submit 事件。
自己在公司里,一直是用ajax提交数据的,竟然忘记了可以用<input type='submit'/>提交
问:怎么提高前端技术的综合使用能力?
答:自己封装一些框架、插件,比如左滑删除插件,自己写1个类似于jQuery、Vue的框架,以后面试时可以吹一下,同时也能很好地提高技术;很多单个的技术,自己一个一个去学,不容易记住,但是如果是自己封装框架时,就一定需要用到很多技术,这个时候去搜索相关技术,记忆深刻
css写得再好,也不能加工资;所以,放在css上的学习时间要少,不需要精通;而js就不一样了,面试时别人很少会问自己css问题,都是问js问题,所以,js越熟悉工资越高,所以要多花时间在js上
问:如何判断2个数组是否相等?
答:下面的代码是我自己写的,如果数组里面还嵌套着数组,我的代码就失效了,实际项目中,如果需要判断2个数组是否相等,就去百度一下:
方法1(只能判断一维数组):
遍历属性名和属性值是否相等
let arr1 = [11, {name : 1}];
let arr2 = [11, {name : 13}];
let flag = true;
// 如果数组里都是基本类型,就调用compare1,如果都是对象,调用compare2
if(arr1.length != arr2.length){
flag = false;
}
for(let i = 0;i < arr1.length;i++){ //遍历arr1
if(typeof arr1[i] != 'object' && typeof arr1[i] != 'function'){
//如果arr[i]是基本类型,判断arr2里是否有这个值
//判断arr2里是否有arr1[i]的值
if(arr2.indexOf(arr1[i], 0) == -1){
flag = false;
}
}
else{
let arr1_i_key = Object.keys(arr1[i])[0]; //获取arr1的第i项的属性名、属性值
for(let j = 0;j < arr2.length;j++){ //遍历arr2
if(typeof arr2[j] == 'object' || typeof arr2[j] == 'function'){
let arr2_j_key = Object.keys(arr2[j])[0]; //获取arr2的第i项的属性名、属性值
if((arr1_i_key == arr2_j_key) && (arr1[i][arr1_i_key] == arr2[j][arr2_j_key])){
}
else{
flag = false;
}
}
}
}
}
console.log('flag', flag);
方法2(只能判断一维数组):
let arr1 = [1, 2, [2, 1]];
let arr2 = [2, 1, [1, 2]];
arr1 = arr1.sort();
arr2 = arr2.sort();
console.log(JSON.stringify(arr1) == JSON.stringify(arr2));
今天复习jsonp的时候,我玩了一下上面3张图的这些代码,我觉得好奇怪,定义f()的<script>标签放在前面的话,就能调用f这个函数;如果把定义f()的<script>标签放在后面的话,就报错了,你们知道其中的原理吗?
答:https://segmentfault.com/q/1010000002895851
我的理解:相当于函数声明提前只是在<script>标签内部有效,如果是不同的<script>标签,就有更高优先级的处理机制(从前往后执行的机制)了
如何实现点击按钮,展开或者关闭<select>标签呢?这里有个demo:http://jsfiddle.net/g3Ta3/4/
原理:动态设置select标签的size属性,默认是1
数组1.concat(数组2)、数组2.concat(数组1)有什么区别?
数组1.concat(数组2):数组1的数据在数组2的前面
数组2.concat(数组1):数组2的数据在数据1的前面
当做分页加载时,就需要这样写:现有数据.concat(新数据);
用字符串渲染DOM元素时,属性名和属性值之间可以不用加字符串:
$('.div1').append('<div class=div2>div2</div>');
问:$.ajax发送请求的时候,发现有时有缓存,怎么办?
答:
1.在请求参数上加上1个随机数
2.增加1个参数:cache:false
原文链接:https://www.cnblogs.com/liuqiyun/p/6406838.html
问:一个apk文件,在电脑、手机浏览器上能打开,在微信上不能打开,怎么办?
答:原文链接:https://blog.csdn.net/a18807453880/article/details/82018319
原来微信是禁止打开apk文件的,我们可以提示用户,‘在浏览器中打开’,让用户去浏览器里下载
问:如何给1个table标签设置1px的边框?
答:<table border="1px solid #e2e6f3" cellspacing="0" cellpadding="0"><table>
css如下:
table {
border: 1px solid #e2e6f3;
}
td{
border-collapse: collapse;
}