尝试回答js问题
看到@玉伯的这篇文章《Sea.js 源码解析(三)》给的几个问题,在综合下面的评论,写出自己的总结:
我们知道
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问题的更多相关文章
- Immutable.js尝试(node.js勿入)
最近做一些复杂html常常需要在页面做一些数据处理,常常在想如果 js有list 这种数据结构多少,今天逛github时 发现有Immutable.js 这个项目https://github.com/ ...
- 尝试解析js面试题(二)
说明:一共有13题(原本14题,最后一道什么鬼,嫌弃不要了),覆盖面比较广,都属于比较烧脑的类型,各种神坑:不过对于夯实js理论基础帮助非常大:看看都能做对几题吧(
- 尝试解析js面试题(一)【转发】
解析: 1.Foo.getName(); //2 1)结果执行的是Foo对象的一个叫做getName()的属性,而1.4.5中的getName都是作为函数存在,所以可以排除1.4.5 2)剩下两个中, ...
- 几种tab切换尝试 原生js
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 关于Node.js后端架构的一点后知后觉
前言 上周有幸和淘宝前端团队的七念老师做了一些NodeJS方面上的交流(实际情况其实是他电话面试了我╮(╯-╰)╭),我们主要聊到了我参与维护的一个线上NodeJS服务,关于它的现状和当下的不足.他向 ...
- 攻略前端面试官(一):JS的数据类型和内存机制浅析
原文地址:http://rainykane.cn/2019/09/29/与K_K君一起攻略前端面试官(一):JS的数据类型和内存机制浅析/ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看 ...
- 攻略前端面试官(三):JS的原型和原型链
本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...
- JS 实现"可读"字符串转换成"二进制的01"字符串
问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...
- (翻译)Angular.js为什么如此火呢?
在本文中让我们来逐步发掘angular为什么如此火: Angular.js 是一个MV*(Model-View-Whatever,不管是MVC或者MVVM,统归MDV(model Drive View ...
随机推荐
- STM32单片机在Keil5下仿真的问题解决及GPIO口初始化、使用
STM32单片机在Keil5下仿真的问题解决及GPIO口初始化.使用 最近看了视频,里面有仿真,可以清楚看到GPIO口的数据变化,也想尝试下,DUG时却出现*** error 65: access v ...
- CocoaPods安装和使用教程 分类: ios技术 ios相关 2015-03-11 21:53 48人阅读 评论(0) 收藏
目录 CocoaPods是什么? 如何下载和安装CocoaPods? 如何使用CocoaPods? 场景1:利用CocoaPods,在项目中导入AFNetworking类库 场景2:如何正确编译运行一 ...
- 3)Java学习笔记:内部类
什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...
- EF 实体字段设置主键和自增
[Key] //主键 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] //设置自增 public int id { get; set; } ...
- 安卓handler、thread实现异步任务
[转]http://blog.csdn.net/lanpy88/article/details/6659630 一Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. ...
- SQL Server 2005入门到精通(案例详解)
SQL Server 2005基础应用 一.数据库的基本操作 --创建数据库 create database new_db2 on primary ( name='new.mdf', filena ...
- jQuery插件开发详解
我们该如何扩展jQuery呢?主要可以通过下面2个来扩展:$.extend 和 $.fn $.extend如果把jQuery当成一个类,$.extend相当于为该类添加了静态方法extend. < ...
- 推荐系统中的Graph Model
转自:http://www.cnblogs.com/wentingtu/archive/2012/05/28/2521166.html 推荐中对graph model的研究主要有两个方面,一个是如何构 ...
- MVC使用HandleErrorAttribute自定义异常
MVC中,有一个Filter可以捕捉错误,但是它的用法是利用Attribute来实现的,而且只能加在Controller和Action上,所以不能捕捉别出的错误 其实理论上所有的错误肯定产生于Cont ...
- Drawerlayou与ScrollView的介绍
Drawerlayout侧滑 Drawerlayout是Support Library包中实现了侧滑菜单效果的控件. 滚动条(ScrollView) ScrollView和HorizontalScro ...