看到@玉伯的这篇文章《Sea.js 源码解析(三)》给的几个问题,在综合下面的评论,写出自己的总结:

  1. 我们知道 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问题的更多相关文章

  1. Immutable.js尝试(node.js勿入)

    最近做一些复杂html常常需要在页面做一些数据处理,常常在想如果 js有list 这种数据结构多少,今天逛github时 发现有Immutable.js 这个项目https://github.com/ ...

  2. 尝试解析js面试题(二)

    说明:一共有13题(原本14题,最后一道什么鬼,嫌弃不要了),覆盖面比较广,都属于比较烧脑的类型,各种神坑:不过对于夯实js理论基础帮助非常大:看看都能做对几题吧(

  3. 尝试解析js面试题(一)【转发】

    解析: 1.Foo.getName(); //2 1)结果执行的是Foo对象的一个叫做getName()的属性,而1.4.5中的getName都是作为函数存在,所以可以排除1.4.5 2)剩下两个中, ...

  4. 几种tab切换尝试 原生js

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 关于Node.js后端架构的一点后知后觉

    前言 上周有幸和淘宝前端团队的七念老师做了一些NodeJS方面上的交流(实际情况其实是他电话面试了我╮(╯-╰)╭),我们主要聊到了我参与维护的一个线上NodeJS服务,关于它的现状和当下的不足.他向 ...

  6. 攻略前端面试官(一):JS的数据类型和内存机制浅析

    原文地址:http://rainykane.cn/2019/09/29/与K_K君一起攻略前端面试官(一):JS的数据类型和内存机制浅析/ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看 ...

  7. 攻略前端面试官(三):JS的原型和原型链

    本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...

  8. JS 实现"可读"字符串转换成"二进制的01"字符串

    问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...

  9. (翻译)Angular.js为什么如此火呢?

    在本文中让我们来逐步发掘angular为什么如此火: Angular.js 是一个MV*(Model-View-Whatever,不管是MVC或者MVVM,统归MDV(model Drive View ...

随机推荐

  1. 图解 Monad

    原文地址: http://www.ruanyifeng.com/blog/2015/07/monad.html

  2. IOS开发中响应者链

    在IOS开发中,有时候会遇到如下情况:在页面1上有一个RedView,在RedView上有一个GreenView,在GreenView上有一个button,这些view的创建代码如下: 1.AppDe ...

  3. Badboy安装与使用

    Badboy是一个录制web脚本的工具 1.下载Badboy:http://www.badboy.com.au/download/add 2.启动Badboy,认识主界面 3.使用Badboy录制we ...

  4. 一个异步任务接收两个url下载两个图片

    有两个url,一个是下载用户头像的url,一个是下载用户上传图片的url,想要用一个异步任务同时下载这两个图片. 程序的下载任务是这么执行的,先接受url参数,然后调用 imgUrls = infoP ...

  5. StackExchange.Redis 官方文档(四) KeysScan

    KEYS, SCAN, FLUSHDB 方法在哪? 经常有人问这些问题: 好像并没有看到 Keys(...) 或者 Scan(...)方法?那我要怎么查询数据库里面存有哪些key? 或者 好像没有Fl ...

  6. [NOI2011]阿狸的打字机(好题!!!!)

    2785: [NOI2011]阿狸的打字机 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3[Submit][Status][We ...

  7. Spark调优与调试

    1.使用SparkConf配置Spark (1)在java中使用SparkConf创建一个应用: SparkConf conf =;i++){ javaBean bean =new javaBean( ...

  8. YII 1.0 (7) 登录信息调取 session使用

    登陆信息调取 Yii::app()->user->name,调取登陆的session信息 登录时 调用了 $LoginForm->login() 这个方法上面就能够取到登录的用户名 ...

  9. ES6 - 变量的解构赋值学习笔记

    变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...

  10. origin从图中获得数据

    有Origin的原图,即利用Origin的"copy page"功能直接拷贝到文字处理软件的数据图,对于这种图,双击用Origin打开后,双击要导出数据的权限,打开"pl ...