JavaScript习题

题目

以下代码输出什么?

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
}
复制代码
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值