JS搜狐面试题分析


Posted in Javascript onDecember 16, 2016

本文实例讲述了几道JS搜狐面试题。分享给大家供大家参考,具体如下:

一、实现一个遍历数组或对象里所有成员的迭代器。

var each = function(obj, fn){
    //+++++++++++答题区域+++++++++++
    //+++++++++++答题结束+++++++++++
};
try{
    var data1 = [4,5,6,7,8,9,10,11,12];
    var data2 = {
        "a": 4,
        "b": 5,
        "c": 6
    };
    console.group(data1);
    each(data1, function(o){
        if( 6 == this )
            return true;
        else if( 8 == this )
            return false;
        console.log(o + ": \"" + this + "\"");
    });
    console.groupEnd();
    /*------[执行结果]------
    1: "4"
    2: "5"
    4: "7"
    ------------------*/
    console.group(data2);
    each(data2, function(v, n){
        if( 5 == this )
            return true;
        console.log(n + ": \"" + v + "\"");
    });
    console.groupEnd();
    /*------[执行结果]------
    a: "4"
    c: "6"
    ------------------*/
}catch(e){
    console.error("执行出错,错误信息: " + e);
}

【思路分析】

1.首先判断传进来的是数组还是对象,用到instanceof,typeof和instanceof都可以用来判断js变量类型,用法区别

typeof(obj) //typeof会返回一个基本数据类型

obj instanceof Array //instanceof一般是用来验证一个对象是否属于某类

注:typeof遇到null,数组,对象都会返回object类型

var each = function(obj, fn){
  if(obj instanceof Array){
  }
  else if(obj instanceof Object){
  }
};

2.遍历数组和遍历对象的区别

遍历数组:

for(var i=0,j=array.length;i<j;i++){
  alert(array[i]);
}

遍历对象:

for(var e in data){
  alert(data[e]);
}

3.分析结果

each(data1, function(o){
  if( 6 == this )
    return true;      //表示跳过并继续遍历
  else if( 8 == this )
    return false;     //表示停止遍历
  console.log(o + ": \"" + this + "\"");
});

如果直接for循环,那会输出数组所有元素,现在有个each函数,应该让他指向obj中的元素(即改变this指向,让this代表obj[i])

fn.call(obj[i],i+1); //fn是each的第二个参数,让这个函数指向obj中的元素,第一个参数o,让让它传值i+1

仅仅这样会输出4,5,7,8,9,10,11,12,所以还需要限定让它等于8的时候跳出整个循环

if(obj instanceof Array){
  for(var i=0,j=obj.length;i<j;i++){
    var temp=fn.call(obj[i],i+1);
    if(temp===false){    //===值和类型都要等,==只是值相同null==false
      return;
    }
  }
}

同理,遍历对象

else if(obj instanceof Object){
  for(var e in obj){
    fn.call(obj[e],obj[e],e);    //第一个参数v(对象值),第二个n(对象索引)
  }
}

注:obj instanceof Object要在obj instanceof Array之后,因为数组属于对象,Object在前面的话,后面的判断就不执行了

二、实现一个叫Man的类,包含attr, words, say三个方法。

var Man;
//+++++++++++答题区域+++++++++++
//+++++++++++答题结束+++++++++++
try{
    var me = Man({ fullname: "小红" });
    var she = new Man({ fullname: "小红" });
    console.group();
    console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender"));
    console.groupEnd();
    /*------[执行结果]------
    我的名字是:小红
    我的性别是:<用户未输入>
    ------------------*/
    me.attr("fullname", "小明");
    me.attr("gender", "男");
    me.fullname = "废柴";
    me.gender = "人妖";
    she.attr("gender", "女");
    console.group();
    console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender"));
    console.groupEnd();
    /*------[执行结果]------
    我的名字是:小明
    我的性别是:男
    ------------------*/
    console.group();
    console.info("我的名字是:" + she.attr("fullname") + "\n我的性别是:" + she.attr("gender"));
    console.groupEnd();
    /*------[执行结果]------
    我的名字是:小红
    我的性别是:女
    ------------------*/
    me.attr({
        "words-limit": 3,
        "words-emote": "微笑"
    });
    me.words("我喜欢看视频。");
    me.words("我们的办公室太漂亮了。");
    me.words("视频里美女真多!");
    me.words("我平时都看优酷!");
    console.group();
    console.log(me.say());
    /*------[执行结果]------
    小明微笑:"我喜欢看视频。我们的办公室太漂亮了。视频里美女真多!"
    ------------------*/
    me.attr({
        "words-limit": 2,
        "words-emote": "喊"
    });
    console.log(me.say());
    console.groupEnd();
    /*------[执行结果]------
    小明喊:"我喜欢看视频。我们的办公室太漂亮了。"
    ------------------*/
}catch(e){
    console.error("执行出错,错误信息: " + e);
}

思路分析:

1.先来一个构造函数

Man=function(info){
};

2.

var me = Man({ fullname: "小红" });
var she = new Man({ fullname: "小红" });

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery实现气球弹出框式的侧边导航菜单效果
Sep 22 Javascript
深入浅析javascript中的作用域(推荐)
Jul 19 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
JS继承之借用构造函数继承和组合继承
Sep 07 Javascript
浅谈js script标签中的预解析
Dec 30 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
微信小程序使用canvas的画图操作示例
Jan 18 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
WebSocket的简单介绍及应用
May 23 Javascript
详解elementui之el-image-viewer(图片查看器)
Aug 30 Javascript
jQuery实现回到顶部效果
Oct 19 jQuery
JS重载实现方法分析
Dec 16 #Javascript
概述一个页面从输入URL到页面加载完的过程
Dec 16 #Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
Dec 16 #Javascript
js继承实现方法详解
Dec 16 #Javascript
详解jQuery简单的表格应用
Dec 16 #Javascript
JS中parseInt()和map()用法分析
Dec 16 #Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 #Javascript
You might like
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
2013/06/24 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
Yii中表单用法实例详解
2016/01/05 PHP
教你php如何实现验证码
2016/01/20 PHP
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
python通过索引遍历列表的方法
2015/05/04 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
Python常用断言函数实例汇总
2020/11/30 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
艺术教育实施方案
2014/05/03 职场文书
情况说明书格式范文
2014/05/06 职场文书
乡镇党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
会议主持词开场白
2015/05/28 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
Redis的字符串是如何实现的
2021/10/24 Redis
详解MySQL的内连接和外连接
2023/05/08 MySQL