// =====================================================
// 欢迎参加有赞前端 Coding 面试
// =====================================================
// 界面介绍:
// 上方设置按钮可以切换语言、字体大小、主题
// 右侧控制台可以显示代码执行结果,可用于编码过程中的 DEBUG
// =====================================================
// Coding 须知:
// 本次 Coding 时间限制为 30 分钟,共 2 道题目
// 题目难度自上向下递增,请量力答题
// =====================================================
/**
* ## 问题 1
* 大数相加
*
* JS 中最大整数安全范围是 9007199254740991
* 实现 add 方法,求解 9007199254740991 + 1234567899999999999
* 输入 add('9007199254740991', '1234567899999999999')
* 输出 '1243575099254740990'
*/
function add(num1, num2) {
var l1 = num1.length;
var l2 = num2.length;
var k = 0;
var arr = [];
var l = Math.max(l1,l2);
for(let i = 0;i <l;i++){
k += Number(num1.charAt(l1-i-1))+Number(num2.charAt(l2-i-1));
if(k > 9){
arr.unshift(k%10);
k = 1;
}else{
arr.unshift(k);
k=0;
}
}
arr=arr.join("");
return arr;
}
console.log(add('9007199254740991', '1234567899999999999'))
/**
* ## 问题 2
* 实现 getValue 函数来获取path对应的值
*/
var object = {
'a': [{
'b': {
'c': 3
}
}]
}; // path: 'a[0].b.c'
var array = [{
"a": {
'b': [1]
}
}]; // path: '[0].a.b[0]'
function getValue(obj, path, defaultValue) {
// coding here ...
p = path.split('.');
var arr = new Array(p.length);
for(let i = 0; i<p.length;i++){
for(let j = 0; j<p[i].length;j++){
var c ='';
c+=p[i].charAt(j);
var arr2 =[];
if(p[i].charAt(j)==='['||p[i].charAt(j)==='['){
arr2.push
j++;
}
}
if(p[i].length>1){
}else{
arr[i]=p[i];
}
}
}
console.log(getValue(object, 'a[0].b.c', 0)); // 输出3
console.log(getValue(array, '[0].a.b[0]', 12)); // 输出 1
console.log(getValue(array, '[0].a.b[0].c', 12)); // 输出 12
function getValue(obj, path, defaultValue) {
let arr = path.split('.');
// console.log(arr)
try {
for (let item of arr) {
// console.log(item)
if (item.endsWith(']')) {
let temp = item.split('[');
let index = parseInt(temp[1].substring(0, temp[1].length - 1));
if (temp[0] === '') {
obj = obj[index];
} else {
obj = obj[temp[0]][index];
}
} else {
obj = obj[item];
}
if (obj === undefined) {
return defaultValue;
}
}
return obj
} catch (e) {
return defaultValue;
};
}
var object = {
'a': [{
'b': {
'c': 3
}
}]
};
var array = [{
'a': {
'b': [1]
}
}]
console.log(getValue(object, 'a[0].b.c', 0)) //3
console.log(getValue(array, '[0].a.b[0]', 12)) // 1
console.log(getValue(array, '[0].b[0].c', 12)) //12
电商后台管理系统包含哪些部分?整个系统包含哪些部分?整个架构是怎样的?
数据提供?API?UI层,数据接口现成?
用户管理登录登出退出逻辑?
VUE开发和小程序开发,差异点?
HTTP状态码?
200 404 403 301 302 304 500
301和302差异点?永久临时含义?
302重定向配合哪个HTTP请求头进行重定向?
访问a.com,状态码是302,a.com跳到另外一个地址,那调到哪个地址,肯定有个东西来提供?这个东西由哪一部分提供?这个路径是跳转过去的路径,目标路径是谁提供的吗?
403禁止访问,涉及到一个权限的概念,你认为和权限相关的,就是鉴权相关的,会涉及到哪些部分的知识点?用户登录的时候肯定不能进行一些操作,下单的时候如果没有登陆,肯定是会说你没有权限或者你没有登录,相应的状态码就不是200了,可能是403,一个用户是谁,通过什么方式进行存储,或者说服务端怎么知道这个请求是由哪个用户带上的?
具体讲讲token的含义?
token是服务端颁发的?一定会带上吗?做什么样的操作请求会带上token?token放在请求头的哪个部分?
token里面会带上什么信息呢?服务端为什么可以把这串数字,对应的人或者对应的登录状态是什么?你知道这里面背后的流程是怎样的吗?
如果让你来设计这个token的话?你觉得token的明文会存哪些东西?
你了解到的前端页面的攻击方式有哪些?
跨脚本攻击
xss和csrf
xss是一种怎样的攻击手段?
web页面有哪些地方可以被攻击者利用注入?哪些元素或者说哪些组件?然后被渲染出来?
假设你是攻击者,你要想用xss去攻击一个网站的话,你会在哪里选择下手?或者说你的攻击手段会是怎样?
把攻击代码放到url参数里面,当客户端或者服务端,前端浏览器去解析参数的时候,它会被带到前端代码里面储存起来,然后进行攻击。
特殊字符放到url里面,浏览器会对其进行转码,比如说你在浏览器里面输入一个括号,或者参数里面带上一个括号,它实际上显示的是括号本身吗?
有没有尝试过你在浏览器某一个query里面去输入一些特殊字符,比如说括号,一些尖括号之类的东西?然后它其实会被转成一个特殊的编码,你有了解过这个特殊的编码是个什么样的编码吗?
xss的攻击方式,除了url,用户给你的信息,输入框,文本框,留言板等一些东西。给攻击者注入点。你打算采取什么样的手段去规避xss攻击注入到你的系统中?有哪些手段可以进行防御。
转义就是将一种编码转成另一种编码。
常用的编码方式有哪些?utf8,unicode
csrf攻击利用了浏览器的什么特性?