首页 新闻 会员 周边

Javascript代码的小小疑问(35)

0
[已解决问题] 解决于 2015-07-01 17:20

function quacks(obj) {
  for(var i = 1; i < arguments.length; i++) {
    var arg = arguments[i];
  switch(typeof arg) {
     case 'string':
      if(typeof obj[arg] !== "function") return false;
      continue;
     case 'function':
      arg = arg.prototype;
     case 'object':
  for(var m in arg) {
    if(typeof arg[m] !== "function") continue;
    if(typeof obj[m]) !== "function") return false;
    }
  }
}
  return true;
};

var arr = [1,3,6,8];

alert(quacks(arr));  // Unexpected token !==

 

怎么就出错了呢?

Coca-code的主页 Coca-code | 初学一级 | 园豆:10
提问于:2015-07-01 15:33
< >
分享
最佳答案
1

首先我对你switch-case中的处理完全没看懂,不知道你到底这样写是要达到什么样的目的.

针对你的代码,我按你例子分析下,

quacks(arr) => 创建去的是数组,那么在quacks中arguments.length = 1 , 而在执行quacks的for语句时候也只会被执行一次,而在执行switch -case时候也只会执行到 case "object"这个句子。

那么说下在case  “object” 下的执行语句吧 

// 首先我们知道arg是个数组也就是arr
// 你对数组使用for-- in 语句,是无法遍历到数组的
// 值的,你得到的只是类似0,1,2,、、、这样索引而已 ,也就是
//下面的for语句中m的值并不会是数组arr中1,3,6的值而是类似
// key这样的0,1,2,3, 所以下面中if语句的判断其实就没有任何的意义了 
for(var m in arg) {
     //=> 这里的m只会是0,1,2,、、、这样的数值
    if(typeof arg[m] !== "function") continue;
    if(typeof obj[m]) !== "function") return false;
    }
}

 

下面是我改造的:

'use strict'

function quacks(obj)
{
    for( var i  = 0/*这是从0,第一个参数开始*/ , len = arguments.length ; i < len ; i++ )
    {
        var _arg = arguments[i]; 
        
        //针对arg类型做不同处理
        var _arg_type = (typeof _arg).toLowerCase();
        switch( _arg_type  )
        {
            case 'string': //如果是字符串,做什么处理?
                cosnole.log(_arg); //直接输出
                break;
            case 'function'://如果是函数,那么直接执行
                _arg();//假设没有任何参数情况下
                break;
            case 'object'://如果是对象那么就要做比较复杂的分析处理的,因为js中所有的东西都
                          //可以认为是对象比如array,function等
                 
                  //这里你需要对对象做判断如果是数组怎么处理
                  //如果是key-value的对象怎么处理
                  
        }
    }
}

 

 ps: 建议先看看js的一些基本性的东西

奖励园豆:5
visonme | 小虾三级 |园豆:1674 | 2015-07-01 15:59

代码比我规范,公私有变量都表明了,但是好像没什么用?

'use strict'

function quacks(obj)
{
for( var i = 1/*这是从0,第一个参数开始*/ , len = arguments.length ; i < len ; i++ )
{
var _arg = arguments[i];

//针对arg类型做不同处理
var _arg_type = (typeof _arg).toLowerCase();
switch( _arg_type )
{
case 'string': //如果是字符串,做什么处理?
cosnole.log(_arg); //直接输出
break;
case 'function'://如果是函数,那么直接执行
_arg();//假设没有任何参数情况下
break;
case 'object'://如果是对象那么就要做比较复杂的分析处理的,因为js中所有的东西都
//可以认为是对象比如array,function等

//这里你需要对对象做判断如果是数组怎么处理
//如果是key-value的对象怎么处理
console.log('ok');
     }
  }
};

var a ={"a","apple"};

alert(quacks(a));  //Unexpected token ,

 

Coca-code | 园豆:10 (初学一级) | 2015-07-01 16:26

@殷敏峰: 

参考完整例子代码

'use strict'

function quacks(obj)
{
    for( var i  = 0/*这是从0,第一个参数开始*/ , len = arguments.length ; i < len ; i++ )
    {
        var _arg = arguments[i]; 
        
        //针对arg类型做不同处理
        var _arg_type = (typeof _arg).toLowerCase();
        switch( _arg_type  )
        {
            case 'string': //如果是字符串,做什么处理?
                console.log(_arg); //直接输出
                break;
            case 'function'://如果是函数,那么直接执行
                _arg();//假设没有任何参数情况下
                break;
            case 'object'://如果是对象那么就要做比较复杂的分析处理的,因为js中所有的东西都
                          //可以认为是对象比如array,function等
                 console.log("argument is object");
                 break;
        }
    }
}

var obj = {name:'visonme',address:'fuzhou'};

//call quacks ,假设我们传递三个参数进去,刚好是string , function和object
quacks( 'visonme from fuzhou' , function(){console.log('I am function');} , obj);
visonme | 园豆:1674 (小虾三级) | 2015-07-01 16:40

我的quacks是没有返回值的 

visonme | 园豆:1674 (小虾三级) | 2015-07-01 16:41

@visonme: 

嗯,好像quacks();也什么用,也没带来多少便利,它最大的用处是什么,判断吗?

Coca-code | 园豆:10 (初学一级) | 2015-07-01 16:49

@visonme: 分给你了。

Coca-code | 园豆:10 (初学一级) | 2015-07-01 17:20

@殷敏峰: 

对的,我只是根据你函数书写了一个来说明而已,其本身是没有意义的,功能也就是根据传递的参数做类型判断然后分别处理而已 

visonme | 园豆:1674 (小虾三级) | 2015-07-01 17:22
其他回答(1)
0

for(var m in arg) {
    if(typeof arg[m] !== "function") continue;
    if(typeof obj[m]) !== "function") return false;
    }
  }

把所有能用来突出显示的方法都用了.能看见吗?

吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-01 15:44

sulimeText3,好像没凸出显示,自带的吗?

支持(0) 反对(0) Coca-code | 园豆:10 (初学一级) | 2015-07-01 15:52

@殷敏峰: 不是的大哥.我只是想告诉你,你多了一个括号...

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-01 16:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册