资讯专栏INFORMATION COLUMN

你真的了解javascript吗?(一)

whatsns / 1401人阅读

摘要:表示要解析的数字的基数。回调函数接收四个参数,依次是通过上一次调用回调函数获得的值。如果向方法提供,则在首次调用函数时,为。当前数组元素的值。

原题出处:JavaScript Puzzlers!
当初以为不过是一些小题目,结果做到怀疑人生,都要怀疑可能我javascript白学了。读者可以去试试。

不多说,直接上题:

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

不要被套路,这题没看上去那么简单,首先我们来看看Array.map这个函数:

array.map(function(currentValue,index,arr), thisValue)

map() 方法按照原始数组元素顺序依次处理元素,返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

map接收两个参数,一个回调函数,一个是可选的回调函数的this值,默认为undefined

其中回调函数接收三个参数,依次是当前元素的值,可选的当前元素的索引值和当期元素属于的数组对象

题目中只传入了parseInt函数,让我们再看看parseInt这个函数:

parseInt(string, radix)

parseInt() 函数可解析一个字符串,并返回一个整数。
string: 必需。要被解析的字符串。
radix: 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。

当忽略参数 radix , JavaScript 默认数字的基数如下:

如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。

如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。

如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

把这题分开来看就是:

// parseInt(currenValue, index)
parseInt("1", 0)    // 1
parseInt("2", 1)    // NaN
parseInt("3", 2)    // NaN

答案就是: [1, NaN, NaN]

第二题
[typeof null, null instanceof Object]

这题还好一点,typeof 返回一个表示类型的字符串. instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上.

我们都知道在javascript一切皆是对象,所以第一部分不用说,返回的肯定是Object,但是null并不存在于参数 object 的原型链上.

所以答案就是: [Object, false]

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

先说说Array.reduce这个方法吧:

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

reduce接收两个参数,一个回调函数,一个可选的将用作累积的初始值。

如果提供了 initialValue,则 reduce 方法会对数组中的每个元素调用一次 callbackfn 函数(按升序索引顺序)。如果未提供 initialValue,则 reduce 方法会对从第二个元素开始的每个元素调用 callbackfn 函数。

回调函数接收四个参数,依次是

通过上一次调用回调函数获得的值。如果向 reduce 方法提供 initialValue,则在首次调用函数时,total 为 initialValue。

当前数组元素的值。

当前数组元素的数字索引。

包含该元素的数组对象。

Math.pow(x,y)

pow() 方法返回 x 的 y 次幂。

[3, 2, 1].reduce(Math.pow) 拆分开来就是:

Math.pow(3, 2)    // 9
Math.pow(9, 1)    // 9

但是reduce在两个情况下会抛出异常:

当满足下列任一条件时,将引发 TypeError 异常: callbackfn 参数不是函数对象。

数组不包含元素,且未提供 initialValue。

所以 [].reduce(Math.pow) 会抛出异常

答案为:an error

第四题
var val = "smtg";
console.log("Value is " + (val === "smtg") ? "Something" : "Nothing");

这题看上去很简单对不对?答案不就是 Value is Something,如果你真的这么想,你会哭的,是的,笔者已经亲自试毒了。

简单来说就是+的优先级大于?

所以原题等价于:

console.log("Value is true" ? "Something" : "Nothing")

答案应该是 Something

第五题
var name = "World!";
(function () {
    if (typeof name === "undefined") {
        var name = "Jack";
        console.log("Goodbye " + name);
    } else {
        console.log("Hello " + name);
    }
})();

我还是先说答案吧,可能你们会不相信,答案就是 Goodbye, Jack

为什么会这样呢,因为在javascript里,声明变量或函数会被提升,就是说,
变量提升是JavaScript将声明移至作用域 scope (全局域或者当前函数作用域) 顶部的行为。
你可以先使用一个函数或变量,再声明它:

show("Wiess")    // Hello Wiess
function (name) {
    console.log("Hello " + name)
}

但是javascript只提升声明,而不是初始化,如果使用一个在已经使用后才声明和初始化的值,这个值将是undefined

所以这题就相当于:

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

到这里是不是有点肝疼?习惯就好,习惯就好

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

