周道长浅谈鸭式辩型

Javascript中的鸭式辩型(duck-type):会游泳,会嘎嘎叫,有两条腿的就是鸭子,比如你。

废话少说,直接上一段代码

var iframe=document.createElement("iframe");

document.body.appendChild(iframe);

var xArray=window.frames[window.frames.length-1].Array;

var arr=new xArray(1,2,3);

alert(arr instanceof Array);  //false

alert(arr.constructor===Array);   //false

what gui? arr 明明是一个数组,为什么两种方式检测都弹出false?

谷歌一下,哦,原来跨frame实例化的对象不共享原型链.

那么咱用鸭式辩型的思想来造一个方法isShuzu来看看他是不是数组。

废话少说,上代码(代码说:我好无辜啊啊啊)。

function isShuzu(object){

return object!=null&&typeof object=="object"&&

‘splice‘ in object&&‘join‘ in object;

}

alert(isShuzu(arr));   //true

因为arr有数组特有的方法splice和join,又也是一个object,

那么他就是一个数组,弹出了true。不明觉厉啊!!

但是,下面我们来造一个名字叫 “鸡" 的对象。

var ji={ name:"鸡" , splice:"我也有splice" , join:"我也有join" ,speak:"我是不是数组呢?"};

alert(isShuzu(ji));   //true

因为 ji 有数组特有的方法splice和join,又也是一个object,

那么他就是一个数组,弹出了true。额,鸭式辩型傻傻分不清真假数组了。

下面,周道长使出绝招,上代码

alert( Object.prototype.toString.call(ji) === ‘[object Array]‘ );   //false

哈哈哈,周道长一眼就看出 ji 不是数组。

总结一下,在Javascript中判断对象是不是数组推荐Array.isArray()方法,

这个方法内部实现和周道长刚出的绝招应该是一样的.

时间: 2024-12-09 20:12:56

周道长浅谈鸭式辩型的相关文章

JavaScript之周道长浅谈变量使用中的坑

天空一声巨响,道长闪亮登场,飞花落叶,尘土飞扬,此处不应恐慌,用阅读变量的概念来提升气场. 1)变量的声明,使用一个变量之前应该先声明.变量是使用关键字var来声明的,如下: var number;     //申明了一个变量 2)变量的赋值,如下: number=520;   //给变量赋值(javascript中的变量是可以赋任意类型的值的,比如字符串,对象,函数等等) 3)上面两个步骤可以合到一起,如下: var number=520;  //等价于前两步 **有人会说 number=52

201507010852_《Javascript权威指南(第六版)——判断值类型的type函数 、鸭式辩型》(P210-217)

一. 类的扩充 1. 只要扩充原型类,就能动态更新到实例.例如:xxx.prototype.do = function() {//...}; 2. 不建议采用污染JavaScript的方法,如:Object.prototype.methods = function() {//...};   采用<权威指南>9.8.1中的方法添加属性,如:Object.defineProperty(//...); 3. 二. 类和类型 1. isPrototypeOf(); 2. 三. constructor属

javascript鸭式辩型法实现接口

[html] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" c

js类型判断及鸭式辨型

目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof console.log([1,2,3] instanceof Array); true console.log([1,2,3] instanceof Object); true 尽管构造函数是原型的唯一标识,instanceof运算符的右操作数是构造函数,instanceof实际计算过程中检测的是对

[转帖]浅谈响应式编程(Reactive Programming)

浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22:16字数 1877阅读 9816 这是告别CSDN后第一次使用简书写IT类的博客,还在适应.最不适应的就是不能直接手输markdown语法标记.(好像原因是我没有切换编辑器) 什么是响应式编程(Reactive Programming) In computing, reactive program

算法-自实现鸭式辨型实现接口

#鸭式辨型实现接口  <script type="text/javascript" charset="UTF-8">   //鸭式辨型实现接口(最完美的javascript实现接口方式)   //核心:一个实现接口的主要目的,检测方法,并实现接口里的方法   //优点:完全面向对象,代码实现统一,解耦      //一.接口类 Class Interface 作用:实例化N个接口   //接口类需要2个参数   //参数1:接口的名字(string)  

js 鸭式辨型法

无意中看到arr.length === +arr.length;这句代码,然后就去了解了下 这是一种鸭式辨型的判断方法. 鸭式辨型:像鸭子一样走路.游泳和嘎嘎叫的鸟就是鸭子 这句话表示: a.arr有length这个属性 b.arr.length是一个Number 那么arr可以是array,也可以是string Jquery中要判断一个变量是否是一个数组的确切方法:Object.prototype.toString.call(arr) === '[object Array]'; ES6可以通过

浅谈响应式布局

响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网浏览而诞生的. 最近几年来,越来越多的智能移动设备( mobile, tablet device )加入到互联网中来,移动互联网不再是独立的小网络了,而是成为了 Internet 的重要组成部分.响应式网络设计 ( RWD / AWD)的出现,目的是为移动设备提供更好的体验,并且整合从桌面到手机的各种屏幕尺寸和分辨率,用技

浅谈响应式网页设计

技术的革新带动了设计行业的的迅猛发展,这使得设计师和开发者有了更广阔的的探索天地.而网页设计也越发不再那么循规蹈矩,许多团队和公司都做了很多思考和创意.所以在我们适应着现代设计潮流的同时,不妨也来看看现阶段网页设计大致的趋势和风格吧.我不敢大言不惭的说这就是当下网页设计的趋势,这只是本人对当下网页设计做出的一些小总结.希望这样的归类总结能给你带来更多的思路和想法. 响应式网页设计 现在越来越多用户都拥有多种终端:台式机,笔记本,平板电脑,手机,能够适应不同尺寸显示屏的网页是现在的潮流,甚至是未来