JS夯实基础:Javascript 变态题解析 (上)

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

1、知识点:

  首先,map接受两个参数,一个回调函数 callback, 一个回调函数的this值。其中,回调函数接受三个参数 currentValue、index、arrary(当前值,索引,整个数组);而题目中,map只传入了回调函数:parseInt。

  其次,parseInt 只接受两个两个参数 string、radix(基数)。所以这string就相当于参数currentValue,radix就相当于参数index

//所以本题即问
parseInt(‘1‘, 0);
parseInt(‘2‘, 1);
parseInt(‘3‘, 2);

//首先后两者参数不合法。其中0,1,2就是索引index
//所以答案是 [1, NaN, NaN]

  理解本题最主要是要知道:(1)map的回调函数的3个参数含义;(2)parseInt只能接受2个参数,及参数含义

[typeof null, null instanceof Object]

2、两个知识点:

  typeof 返回一个表示类型的字符串。

  instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

  这个题比较简单,答案就是: ["object", false]。typeof 的结果请看下表:

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

3、知识点:

  arr.reduce(callback[, initialValue])

  reduce接受两个参数,一个回调,一个初始值。

  回调函数接受四个参数 previousValue, currentValue, currentIndex, array

  需要注意的是 If the array is empty and no initialValue was provided, TypeError would be thrown.

  所以第二个表达式会报异常。第一个表达式等价于 Math.pow(3, 2) => 9; Math.pow(9, 1) =>9

  答案 an error

  注意:reduce和map打出来的参数不一样。相当于数组[3,2,1]完全成为了回调函数的参数,然后回调函数Math.pow(3,2)=9,再作为previousValue参数传给回调函数。那么第二行的currentValue=1是怎么回事呢?我们再验证下:

  也就是说previousValue就是索引0的值,索引从1开始,然后currentValue就是当前数组的索引的值。然后依次往下,理解这点比较重要。

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

4、两个知识点:

  简而言之 + 的优先级 大于 ?

  所以原题等价于 ‘Value is true‘ ? ‘Somthing‘ : ‘Nonthing‘ 而不是 ‘Value is‘ + (true ? ‘Something‘ : ‘Nonthing‘)

  答案 ‘Something‘。虽然这道题都可以答对,但是真正含义不一定都清楚。

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

5、这个相对简单, 一个知识点:

  在 JavaScript中, functions 和 variables 会被提升。变量提升是JavaScript将声明移至作用域 scope (全局域或者当前函数作用域) 顶部的行为。

  这个题目相当于:

var name = ‘World!‘;
(function () {
    var name;
    if (typeof name === ‘undefined‘) {
        name = ‘Jack‘;
        console.log(‘Goodbye ‘ + name);
    } else {
        console.log(‘Hello ‘ + name);
    }
})();
//所以答案是 ‘Goodbye Jack‘
var END = Math.pow(2, 53);
var START = END - 100;
var count = 0;
for (var i = START; i <= END; i++) {
    count++;
}
console.log(count);

6、一个知识点:

  在JS里,Math.pow(2,53)是可以表示最大值的,最大值加1还是最大值,所以循环不会停。

  JS中可以表示的最大整数不是2的53次方,而是1.7976931348623157e+308。2的53次方不是js能表示的最大整数而应该是能正确计算且不失精度的最大整数,可以参见js权威指南。9007199254740992 +1还是 9007199254740992 ,这就是因为精度问题,如果 9007199254740992 +11或者 9007199254740992 +111的话,值是会发生改变的,只是这时候计算的结果不是正确的值,就是因为精度丢失的问题。

原文地址:https://www.cnblogs.com/goloving/p/8678696.html

时间: 2024-10-11 15:26:13

JS夯实基础:Javascript 变态题解析 (上)的相关文章

44个 Javascript 变态题解析 (上\下)

第1题 ["1", "2", "3"].map(parseInt) 知识点: Array/map Number/parseInt JavaScript parseInt 首先, map接受两个参数, 一个回调函数 callback, 一个回调函数的this值 其中回调函数接受三个参数 currentValue, index, arrary; 而题目中, map只传入了回调函数--parseInt. 其次, parseInt 只接受两个两个参数 s

44个 Javascript 变态题解析 (上)

原题来自: javascript-puzzlers(http://javascript-puzzlers.herokuapp.com/) 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44- 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了-. 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题 ["1", "2", "3"].map(parseInt) 知识点: Array/map

44个 Javascript 变态题解析

原题来自: http://javascript-puzzlers.herokuapp.com/ 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了.... 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题 ["1", "2", "3"].map(parseInt) 知识点: Array/map Number/parseInt

Javascript 变态题解析

读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了.... 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题 ["1", "2", "3"].map(parseInt) 知识点: Array/map Number/parseInt JavaScript parseInt 首先, map接受两个参数, 一个回调函数 callba

44个javascript 变态题解析

原题来自: javascript-puzzlers 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44… 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题 1 ["1", "2", "3"].map(parseInt) 知识点: Array/map Number/parseInt Global_Objects/parseInt

JS夯实基础:Javascript 变态题解析 (下)

function sidEffecting(ary) { ary[0] = ary[2]; } function bar(a,b,c) { c = 10 sidEffecting(arguments); return a + b + c; } bar(1,1,1) 16.这是一个大坑,尤其是涉及到 ES6语法的时候.知识点: Functions/arguments 首先 The arguments object is an Array-like object corresponding to t

js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量.作用域 javascript按照ECMA-262 的定义,变量与其他语言变量有所不同.js变量时松散的,不需要事先定义变量类型的.这使得他只是一个保存特定值的一个名称.变量与其数据类型可以在脚本的生命周期内改变. 还有明白几点: JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域. 基本类型和引用类型的值 ECMAScript 的变量有两种不同的数据类型:分别是 基本数据类型值 和 引用类型值 : 基本数据

JS基础----&gt;javascript的基础(一)

记录一些javascript的基础知识.只是一起走过一段路而已,何必把怀念弄的比经过还长. javascript的基础 一.在检测一个引用类型值和 Object 构造函数时, instanceof 操作符始终会返回 true . var str1 = "huhx"; var str2 = new String("huhx"); console.log(str1 instanceof Object); // false console.log(str2 instanc

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留