尝试回答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 ...
随机推荐
- 图解 Monad
原文地址: http://www.ruanyifeng.com/blog/2015/07/monad.html
- IOS开发中响应者链
在IOS开发中,有时候会遇到如下情况:在页面1上有一个RedView,在RedView上有一个GreenView,在GreenView上有一个button,这些view的创建代码如下: 1.AppDe ...
- Badboy安装与使用
Badboy是一个录制web脚本的工具 1.下载Badboy:http://www.badboy.com.au/download/add 2.启动Badboy,认识主界面 3.使用Badboy录制we ...
- 一个异步任务接收两个url下载两个图片
有两个url,一个是下载用户头像的url,一个是下载用户上传图片的url,想要用一个异步任务同时下载这两个图片. 程序的下载任务是这么执行的,先接受url参数,然后调用 imgUrls = infoP ...
- StackExchange.Redis 官方文档(四) KeysScan
KEYS, SCAN, FLUSHDB 方法在哪? 经常有人问这些问题: 好像并没有看到 Keys(...) 或者 Scan(...)方法?那我要怎么查询数据库里面存有哪些key? 或者 好像没有Fl ...
- [NOI2011]阿狸的打字机(好题!!!!)
2785: [NOI2011]阿狸的打字机 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 7 Solved: 3[Submit][Status][We ...
- Spark调优与调试
1.使用SparkConf配置Spark (1)在java中使用SparkConf创建一个应用: SparkConf conf =;i++){ javaBean bean =new javaBean( ...
- YII 1.0 (7) 登录信息调取 session使用
登陆信息调取 Yii::app()->user->name,调取登陆的session信息 登录时 调用了 $LoginForm->login() 这个方法上面就能够取到登录的用户名 ...
- ES6 - 变量的解构赋值学习笔记
变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...
- origin从图中获得数据
有Origin的原图,即利用Origin的"copy page"功能直接拷贝到文字处理软件的数据图,对于这种图,双击用Origin打开后,双击要导出数据的权限,打开"pl ...