OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

JavaScript专业八级测试,你能做对几道?


分享到
分类 求职面试   发布 ourjs  1392214753000
注意 转载须保留原文链接,译文链接,作者译者等信息。  
注* 本文翻译自JavaScript Puzzlers! do you really know JavaScript? (JavaScript迷题!你真的懂JavaScript吗?) 。本文考察了很多JavaScript中生僻冷门用法和许多容易忽视混淆的概念,据多名Hacker News网友回复,做第二遍依然无法全部答对,jser专家们可以尝试一下。


  1. ["1", "2", "3"].map(parseInt)

    你实际上得到的应该是 [1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix) 但 map 传了 3 个 (element, index, array)

  2. [typeof null, null instanceof Object]

    typeof 对原生非可调用对象会始终返回 "object"

  3. [ [3,2,1].reduce(Math.pow), [].reduce(Math.pow)] ]

    根据规范: 在一个空数组上应用reduce会抛初始化错误的异常 TypeError

  4.       var val = 'smtg';
          console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');
        

    它实际上会打印 'Something' 这个 + 操作符的优先级实际上比三元操作符要高.

  5.     var name = 'World!';
        (function () {
          if (typeof name === 'undefined') {
            var name = 'Jack';
            console.log('Goodbye ' + name);
          } else {
            console.log('Hello ' + name);
          }
        })();
        

    var 声明的作用域在整个 function 中, 但并没有初始化

  6.     var END = Math.pow(2, 53);
        var START = END - 100;
        var count = 0;
        for (var i = START; i <= END; i++) {
          count++;
        }
        console.log(count);
        

    这段代码会进入死循环, 2^53 是javascript中最大的数字, 2^53+1 与 2^53 等同, 因此 i 永远也不会比这个数大

  7.     var ary = [0,1,2];
        ary[10] = 10;
        ary.filter(function(x) { return x === undefined;});
        

    Array.prototype.filter 不会应用到缺少的元素上

  8.     var two   = 0.2
        var one   = 0.1
        var eight = 0.8
        var six   = 0.6
        [two - one == one, eight - six == two]
        

    JavaScript 没有精确的数字, 即便它看上去有时侯能正常工作

  9.     function showCase(value) {
          switch(value) {
            case 'A':
              console.log('Case A');
              break;
            case 'B':
              console.log('Case B');
              break;
            case undefined:
              console.log('undefined');
              break;
            default:
              console.log('Do not know!');
          }
        }
        showCase(new String('A'));
        

    switch 使用 === 来枚举,并且 new String(x) !== x

  10.     function showCase2(value) {
          switch(value) {
          case 'A':
            console.log('Case A');
            break;
          case 'B':
            console.log('Case B');
            break;
          case undefined:
            console.log('undefined');
            break;
          default:
            console.log('Do not know!');
          }
        }
        showCase(String('A'));
        

    String(x) 不会返回一个 object 但会返回一个 string, 例如 typeof String(1) === "string"

  11.     function isOdd(num) {
          return num % 2 == 1;
        }
        function isEven(num) {
          return num % 2 == 0;
        }
        function isSane(num) {
          return isEven(num) || isOdd(num);
        }
        var values = [7, 4, '13', -9, Infinity];
        values.map(isSane);
        

    Infinity % 2 返回 NaN, -9 % 2 返回 -1

  12.     parseInt(3, 8)
        parseInt(3, 2)
        parseInt(3, 0)
        

    32进制中不存在, 很显然结果是NaN, 但0呢? parseInt 猜测你的意思是10, 所有返回是3.

  13. Array.isArray( Array.prototype )

    Array.prototype 是一个 Array.

  14.     var a = [0];
        if ([0]) { 
          console.log(a == true);
        } else { 
          console.log("wut");
        }
        

    [0] 被认为是真的,但跟 true 又不等同

  15. []==[]

    == 很邪恶

  16.     '5' + 3  
        '5' - 3
        

    Strings 知道怎么用+, 但是遇到-会被转化为数字

  17. 1 + - + + + - + 1 

    很有意思吧?(我也不清楚)

  18.     var ary = Array(3);
        ary[0]=2
        ary.map(function(elem) { return '1'; });
        

    结果是["1", undefined * 2], 因为map 只能被初始化过的数组成员调用

  19.     function sidEffecting(ary) { 
          ary[0] = ary[2];
        }
        function bar(a,b,c) { 
          c = 10
          sidEffecting(arguments);
          return a + b + c;
        }
        bar(1,1,1)
        

    结果是 21, 在javascript中变量中 arguments 是个对象,所以arguments 和局部变量所引用的内容是一样的。 注* 使用 use strict 可避免这种情况,参见:为什么使用"use strict"可以节约你的时间

  20.     var a = 111111111111111110000,
        b = 1111;
        a + b;
        

    不精确的JavaScript数字即会影响小数,也会影响大数

  21. Number.MIN_VALUE > 0

    Number.MIN_VALUE 是最小的比0大的数, -Number.MAX_VALUE 可能会返回给你一个最大的负整数

  22. [1 < 2 < 3, 3 < 2 < 1]

    隐式转换

  23.     2 == [[[2]]]
        

    每一个对象都被转换成了string,最终成了 "2"

  24.     3.toString()
        3..toString()
        3...toString()
        

    3.x "3" 带上尾数xtoString是合法的, 但空字符串不是

  25.     (function(){
          var x = y = 1;
        })();
        console.log(y);
        console.log(x);
        

    y自动被声明成全局变量, 不在function的域里面.

  26.     var a = /123/, b = /123/;
        a == b
        a === b
        

    根据规范:正则表达式不能比较,因为每个正则都是唯一的。

  27.     var a = [1, 2, 3],
            b = [1, 2, 3],
            c = [1, 2, 4]
        a ==  b
        a === b
        a > c
        a < c
        

    数组通过><会安顺序比较, 但=====不会;

  28.     var a = {}, b = Object.prototype;
        [a.prototype === b, Object.getPrototypeOf(a) === b]
        

    Functions 有一个 prototype 属性,但是其它对象没有,所以 a.prototypeundefined.
    每个 Object 有一个内部的属性可通过Object.getPrototypeOf 访问

  29.     function f() {}
        var a = f.prototype, b = Object.getPrototypeOf(f);
        a === b
        

    f.prototype 是任何被创建出来对象的父对象, 但 new f 会返回 Object.getPrototypeOf 继承的父对象

  30.     function foo() { }
        var oldName = foo.name;
        foo.name = "bar";
        [oldName, foo.name]
        

    name 只读属性. 但是赋值时为什么不会报错呢?我不知道。

  31. "1 2 3".replace(/\d/g, parseInt)

    String.prototype.replace 实现上每组传入的参数为 1, 0, 2, 2, 3, 4.

  32.     function f() {}
        var parent = Object.getPrototypeOf(f);
        f.name // ?
        parent.name // ?
        typeof eval(f.name) // ?
        typeof eval(parent.name) //  ?
        

    function 原型对象被定义在其它地方, 有名字, 可以被执行, 但不在当前的作用域中

  33.     var lowerCaseOnly =  /^[a-z]+$/;
        [lowerCaseOnly.test(null), lowerCaseOnly.test()]
        

    参数被会转换成字符, 因此参数为 "null""undefined".

  34. [,,,].join(", ")

    JavaScript在数组中允许最后一个为逗号,所以原来的那个数组定义了3个 undefined

  35.     var a = {class: "Animal", name: 'Fido'};
        a.class
        

    答案是: 输出需要看是什么浏览器 class 是保留字, 在chrome Firefox 和 Opera中可作为属性名, 但IE不行. 另一方面他们都可以接受其他保留字 (例如 int, private, throws) 作为变量,但class不行.