Math.pow(2, 53) = 9007199254740992(可以表示的最大值) 最大值加1还是9007199254740992,所以这个循环会一直下去

答案是: other

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

这里先科普一下Array.filter():

var newArray = array.filter(function(currentValue,index,arr), thisValue)

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

filter接收两个参数, 一个回调函数,一个是可选的回调函数的this值,默认为undefined

回调函数依次接收三个参数:

必须。当前元素的值

可选。当期元素的索引值

可选。当期元素属于的数组对象

再说稀疏矩阵,当你取数组中某个没有定义的数时:

arr[4]    // undefined

但是当你遍历它时,你会发现,它并没有元素。
JavaScript会跳过这些缝隙.

所以答案为: []

第八题
var two   = 0.2
var one   = 0.1
var eight = 0.8
var six   = 0.6
[two - one == one, eight - six == two]

这题笔者认为应该选[false, false],但是答案却是[true, false]

就不说javascript里没有精确的浮点数了,这个大家应该都知道,但是为什么不能一视同仁呢?!希望有个大神来解答一下

第九题
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,在switch里,比较用的是 ===,所以new String("A") 与 字面声明的 "A"是不一样的,所以答案是 Do not know!

第十题
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!");
    }
}
showCase2(String("A"));

String(x)不创建对象,但返回一个字符串,即typeof String(1)===“string”

所以答案为 Case A

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88175.html

相关文章

  • JS基础篇--JS的DOM操作 - 真的了解?

    摘要:摘要想稍微系统的说说对于的操作把和常用操作的内容归纳成思维导图方便阅读同时加入性能上的一些问题前言在前端开发的过程中极为重要的一个功能就是对对象的操作无论增删改查在前端页面操作这一范围内都是比较消耗性能的如何高效率的便捷的操作这就是本文要讲 摘要 想稍微系统的说说对于DOM的操作,把Javascript和jQuery常用操作DOM的内容归纳成思维导图方便阅读,同时加入性能上的一些问题....

    DirtyMind 评论0 收藏0
  • 真的了解Object.defineProperty

    摘要:前言想到,首先不得不提到对象,对象是的基础,有一种常见的说法中万物皆是对象。这种说法其实并不那么准确,根据对语言类型的分类,就可以得出并不是万物皆对象,这次就不对这个问题进行展开,感兴趣可以点击万物皆对象 1. 前言 想到Object.defineProperty,首先不得不提到对象,对象是JavaScript的基础,有一种常见的说法JavaScript中万物皆是对象。 这种说法其实并...

    894974231 评论0 收藏0
  • 真的了解this指向

    摘要:前言相信很多人都对中的指向问题一知半解,所以今天就来详细看看它到底是怎么判断的。椎确来说是函数调用时是否有引用上下文对象。隐式绑定,上下文对象无上下文对象显示绑定这也是常用的的方式就不一一举例了。 前言 相信很多人都对JavaScript中的this指向问题一知半解,所以今天就来详细看看它到底是怎么判断的。 一. 先看几道题 var length = 10; functio...

    liaorio 评论0 收藏0
  • 2019前端工程师自检清单与思考

    摘要:前端工程师自检清单对于,掌握其语法和特性是最基本的,但是这些只是应用能力,最终仍旧考量仍然是计算机体系的理论知识,所以数据结构,算法,软件工程,设计模式等基础知识对前端工程师同样重要,这些知识的理解程度,可以决定你在前端工程师这条路上能走多 2019前端工程师自检清单 对于JavaScript,掌握其语法和特性是最基本的,但是这些只是应用能力,最终仍旧考量仍然是计算机体系的理论知识,所...

    Honwhy 评论0 收藏0
  • JavaScript百炼成仙》统回复粉丝们的些问题

    摘要:期间,我还遇到了几个校友,真的是大受感动。所以,我专门开个贴回复一下老铁们的问题。前几章,尤其是函数七重关的部分,真的是我自己对基础细节的提炼和感悟,是我最满意的。后面的节奏确实是快了些,嗯,下一本书我会好好改进的。 感谢老铁们能喜欢这本书,这两天评论和私信很多,我几乎每一条都会认真看。哈哈...

    Pluser 评论0 收藏0

发表评论

0条评论

whatsns

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<