第一题:
function * gen(){
yield 1;
yield 2;
yield 3;
}
let a = gen().next();
console.info(a);
/**
解析(第一题)
生成器函数:
它允许你定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。
生成器函数使用 function*语法编写。 最初调用时,生成器函数不执行任何代码,
而是返回一种称为Generator的迭代器。 通过调用生成器的下一个方法消耗值时,Generator函数将执行,
直到遇到yield关键字。
因此,上述函数只能执行一次 next()
结果{value:1,done:false}
迭代器函数:
迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。
更具体地说,迭代器是通过使用 next() 方法实现 Iterator protocol 的任何一个对象。
它提供了一个 next() 方法,用来返回序列中的下一项。这个方法返回包含两个属性:
done 和 value。迭代器对象一旦被创建,就可以反复调用 next()。
*/
//迭代器
function makeRangeIterator(start = 0, end = Infinity, step = 1) {
let nextIndex = start;
let iterationCount = 0;
const rangeIterator = {
next: function() {
let result;
if (nextIndex < end) {
result = { value: nextIndex, done: false }
nextIndex += step;
iterationCount++;
return result;
}
return { value: iterationCount, done: true }
}
};
return rangeIterator;
}
//使用
let it = makeRangeIterator(1, 10, 2);
let result = it.next();
while (!result.done) {
//console.log(result.value); // 1 3 5 7 9
result = it.next();
}
//console.log("Iterated over sequence of size: ", result.value);
第二题:
最大整数语句正确的是:
//第二题
var arr=[0,1,3,99];
console.info(Math.max(arr)); //n
onsole.info(Math.max(arr[0],arr[1],arr[2],arr[3])); //y
console.info(Math.max.call(Math,arr[0],arr[1],arr[2],arr[3])); //y
console.info(Math.max.apply(Math,arr)); //y
/**
第二题解析
函数Math.max(x) 参数是Number类型,可以是小数,整数,正数,负数或者是0,
如果不是上面所述类型就会返回NAN
下面是apply和call
call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,
而apply()方法接受的是一个参数数组。
func.apply(thisArg, [argsArray])
thisArg:在 func 函数运行时使用的 this 值,
如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指 向全局对象,
原始值会被包装。
argsArray:个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数.
*/
//拓展:利用 apply 将数组添加至另一个数组
var array = ['a','b','c','d'];
var elements = [0,1,2,3];
array.push.apply(array,elements);
//console.info(array)
array.push.call(array,elements[0],elements[1],elements[2],elements[3]);
//console.info(array)
//apply 允许在本来需要遍历的任务中使用内建函数
//利用apply 找出最大值或者最小值
//"use strict";
var numbers = [5,6,2,7,10,23];
var max = Math.max.apply(undefined,numbers);
var min = Math.min.apply(undefined,numbers);
console.info(max)
console.info(min)
//如果你的参数数组可能非常大,可以将参数数组切块后循环传入目标
function minOfArray(arr) {
var min = Infinity;
var QUANTUM = 32768;
for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
var submin = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
min = Math.min(submin, min);
}
return min;
}
var min = minOfArray([5, 6, 2, 3, 7]);
第三题:
写一个函数traverse,输出页面所有页面高度和宽度大于50像素的节点
//第三题
//写一个函数traverse,输出页面所有页面高度和宽度大于50像素的节点
function traverse(){
var arr = []; //输出目标数组
var elements = []; //数组用来存放所有的节点
if(document.all){
elements = document.all;
}else{
elements = document.getElementsByTagName("*");
}
console.info(elements)
for(var i=0;i<elements.length;i++){
var element = elements[i];
var width = parseFloat(element.style.width)||element.offsetWidth;
var height = parseFloat(element.style.height)||element.offsetHeight;
if(width > 50 || height > 50){
arr.push(element);
}
}
return arr;
}
window.onload = function(){
console.info(traverse());
}