题目集合

版权声明: https://blog.csdn.net/qq_39207948/article/details/81396345

1、且运算或运算---考点:逻辑操作

且运算符"&&"的运算规则是:如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);

如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值。

eg:返回参数 a 和 b 的逻辑且运算结果

function and (a,b){

     return !!(a&&b);

}

返回的是布尔值;不加!!转义的话,若果a为布尔型,b不为布尔型,则返回的是b的值。

2、避免全局变量---考点:编码规范

在Javascript语言中,声明变量使用的都是关键字var,如果不使用var而直接声明变量,则该变量为全局变量。

ECMAScript 6 新增 const 和 let 命令,用来声明变量。

声明方式 变量提升 作用域 初始值 重复定义
const 块级 需要 不允许
let 块级 不需要 不允许
var 函数级 不需要 允许

let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的

3、改变上下文---考点:对象

题目描述 考察:call() apply() bind() 改变上下文this

将函数 fn 的执行上下文改为 obj 对象 

输入例子:

speak(function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'})

输出例子:

Hello, Rebecca!!!

1

2

3

4

5

6

7

//三种方案

//apply

function speak(fn, obj) {    return fn.apply(obj);}

//call

function speak(fn, obj) {    return fn.call(obj);}

//bind

function speak(fn, obj) {    return fn.bind(obj)();}

注意:在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,可以通过Function对象中的call或者apply方法来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第一个参数传入即可。

该方法的作用和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。

语法

fun.call(thisArg, arg1, arg2, ...)

参数

thisArg

fun函数运行时指定的this值。需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为nullundefinedthis值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

arg1, arg2, ...

指定的参数列表。

返回值

返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined

描述

可以让call()中的对象调用当前对象所拥有的function。你可以使用call()来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。

4、乘法---考点:number

题目描述

求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题

解答:(1)

function multiply(a, b) {
  var LEN=len(a)+len(b);
    return parseFloat(a*b).toFixed(LEN);
}
function len(num){
    var NUM=""+num;
    if(NUM.indexOf(".")==-1){
        return 0;
    }
    else{
        //return NUM.substring(NUM.indexOf(".")+1).length;
        return NUM.length-NUM.indexOf(".")-1;
    }
}

解答:(2)

//先判断两个数的小数点位数,然后用toFixed取得精度之和

function multiply(a, b) {
    var _a=""+a;
    var _b=""+b;
    var _alen=_a.split(".")[1]?(_a.split(".")[1].length):0;
    var _blen=_b.split(".")[1]?(_b.split(".")[1].length):0;
    return parseFloat(a*b).toFixed(_alen+_blen);
}
综上:判断小数点后面的精度方法有:(1)用split(".")[1] ,注意整数没有返回值的情况。(2)用substring(indexOf(".")+1).length。(3)用字符串总长度-indexOf(".")-1

5、计数---考点:数组

题目描述

统计数组 arr 中值等于 item 的元素出现的次数

解答:

 
  1. //filter()-->利用指定的函数确定是否在返回的数组中包含某一项

  2. function count(arr, item) {

  3. var count = arr.filter(function(a) {

  4. return a === item; //返回true的项组成的数组

  5. });

  6. return count.length;

  7. }

补充:

filter 方法 (Array) (JavaScript) 返回数组中的满足回调函数中指定的条件的元素。

语法

 
  1.  
  2. array1.filter(callbackfn[, thisArg])

参数

参数

定义

array1

必需。 一个数组对象。

callbackfn

必需。 一个接受最多三个参数的函数。 对于数组中的每个元素,filter 方法都会调用 callbackfn 函数一次。

thisArg

可选。 可在 callbackfn 函数中为其引用 this 关键字的对象。 如果省略 thisArg,则 undefined 将用作 this 值。

返回值

一个包含回调函数为其返回 true 的所有值的新数组。 如果回调函数为 array1 的所有元素返回 false,则新数组的长度为 0。

 
  1. //map()-->对数组中的每一项进行给定函数,

  2. //返回每次函数条用的结果组成的数组;

  3. function count(arr, item) {

  4. var count = 0;

  5. arr.map(function(a) {

  6. if(a === item) {

  7. count++;

  8. }

  9. });

  10. return count;

  11. }

  12. //for循环

  13. function count(arr, item) {

  14. var count = 0;

  15. for(var i=0; i<arr.length; i++) {

  16. if(arr[i] === item) {

  17. count++;

  18. }

  19. }

  20. return count;

  21. }

  22. //reduce()-->从数组的第一项开始,逐个遍历到最后;

  23. function count(arr, item) {

  24. var count = arr.reduce(function(prev, curr) {

  25. return curr === item ? prev+1 : prev;

  26. }, 0);

  27. return count;

  28. }

 

补充:

reduce()reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

语法

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

参数

参数 描述
function(total,currentValue, index,arr) 必需。用于执行每个数组元素的函数。
函数参数:
参数 描述
total 必需。初始值, 或者计算结束后的返回值。
currentValue 必需。当前元素
currentIndex 可选。当前元素的索引
arr 可选。当前元素所属的数组对象。
initialValue 可选。传递给函数的初始值

//forEach()-->对数组中的每一项运行传入的函数 function count(arr, item) { var count = 0; arr.forEach(function(a) { a === item ? count++ : 0; }); return count; }

 

 补充:

forEach() 方法

定义和用法

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

注意: forEach() 对于空数组是不会执行回调函数的。

语法

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

参数

参数 描述
function(currentValue, index, arr) 必需。 数组中每个元素需要调用的函数。
函数参数:
参数 描述
currentValue 必需。当前元素
index 可选。当前元素的索引值。
arr 可选。当前元素所属的数组对象。
thisValue 可选。传递给函数的值一般用 "this" 值。
如果这个参数为空, "undefined" 会传递给 "this" 值
返回值: undefined

5、批量改变对象的属性:对象

题目描述

给定一个构造函数 constructor,请完成 alterObjects 方法,将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。

解答:

这是原型链问题。访问一个对象的方法或者是属性,首先会在该对象中寻找,如果找到则返回,如果没找到,则在其原型链上面向上寻找,直至基原型,如还未找到,则返回undefined。将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量,只需要在constructor的原型上面添加greeting属性,并指定值。

1

2

3

function alterObjects(constructor, greeting) {

  constructor.prototype.greeting = greeting;

 }

猜你喜欢

转载自blog.csdn.net/qq_39207948/article/details/81396345
今日推荐