`
zhangyaochun
  • 浏览: 2619236 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

typeof func ==='function'的疑惑

阅读更多

 

呵呵 有的人看到这个题目可能觉得,咦,这不就是判断对象是否是function吗?

 

我记得以前吧有一个同学义正言辞地说我研究过YUI,不相信我给你贴代码。 

 

 

var L = Y.Lang || (Y.Lang = {});

var TYPES = {
    'undefined'        : 'undefined',
    'number'           : 'number',
    'boolean'          : 'boolean',
    'string'           : 'string',
    '[object Function]': 'function',
    '[object RegExp]'  : 'regexp',
    '[object Array]'   : 'array',
    '[object Date]'    : 'date',
    '[object Error]'   : 'error'
},
TOSTRING     = Object.prototype.toString;

/**
 * <p>
 * Determines whether or not the provided item is a function.
 * Note: Internet Explorer thinks certain functions are objects:
 * </p>
 *
 * <pre>
 * var obj = document.createElement("object");
 * Y.Lang.isFunction(obj.getAttribute) // reports false in IE
 * &nbsp;
 * var input = document.createElement("input"); // append to body
 * Y.Lang.isFunction(input.focus) // reports false in IE
 * </pre>
 *
 * <p>
 * You will have to implement additional tests if these functions
 * matter to you.
 * </p>
 *
 * @method isFunction
 * @static
 * @param o The object to test.
 * @return {boolean} true if o is a function.
 */
L.isFunction = function(o) {
    return L.type(o) === 'function';
};

L.type = function(o) {
    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
};

 

 

呵呵 结果自己就傻了,请仔细看看,人家不是typeof 是自己封装的api------L.type

 

 

只所以想说一个这样的话题是因为,很多的流行的插件包括一些老一点的脚本库在isFunction的判断上多有这样的写法

 

 

/*
判断参数是否是function
*/
isFunction: function(source){
    return typeof(source) === "function";
}

 

我们先做个测试吧。

 

 

var obj = document.createElement("object");
console.log(typeof(obj.getAttribute) === "function");
console.log((typeof(obj.getAttribute)) ==== "function");

 

请再IE浏览器下测试

 

你会发现false了? 呵呵

 

我们再回过头看看上面YUI的代码,看什么-----------------------注释

 

 

 <p>
 * Determines whether or not the provided item is a function.
 * Note: Internet Explorer thinks certain functions are objects:
 * </p>
 

翻译一下吧:IE会认为某些functions是object (言辞很严谨啊)

 

ps题外话-------最近看到有一个大三学生实习面试的时候说自己有3年工作经验(注意说的是工作经验,还义正言辞),一天打2W行代码。(好吧本人表示膜拜,佩服,建议没毕业的和毕业的多向这个同学学习

 

。。。。。。。。。。。。。。。。。。。

 

 

简单地总结一下:

 

我们无论在设计api还是一般的代码编写的时候,最好注意一下这些细节的问题,有的时候报错了,需要一段一段地去注释去排除,结果发现原来自己的工具类api错误了。

 

只是一些细节和代码严谨度的思考。供参考

 

下面链接是我贴出的自己整理的lang的lib的一个isFunction的写法(和JQuery还有tangram是一致的)

http://zhangyaochun.iteye.com/blog/1205543

 

当然说明一下,这个api在IE下浏览器下判断isFunction的时候也有缺陷的

看看Jquery的源码注释

They return false on IE (#2968).

 

 

 

//测试代码
var obj = document.createElement("object");
Object.prototype.toString.call(obj.getAttribute);
1
0
分享到:
评论
1 楼 sscsacdsadcsd 2015-07-04  
我的天 那到底是为什么function是object
我看underscore也这样
  _.isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

相关推荐

    JS typeof fn === function && fn()详解

    `typeof fn === 'function' && fn()` 这种模式就是一种常见的方式来确保安全地调用函数。这个模式的核心在于利用了JavaScript中的逻辑与(`&&`)操作符的短路特性。 首先,`typeof fn` 返回一个字符串,表示变量 `...

    javascript 获取函数形参个数

    /** * 获取函数的形参个数 ... if (typeof func == 'function') { var mathes = /[^(]+\(([^)]*)?\)/gm.exec&#40;Function.prototype.toString.call(func&#41;); if (mathes[1]) { var args = mathes[1].rep

    js中function()使用方法.docx

    var func3 = function func4(...args) { // 函数体 }; ``` 3. **Function构造函数**:允许动态创建函数,但不推荐使用。 ```javascript var func5 = new Function(); ``` #### 三、函数调用的不同模式 ###...

    你有必要知道的 25 个 JavaScript 面试题

    func: function() { var self = this; console.log("outer func: this.foo=" + this.foo); // 输出 "outer func: this.foo=bar" console.log("outer func: self.foo=" + self.foo); // 输出 "outer func: self....

    js校验常用方法

    - `typeof func === 'function'`检查一个值是否为函数。 9. 空对象、空数组和空字符串验证: - `Object.keys(obj).length === 0`检查对象是否有属性。 - `arr.length === 0`检查数组是否为空。 - `str.trim() =...

    详解Javascript ES6中的箭头函数(Arrow Functions)_.docx

    console.log(func instanceof Function); // true ``` #### 2.3 `this`的固定 箭头函数的`this`值继承自外层作用域,不会像普通函数那样根据调用方式改变: ```javascript var obj = { data: ['John Backus', '...

    javascript中关于类型判断的一些疑惑小结

    - 判断函数:`typeof func === "function"`可以用来检查一个变量是否为函数。 - 判断undefined:直接使用`typeof var === "undefined"`,这可以避免未声明变量导致的错误。 总之,JavaScript中的类型判断需要根据...

    javascript函数

    var func = new Function('a', 'b', 'console.log(a + b);'); func(1, 2); // 3 ``` 总结来说,JavaScript中的函数不仅是一种执行任务的手段,还是一种高级的数据类型,支持诸如闭包、高阶函数等复杂的编程模式...

    JS函数总结

    var func = new Function('a', 'b', 'console.log(a + b);'); func(1, 2); // 输出3 ``` 在特殊的`Function`构造器创建的函数中,`arguments`对象并不像普通函数那样直接反映函数调用时传入的参数。在这种模式下,...

    js函数实用型 强力版

    var func3 = function func4() {}; ``` 3. **`Function`构造函数**: ```javascript var func5 = new Function(); ``` #### 三、`Function`构造函数详解 `Function`构造函数允许开发者通过字符串来创建一个...

    seajs加载jquery时提示$ is not a function该怎么解决

    if (typeof define === "function" && (define.amd)) { define( "jquery", [], function() { return jQuery; }); } ``` 这段代码检查`define`函数是否存在并且其`amd`属性是否为真,如果满足条件,就会定义一个...

    js代码-typeof && instanceof

    let func = function() {}; console.log(typeof func); // 输出 "function",但实际上func是一个函数对象 let nullValue = null; console.log(typeof nullValue); // 输出 "object",但null不是一个对象 ``` 接...

    js中function()使用方法

    3. 命名函数表达式:`var func3 = function func4(…){…}`(这里的`func4`仅在函数体内部可用) 4. `Function`构造函数:`var func5 = new Function();` 接下来,我们将讨论函数的三种调用模式: 1. **方法调用...

    handyman:带有 Promise 的 Web Workers

    杂工是的叉子安装npm install handymanbower install handyman用法承诺: var square = handyman ( function ( number ) { var deferred = this . defer ( ) ; if ( typeof number === 'number' || number ...

    javascript function、指针及内置对象

    在继续讲述之前,先看一下函数的使用语法: 以下是引用片段: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 这些都是声明函数的正确语法。...

    simplewebrtc.js webrtc网页视频开发帮助工具

    (function () { var logger = { log: function (){}, warn: function (){}, error: function (){} }; // normalize environment var RTCPeerConnection = null, getUserMedia = null, attachMediaStream = ...

    Firefox和IE浏览器兼容JS脚本写法小结

    1.window.event兼容脚本 function getEvent(){ //获取浏览器事件,同时兼容ie和ff的写法 if(document.all) return window.event; func=getEvent.caller; while(func!=null){ var arg0=func.arguments[0];...

    babel-plugin-transform-walrus-operator:从js中的赋值表达式返回值

    babel-plugin-transform-海象运算符将海象运算符:=编译为IIFE关于作业说明将42分配给x... 通常变成if ( ( function ( x ) { if ( typeof x === 'undefined' ) throw new Error ( ) ; x = 2 ; return x ;} ) ( x ) ) ale

    浅析JS中NEW的实现原理及重写

    == null && typeof result === "object") || typeof result === "function") { return result; } return obj; } ``` 在上面的自定义`_new`函数中,我们首先创建了一个新对象`obj`,其原型指向了构造函数`Func`的...

Global site tag (gtag.js) - Google Analytics