题目
以下代码输出什么?
for(var i = 0; i< 6; i++){
if(i % 4 === 0){
break;
}
console.log(i);
}
复制代码
答案:不输出
原因:当i = 0 的时候,0 % 4 === 0,直接break跳出循环了
考察:break跳出最外层循环,continue跳出本轮循环
题目
以下代码中 result的值输出什么
var result = sum(3, 4)
console.log(result)
function sum(a, b){
return console.log(a + b)
}
复制代码
答案:undefined
原因: return console.log(a + b)
它的返回值是undefined
考察:console.log()作为返回值的时候返回的结果是undefined
题目
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn() //输出多少
复制代码
答案: 2
原因:执行fn,执行fn1(已经读取到了(fn2 fn3 a = 2
),返回fn3,执行fn3,执行fn2,输出变量a,先从当前作用于找变量a,没找到。接着从父作用于查找,也就是fn1内部,发现a = 2。这里有个疑问,为什么这里的变量a没有发生变量的声明前置呢?如果发生了声明前置最终的返回结果就是undefined。原因是当函数执行fn1时,程序已经自上而下的存储了变量和函数的声明包括变量的值,也就是或当return fn3的时候,已经读取到该作用于下的a = 2了,因此当找到该作用域的时候就直接拿到这个变量a的值了
考察:作用域链
题目叫
var a = 1
function fn1(){
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
function fn2(){
console.log(a)
}
var fn = fn1()
fn() //输出多少
复制代码
答案:1
原因: 执行fn,执行fn1(读取到了fn3 ,a = 2
),返回fn3,执行fn3,执行fn2,执行fn2的所属作用域没有fn2,到它的父作用域fn1里面找也没有,到全局作用域里找,定义了fn2,执行fn2,输出变量a,先从变量当前所属作用域找发现没有值,到父作用域也就是全局作用域找发现全局作用域下有a = 1,全局变量就相当于在window对象下定义了一个属性 window,a = 1。
考察: 作用域链
题目
如下代码的输出?为什么?
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
f2(c)
f1(c.age)
console.log(a)
console.log(c)
复制代码
考点: 引用类型
注释:f1(a) 相当于:
function f1 ( n ) {
var n = a
++ n // 非引用类型的赋值只是值的拷贝 a = 1, 所以 n =2
}
复制代码
f2(c) 相当于:
function( obj) {
var obj = c // c = {name: 'jirengu' ,' age: 2'} 对象是按引用传递,赋值的内容是c的指针地址 obj = {name: 'jirengu' ,' age: 2'}
++ obj.age // obj = {name: 'jirengu' ,' age: 3'} 所以此时c = {name: 'jirengu' ,' age: 3'}
}
复制代码
f1(c.age) 相当于
function f1(n){
var n= c.age // c.age=2是非引用类型
++n // 所以此时 n = 3
}
复制代码
console.log(a) 的值是 1
console.log( c) 的值是 {name: 'jirengu' ,' age: 3'}
题目
写一个函数squireArr,其参数是一个数组,返回一个新的数组,新数组中的每一项是原数组对应值的平方,原数组不变
var arr = [3, 4, 6]
function squireArr( arr ){
//补全
}
var arr2 = squireArr(arr)
console.log(arr) // [3, 4, 6]
console.log(arr2) // [9, 16, 36]
复制代码
答案:
return arr.map(function(ele) { // 第一个return是函数 squireArr的返回结果
return ele * ele // 第二个return是回调函数的返回结果
})
复制代码
题目
写一个函数squireArr,其参数是一个数组,作用是把数组中的每一项变为原值的平方
var arr = [3, 4, 6]
function squireArr( arr ){
//补全
}
squireArr(arr)
console.log(arr) // [9, 16, 36]
复制代码
答案:
return arr.forEach(function(e,i,array) {
return array[i] = e * e
})
复制代码
题目
写一个函数,返回参数的平方和?
function sumOfSquares(){
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
复制代码
答案:
function sumOfSquares(arg){
var result = 0
for( var i in arguments) {
if ( typeof arguments[i] !== 'number') {
return "请输入一个数字"
} else {
result += arguments[i] * arguments[i]
}
}
return result;
}
复制代码
题目
以下代码输出什么?
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}
getInfo('饥人谷', 2, '男');
getInfo('小谷', 3);
getInfo('男');
复制代码
答案:
name:饥人谷 , age: 2 , sex: 男 [ '饥人谷', 2, '男'] name valley
name:小谷 , age: 3 , sex: undefined ['小谷', 3] name valley
name: 男 , age: undefined , sex: undefined [ '男'] name valley
复制代码
题目
求n!,用递归来实现。
答案:
function factorial(n) {
if(n === 0) {
return 1
} else {
return n * factorial(n - 1)
}
}
复制代码
题目
立即执行函数表达式是什么?有什么作用?
答案:
立即执行函数表达式就是:声明一个匿名函数,马上调用这个匿名函数
创建一个独立的作用域。这个作用域里面的变量,外面访问不到,即避免变量污染
题目
如下代码输出什么? 为什么
var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 }
var d = [a, b, c]
var aa = a
var bb = b
var cc = c
var dd = d
a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3
console.log(aa)
console.log(bb)
console.log(cc)
console.log(dd)
复制代码
答案:
console.log(aa) //输出 1 非引用类型直接赋值
console.log(bb) //输出 2 非引用类型直接赋值
console.log(cc) //输出 { name: 'hello', age: 3 } 引用类型赋值指向相同位置
console.log(dd) //输出 [1, 2, { name: 'hello', age: 3 } ] 引用类型赋值指向相同位置
复制代码
题目
写一个函数,操作数组,返回一个新数组,新数组中只包含正数
function filterPositive(arr){
var arr2 = arr.slice()
return arr2.filter(function(e){
return typeof e == "number" && e > 0
})
}
var arr = [3, -1, 2, '饥人谷', true]
filterPositive(arr)
console.log(filterPositive(arr)) //[3, 2]
复制代码
题目
以下代码输出什么?
var name = 'sex'
var company = {
name: '饥人谷',
age: 3,
sex: '男'
}
console.log(company[name])
复制代码
答案:男
备注:注意区分company[name] 和 company["name"]的区别,带双引号的是对象的属性名,不带引号的就是一个变量
题目
用 splice函数分别实现 push、pop、shift、unshift方法。
push: 向数组的最后一位添加一个元素
var arr = [3, 4, 5]
function add (arr) {
arr.splice(arr.length,0,1)
return arr
}
复制代码
pop:向数组的最后一位删除一个元素
var arr = [3, 4, 5]
function remove (arr) {
arr.splice(arr.length-1,1)
return arr
}
复制代码
shift:删除数组的第一个元素
var arr = [3, 4, 5]
function removefirst (arr) {
arr.splice(0,1)
return arr
}
复制代码
unshift: 向数组的第一个元素添加元素
var arr = [3, 4, 5]
function addfirst (arr,1) {
arr.splice(0,0,x)
return arr
}
复制代码
题目 写补全sortString函数,实现字符串倒序
// 方法 1
function sortString( str ){
return str.split('').reverse().join('');
};
// 方法 2
function sortString( str ){
var stack = [];//生成一个栈
for(var len = str.length,i=len;i>0;i-- ){
stack.push(str[i]);
}
return join('');
};
复制代码
题目
写一个函数,生成一个随机 IP 地址,一个合法的 IP 地址为 0.0.0.0~255.255.255.255。
答:
function getRandIP(){
var ip = []
for(var i = 0; i<4; i++){
ip = ip+Math.floor(Math.random()*256)+"."
}
return ip
}
var ip = getRandIP()
console.log(ip)
复制代码
题目
写一个函数,生成一个随机颜色字符串,合法的颜色为#000000~ #ffffff。
答:
function getRandColor(length){
var str = '#'
var dict = '0123456789abcdef'
for(var i = 0;i < 6;i++){
var index = Math.floor(Math.random()*dict.length)
str += dict[index]
}
return str
}
var color = getRandColor()
console.log(color)
复制代码
题目
写一个函数,返回从min到max之间的 随机整数,包括min不包括max 。
答:
function sum(min,max){
var sum =Math.floor(Math.random()*(max-min))+min
return sum
}
复制代码
题目 写一个函数,生成一个长度为 n 的随机字符串,字符串字符的取值范围包括0到9,a到 z,A到Z。
function getRandStr(len){
var str = "0123456789zxcvbnmlkjhgfdsaqwertyuiopMBVCXZASDFGHJKLOPIUYTREWQ"
var str2=""
for(var i=0; i<=len; i++){
str2=str2+str[Math.floor(Math.random()*61)]
}
return str2
}
复制代码
题目
写一个函数,参数为时间对象毫秒数的字符串格式,返回值为字符串。假设参数为时间对象毫秒数t,根据t的时间分别返回如下字符串:
- 刚刚( t 距当前时间不到1分钟时间间隔)
- 3分钟前 (t距当前时间大于等于1分钟,小于1小时)
- 8小时前 (t 距离当前时间大于等于1小时,小于24小时)
- 3天前 (t 距离当前时间大于等于24小时,小于30天)
- 2个月前 (t 距离当前时间大于等于30天小于12个月)
- 8年前 (t 距离当前时间大于等于12个月)
答:
function friendlyDate(time){
var t = (Date.now()-3601000)-time
while(t<1*60*1000){ return "刚刚" } while(t>=1601000 && t<1*60*60*1000){ return "3分钟前" } while(t>=160601000 && t<2460601000){
return "8小时前"
}
while(t>=2460601000 && t<302460601000){
return "3天前"
}
while(t>=302460601000 && t<12302460601000){
return "2个月前"
}
while(t>=1230246060*1000){
return "8年前"
}
}
var str = friendlyDate( '1484286699422' ) // 1分钟前
var str2 = friendlyDate('1483941245793') //4天前
console.log(str)
console.log(str2)
复制代码
题目
答:
function reduce(arr, iteratee, initValue){
var tmpArr = (initValue === undefined ? [] : [initValue]).concat(arr)
while(tmpArr.length > 1){
tmpArr.splice(0, 2, iteratee(tmpArr[0], tmpArr[1]))
}
return tmpArr[0]
}
var sum = reduce([1,2,3], function(v1, v2){
return v1 + v2
},0)
console.log(sum)
复制代码
题目
实现一个flatten函数,将一个嵌套多层的数组 array(数组) (嵌套可以是任何层数)转换为只有一层的数组,数组中元素仅基本类型的元素或数组,不存在循环引用的情况。 Ex::
flatten([1, [2], [3, [[4]]]]) => [1, 2, 3, 4];
答:
var arr =[1, [2], [3, [[4]]]]
var arr2 = flatten(arr)
console.log(arr2)
function flatten(arr){
var newArr = []
function _flat(arr){
arr.forEach(val=>{
if(Array.isArray(val)){
_flat(val)
}else{
newArr.push(val)
}
})
}
_flat(arr)
return newArr
}
复制代码