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 !==
怎么就出错了呢?
首先我对你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的一些基本性的东西
代码比我规范,公私有变量都表明了,但是好像没什么用?
'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 ,
@殷敏峰:
参考完整例子代码
'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);
我的quacks是没有返回值的
@visonme:
嗯,好像quacks();也什么用,也没带来多少便利,它最大的用处是什么,判断吗?
@visonme: 分给你了。
@殷敏峰:
对的,我只是根据你函数书写了一个来说明而已,其本身是没有意义的,功能也就是根据传递的参数做类型判断然后分别处理而已
for(var m in arg) {
if(typeof arg[m] !== "function") continue;
if(typeof obj[m]) !== "function") return false;
}
}
把所有能用来突出显示的方法都用了.能看见吗?
sulimeText3,好像没凸出显示,自带的吗?
@殷敏峰: 不是的大哥.我只是想告诉你,你多了一个括号...