尝试回答js问题
2013-10-18 17:08
225 查看
看到@玉伯的这篇文章《Sea.js 源码解析(三)》给的几个问题,在综合下面的评论,写出自己的总结:
我们知道
typeof String("xxx")返回的是string。直接调用构造函数Srtring返回的是字面量,和定义一个字面量一样,var str = "xxx";
当使用new String时候,则创造的是一个对象。像这样:
2. 为什么我用的是
这个不知如何解释!
3. 下面这种写法,有什么不妥?
这则代码是:传入的obj的构造函数是否是String。这个判断是不够严谨的,首先,并没判断是否为空。其次,因为obj的constructor是可以变化的,例如:
创建一个new String的实例,能够修改prototype上面的constructor属性。 但创建字面量形式就不会:
创建字面量时,会创建一个临时的对象转换,创建立马就被销毁,所以在字面量上面不能定义属性,也就改变不了对象的constructor指向。
总之,判断的不够严谨。
前者要好点,直接调用Object.prototype上面的方法,要比({})去创建一个对象然后去原型链上找方法要快很多。
4. 鸭子判断究竟好不好?那些异常情况,真的需要关注吗?
If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
如果它看起来像鸭子,会像鸭子一样游泳,也会嘎嘎叫,那么它很可能就是一只鸭子。
像这样去判断一个Array:
那么在这样去判断:
明显不正确。鸭子不是完美的解决方案,却在固定的模式下可以使用。
以上回答了几个问题,感觉学到好多东西,虽然有点答非所问,但也经过一番验证得到。希望拍砖!
我们知道
typeof new String("xxx")返回 "object",请问
typeof String("xxx")返回什么?为什么?
typeof String("xxx")返回的是string。直接调用构造函数Srtring返回的是字面量,和定义一个字面量一样,var str = "xxx";
当使用new String时候,则创造的是一个对象。像这样:
function A(){}; var a1 = new A(); typeof a1; //返回的是一个"object";
2. 为什么我用的是
typeof obj == "string"而不是
typeof obj === "string"?
这个不知如何解释!
3. 下面这种写法,有什么不妥?
function isString(obj) { return obj.constructor === String };
这则代码是:传入的obj的构造函数是否是String。这个判断是不够严谨的,首先,并没判断是否为空。其次,因为obj的constructor是可以变化的,例如:
function A(){}; var str = new String("XXX"); // str.constructor = A; console.log(isString(str));
创建一个new String的实例,能够修改prototype上面的constructor属性。 但创建字面量形式就不会:
function A(){}; var str = "XXXX"; str.constructor = A; console.log(isString(str));
创建字面量时,会创建一个临时的对象转换,创建立马就被销毁,所以在字面量上面不能定义属性,也就改变不了对象的constructor指向。
总之,判断的不够严谨。
3. Object.prototype.toString.call(obj)和
({}).toString.call(obj)的区别是什么?哪个好?
前者要好点,直接调用Object.prototype上面的方法,要比({})去创建一个对象然后去原型链上找方法要快很多。
4. 鸭子判断究竟好不好?那些异常情况,真的需要关注吗?
If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
如果它看起来像鸭子,会像鸭子一样游泳,也会嘎嘎叫,那么它很可能就是一只鸭子。
像这样去判断一个Array:
function isArray(object) { return object != null && typeof object === "object" && 'splice' in object && 'join' in object }; console.log(isArray([])); // true
那么在这样去判断:
var json = { splice:function(){}, join:function(){} } console.log(isArray(json)); //true
明显不正确。鸭子不是完美的解决方案,却在固定的模式下可以使用。
以上回答了几个问题,感觉学到好多东西,虽然有点答非所问,但也经过一番验证得到。希望拍砖!
相关文章推荐
- 在百度上回答的一个问题,修改之后 JS倒计时
- 多层动态加载js文件出现的问题终极解决【深海原创】
- 剖析js对浮点数运算精度问题
- 解决js图片加载时出现404的问题
- 记一次JS执行顺序引起的问题排查过程
- 平凡的人生or开挂的人生——对知乎相关问题的回答
- 面试技巧:16个经典面试问题回答思路(转)
- js 浏览器兼容性问题
- html中js交互问题总结
- 关于动态引入js时的顺序问题
- function运行令人吐血的IE JS兼容性问题。。。
- js跨域问题
- 面试技巧:16个经典面试问题回答思路(转)
- select2 asp.net mvc jquery.validate.js jquery.validate.unobtrusive.js不能完美结合问题
- Js 时间函数getYear()的使用问题探讨
- 使用JS+WebBrowser解决Web打印问题(完成事件)
- .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)
- js封装 与 js高级用法 问题集合
- 通过ajax给js成员变量赋值问题
- Node.js 安装遇到的问题及解决路径(二)