撩课-Web大前端每天5道面试题-Day5
1.写一个深度克隆方法(es5)?
- /**
- * 深拷贝
- * @param {object}fromObj 拷贝的对象
- * @param {object}toObj 目标对象
- */
- function deepCopyObj2NewObj(fromObj, toObj) {
- for(var key in fromObj){
- // 1. 取出键值对
- var fromValue = fromObj[key];
- // 2. 检查当前的属性值是什么类型
- if(!isObj(fromValue)){ // 如果是值类型,那么就直接拷贝赋值
- toObj[key] = fromValue;
- }else {
- // 如果是引用类型,
- // 那么就再调用一次这个方法,
- // 去内部拷贝这个对象的所有属性
- var tempObj = new fromValue.constructor;
- console.log(fromValue.constructor);
- deepCopyObj2NewObj(fromValue, tempObj);
- toObj[key] = tempObj;
- }
- }
- }
- /**
- * 辅助函数, 判断是否是对象
- * @param {object}obj
- * @returns {boolean}
- */
- function isObj(obj) {
- return obj instanceof Object;
- }
2. es6中let,const,var的区别是什么?
- var :声明全局变量;
- let :声明块级变量,即局部变量, 定义后可以修改;
- const :用于声明常量,就是定义后
- 不能再修改值或者引用值的常量,
- 也具有块级作用域
3. 对数组[1,2,3,8,2,8]进行去重,es5或者es6方法?
- es四种方式:
- Array.prototype.unique1 = function() {
- // 1. 定义数组
- var temp = [];
- // 2. 遍历当前数组
- for(var i = 0; i < this.length; i++) {
- // 3.如果当前数组的第i已经保存进了临时数组,
- // 那么跳过,否则把当前项push到临时数组里面
- if (-1 === temp.indexOf(this[i])) {
- temp.push(this[i]);
- }
- }
- return temp;
- };
- Array.prototype.unique2 = function() {
- //1. hash为hash表,r为临时数组
- var hash = {}, temp=[];
- // 2.遍历当前数组
- for(var i = 0; i < this.length; i++)
- {
- // 3. 如果hash表中没有当前项
- if (!hash[this[i]])
- {
- // 4.存入hash表
- hash[this[i]] = true;
- // 5.把当前数组的当前项
- // push到临时数组里面
- temp.push(this[i]);
- }
- }
- return temp;
- };
- Array.prototype.unique3 = function() {
- var n = [this[0]];
- for(var i = 1; i < this.length; i++){
- if (this.indexOf(this[i]) === i) {
- n.push(this[i]);
- }
- }
- return n;
- };
- Array.prototype.unique4 = function() {
- this.sort();
- var re=[this[0]];
- for(var i = 1; i < this.length; i++)
- {
- if( this[i] !== re[re.length-1])
- {
- re.push(this[i]);
- }
- }
- return re;
- };
- es6:
- Array.prototype.unique =
- Array.prototype.unique
- || function () {
- return [...new Set(this)];
- };
4. 说说对es6中=>的理解?
- 箭头函数相当于匿名函数,
- 并且简化了函数定义,
- 箭头左边是参数,
- 右边是返回值。
- 箭头函数看上去
- 是匿名函数的一种简写,
- 但实际上,箭头函数和
- 匿名函数有个明显的区别:
- 箭头函数内部的this是词法作用域,
- 由上下文确定。
5. 点击一个按钮,发出ajax请求,如何防止用户在此请求方式返回之前再次点击?
- // 点击提交按钮的时候,
- // 把这个提交这个处理函数给解绑掉,
- // 请求完成的时候在绑定回来
- function clickHandler(){
- $(this).unbind('click', clickHandler);
- $.ajax({
- url : 'url',
- dataType : 'json',
- type : 'post',
- success : function (data) {
- if (data.success) {
- //提交成功做跳转处理
- } else {
- //处理失败,重新绑定点击事件
- $(self).click(clickHandler);
- }
- }
- });
- }
- $('#itlike').click(clickHandler);
- // 可以点击后让按钮不可用,
- // 如果提交失败可以再次设置为可用
- // 1.让按钮不可用
- $("#itlike").attr("disabled","disabled");
- $.ajax({
- url : 'url',
- dataType : 'json',
- type : 'post',
- success : function (data) {
- if (data.success) {
- // 提交成功做跳转处理
- } else {
- // 处理失败,重新绑定点击事件
- // 让按钮可用
- $("#itlike").removeAttr("disabled");
- }
- }
- });
撩课-Web大前端每天5道面试题-Day5的更多相关文章
- 撩课-Web大前端每天5道面试题-Day10
1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...
- 撩课-Web大前端每天5道面试题-Day4
1. 如何实现瀑布流? 瀑布流布局的原理: ) 瀑布流布局要求要进行布置的元素等宽, 然后计算元素的宽度, 与浏览器宽度之比,得到需要布置的列数; ) 创建一个数组,长度为列数, 里面的值为已布置元素 ...
- 撩课-Web大前端每天5道面试题-Day1
1. var的变量提升的底层原理是什么? JS引擎的工作方式是: 1) 先解析代码,获取所有被声明的变量: 2)然后在运行.也就是说分为预处理和执行两个阶段. 变量提升:所有变量的声明语句都会被提升到 ...
- 撩课-Web大前端每天5道面试题-Day11
1. 如何手写一个JQ插件? 方式一: $.extend(src) 该方法就是将src合并到JQ的全局对象中去: $.extend({ log: ()=>{alert('撩课itLike');} ...
- 撩课-Web大前端每天5道面试题-Day31
1.web storage和cookie的区别? Web Storage的概念和cookie相似, 区别是它是为了更大容量存储设计的. Cookie的大小是受限的, 并且每次你请求一个新的页面的时候C ...
- 撩课-Web大前端每天5道面试题-Day25
1.web前端开发,如何提高页面性能优化? 内容方面: .减少 HTTP 请求 (Make Fewer HTTP Requests) .减少 DOM 元素数量 (Reduce the Number o ...
- 撩课-Web大前端每天5道面试题-Day7
1. 你能描述一下渐进增强和优雅降级之间的不同吗? 定义: 优雅降级(graceful degradation): 一开始就构建站点的完整功能, 然后针对浏览器测试和修复 渐进增强(progressi ...
- 撩课-Web大前端每天5道面试题-Day30
1.什么叫优雅降级和渐进增强? 优雅降级: Web站点在所有新式浏览器中都能正常工作, 如果用户使用的是老式浏览器, 则代码会针对旧版本的IE进行降级处理了, 使之在旧式浏览器上以某种形式降级体验却不 ...
- 撩课-Web大前端每天5道面试题-Day23
1.为什么用Nodejs,它有哪些优缺点? 优点: 事件驱动,通过闭包很容易实现客户端的生命活期. 不用担心多线程,锁,并行计算的问题 V8引擎速度非常快 对于游戏来说,写一遍游戏逻辑代码,前端后端通 ...
随机推荐
- 【OCP认证12c题库】CUUG 071题库考试原题及答案(28)
28.choose the best answer Evaluate the following SQL statement: SQL> SELECT promo_id, promo_categ ...
- 《快学Scala》第八章 继承
- 【表单验证】基于jQuery的高度灵活的表单验证(无UI)
表单验证是前端开发过程中常见的一个需求,产品需求.业务逻辑的不同,表单验证的方式方法也有所区别.而最重要的是我们要清楚,表单验证的核心原则是--错误信息提示准确,并且尽可能少的打扰/干扰用户的输入和体 ...
- iOS 计算文字宽度的一个细节
设计师给到的图,经常是 "按钮的左边距离文字右边5px" 这样子的标注.于是我们需要计算文字的宽度. 有两种方法: 用 label 或 button 的 sizetofit 方法 ...
- .NET Core容器化之多容器应用部署-使用Docker-Compose
原文补充: -- docker-compose.ymlversion: ' services: mvc-web: container_name: mvc.web.compose build: . re ...
- 大数据-HBase HA集群搭建
1.下载对应版本的Hbase,在我们搭建的集群环境中选用的是hbase-1.4.6 将下载完成的hbase压缩包放到对应的目录下,此处我们的目录为/opt/workspace/ 2.对已经有的压缩包进 ...
- 论文分享NO.1(by_xiaojian)
论文分享第一期-2019.03.14: 1. Non-local Neural Networks 2018 CVPR的论文 2. Self-Attention Generative Adversar ...
- SASS的安装和转换为CSS的方法
http://www.cnblogs.com/52css/archive/2012/08/19/sass-how-to-install-and-use.html SASS的安装方法: 1.先安装Rub ...
- jquery mobile 动态加载标签时,无法正常展示样式
原因 在chrome中审查元素,发现其增加了很多没有直接写在页面上的标签和样式.页面标签首先经过jquery.mobile-1.4.5.min.js的处理,添加了许多标签,然后再用css布局 解决方案 ...
- GitHub注册和Git安装
一.注册GitHub GitHub官方地址:https://github.com. 在浏览器中打开GitHub网址,通过首页进行注册,如下图所示. 二.安装Git Git官方下载地址:http://g ...