原文地址: 点此
社区评论 ( Beta版 )
  • #0 最美的时光 1392249115000
    很多都没有实用价值……
  • #1 霓裳洛羽 1392254208000
    @最美的时光

    如果能把有实用价值的都做对也挺NB的。
  • #2 蝶姐yrzhll 1392272609000
    第17题是因为javascript的加法和减法计算是从左到右计算 1 + - (+ (+ (+ (- + 1)))) 最后变成1+1 加法的优先级应该高于自增++ 所有先执行加法 我猜的 嘻嘻
  • #3 蝶姐yrzhll 1392273286000
    @蝶姐yrzhll

    错了 从右往左计算
  • #4 城南往事v5 1392273904000
    9 / 26 of 35这是我做的结果,悲惨
  • #5 借个火点烟123 1392273955000
  • #6 chrome 1392274800000
    35 / 0 of 35
  • #7 风吹裤裆 1392276558000
    结果在哪里看?
  • #8 心丨淡然 1392278157000
    14 / 21 of 35
  • #9 qq142822203 1392349313000
    13 / 22 of 35
  • #10 keatkeat 1392370859000
    8 / 27 of 35 很多特性规范都不太明白,但在开发上还不算有很大的影响,对语法学习倒不少!学习了!
  • #11 爱还逝 1392371560000
    @qq142822203

    去1
  • #12 爱还逝 1392371569000
    @qq142822203

    13qwefrq
  • #13 月光魔术师 1392434283000
    有些是ECMA 1.6以上的规范了,确定所有浏览器都能使用?
  • #14 雪片 1392434376000
    0.8 - 0.6 为什么计算结果是 0.20000000000000007 ,谁能告诉我
  • #15 我没什么好懂的 1392435219000
    8 / 27 of 35
  • #16 高调离席 1392457294000
    [/给力]
  • #17 施主贫僧还想要 1392469511000
    好神奇的东西,拿去装高手不错
  • #18 无泪的遗憾jackieli 1392536828000
    确实是高手的专属题
  • #19 Johnson 1392559838000
    26 / 9 of 35
  • #20 qq143803921 1392691509000
    10/25 of 35
  • #21 omee 1392695731000
    16 / 19 of 35 蒙的
  • #22 雪花 1392706677000
    @最美的时光

    很多东西不是为了用,而是为了避免和发现bug,javascript对于新手来说最大的问题是出了bug都不知道怎么回事。
  • #23 有梦才飞翔 1392786722000
    说没有价值的都在一线,有参考价值的都在上学。。。
  • #24 有梦才飞翔 1392786724000
    说没有价值的都在一线,有参考价值的都在上学。。。
  • #25 貘吃馍香 1392798520000
    @蝶姐yrzhll

    不是加减法计算。简单的说。1 + 为一元运算表达式,其后可以接数字。由于后面是 + 它有二义性,首先是 + 运算符,这里符合语法,其后是表示正数的 + ,此时为 1 + 正数后跟number。但是后面又是 + 依然是表示正数,同理 - 为负数,符合 正负性符号+数字的语法规范,以此类推到遇到数字,为一个完整的数字字母量。如:- - - - -+-+-1 为 -1。注意,这里空格很重要,是为了规避 ++ -- 自增减字面量解析,否则会被认为是 -- 或 ++ 一元运算符,导致语法错误。
  • #26 青春的年少轻狂 1392865886000
    8 / 27 of 35
  • #27 蓝灵 1392867598000
    11 / 23 of 35
  • #28 限迷恋 1392884058000
    第七题的结果是0,1,2,,,,,,,,10,丢人呢!
  • #29 redstone 1393388002000
    我只想说这些是研究javascript的人会就行了,工程化的代码里谁这么写,直接开除就可以了。
  • #30 网事轻尘 1394186880000
    10 / 24 of 35
  • #31 就喜欢这种范儿 1395045170000
    29 / 6 of 35
  • #32 搜狐新人758119 1395200270000
    @蝶姐yrzhll

    因为++不能应用在数字上,只能用在变量上的
  • #33 有田十三 1395642284000
    11/24
  • #34 冰山之脚 1396336291000
    有很多还是有价值的。
  • #35 冰山之脚 1396336312000
    @冰山之脚

    23 / 12 of 35
  • #36 zjhiphop 1396350191000
    32 / 2 of 35
  • #37 搜狐网友96315668 1401256678000
    5 / 30 of 35
  • #38 lively_silence 1407390389664
    • **列表**hjnhnjyjyujuyj

  • #39 cool_violet 1407390419948
    • 列表
  • #40 cool_violet 1407390464783
    • ujujuj


    juuujujuj## juj ##

  • #41 frosty_smoke 1408104484531

    @最美的时光 #0、、 面试如果问这些的我看都不靠谱

  • #42 连云无 1416104490380

    @雪片 #14

    貌似是计算机进制的转换,数字的精确性会不对,具体的要去算。

  • #43 宁仓比 1417566231374

    @雪花 #22

  • #44 16 1419754588075

    13 / 22 of 35

  • #45 16 1419755536172

    @雪片 #14

    js 的数字都是浮点型,是按照IEEE754规范的,

    首先要知道,计算机存储的信息只有1和0,对于一个具体的数字,计算机有可能并不能精确表述该数字,这样就会有误差,计算的过程当中因为一些操作,也会导致最终的结果有误差

  • #46 哇哈哈 1421818290774

    打开控制台,所有的答案都写在按钮的样式里面。是否有问题呢? 例如第9题:代码

    Case A Case B Do not know! undefined

    这里都定义了correct样式了

  • #47 ourjs 1421825711902

    @哇哈哈 #46

    这是BootStrap的默认样式,是后来加上的,答案并无问题。

  • #48 俞屯匆 1422499586438

    第五题,我测试了一下,如果: var name ="world"; (function(){ console.log(typeof name === "undefined"); })(); 输出的是false 也就是说会走else啊 为什么还是Goodbye呢

  • #49 睡觉 1422632615069

    两位数的题号。。。样式需要修改

  • #50 孟成儿 1422761407701

    15 / 20 of 35

  • #51 谢化北 1434087705767

    14 / 20 of 35

  • #52 陈公伪 1436438163965

    20/15 of 35

  • #53 江会会 1436850602562

    18

  • #54 欧丢血 1437978832221

    哇咔咔

  • #55 Alice 1441352692447

    23/12 of 35~

  • #56 Alice 1441363387707

    @就喜欢这种范儿 #31

    大神你好。

  • #57 sandra 1442827131047

    6 / 22 of 35

  • #58 zpxiaomi 1443603393852

    @俞屯匆 #48

    这题的关键在于在name在匿名函数里又被声明了一次,我们知道在javascript的同一个scope里多次声明同一个变量相当于一次声明,不会重新初始化变量值。 但是在两个不同的scope: 一个是全局变量name,另一个是匿名函数里的变量name,两者是不同的。由于hoisting的效果,匿名函数内部的name声明会提前到if判断之前,所以这里的if判断的是匿名函数内部的name而不是全局变量name,而在判断时局部变量name并未赋值(仅仅声明被前提),所以判断undefined 为ture,走第一个condition

  • #59 帷幕 1448384120305

    18/35

  • #60 符幻奸 1449464426925

    对了14道,哎

  • #61 嘿嘿嘿 1454301585178

    16哎

  • #62 殷大伪 1455958241569

    9/26 of 35

  • #63 褚加门 1456119271039

    点完几道题, 就没兴趣了,我太弱了

  • #64 邬充贝 1460367083980

    17 / 18 of 35

  • #65 无怨无悔 1461058128789

    12 / 23 of 35, 使用JS快4年了,好丢人

  • #66 幻精灵 1467710654368

    13 / 22 of 35,哈哈~惨!

  • #67 叶归关 1467713627190

    1 - - 1 = 2

  • #68 赵扔凤 1467723027849

    @雪片 #14

    浮点数吧

  • #69 幻精灵 1467971151372

    @叶归关 #67

    此题,我总结了个规律: 首先,忽略所有的+号, 得到: 1 - - 1 然后 - - 得正,成为 + 号,得到:1 1 把最后的操作数相加,即为结果

  • #70 康入匠 1468391149317

    15/20

  • #71 丁帅州 1479397670400

    没人发现第 32 题答案错了吗?

  • #72 庄为永 1481875287982

    20 / 15 of 35

  • #73 童欠团 1487816169253

    @蝶姐yrzhll #2 不对

  • #74 廖正吊 1492523299792

    28 / 7 of 35

  • #75 霍耳考 1496724914290

    @雪片 #14

    因为JS中对小数不太精确,太大的数字也不精确

  • #76 李历史 1500633902716

    9 / 26 of 35

  • #77 Bat3Q 1502858703143

    陌生的js让我窒息,然而更多的学习,让我们飞舞!

  • #78 车升丑 1504775042402

    确实,很多都没有实用价值

OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 你不知道的JavaScript用法,Hacker是这样写JS的
  2. QQ邮箱是如何泄密的:JSON劫持漏洞攻防原理及演练
  3. 那些用JavaScript写的操作系统
  4. 为什么大神级程序员的C语言代码里到处都是goto?
  5. 下一阶段的NodeJS:TJ负责Node,NPM可能要收费
  6. Web标准化正在消灭HTML程序员
  7. 告诉大家一个好消息,我被炒了!
  8. PayPal为什么从Java迁移到Node.js,性能提高一倍,文件代码减少44%
  9. NPM开始招人了
  10. 一名靠谱的JavaScript程序员应备的素质
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 求职面试
  1. JavaScript专业八级测试,你能做对几道?
  2. 如何面试前端工程师:Github很重要
  3. 编程面试的10大算法概念汇总
  4. 长时间工作意味着什么
  5. 跨国求职: 张江男曲折的出国梦
  6. 苹果面试8大难题及答案

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号