引言

  JavaScript这门语言有些场合的用法还是比较怪异的。这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起。就当是平时开发时需要注意的地方吧。

特殊用法收集

  1、!!用法

  在JavaScript中经常看到判断一个对象是否有某一个属性或者在进行客户端检测的时候会出现!!这个用法。相信大家都看到过var isIE=!!document.all这样的代码把。那为什么需要使用!!呢?

  !!作用就在于:如果明确设置了对象中属性的值(非 null/undefined/0/""等值),那么使用!!就可以将该对象中的属性转化为Boolean类型,并且返回true。如果是null/undefined/0/""等值那么使用!!就是返回false。所以!!的使用是将属性或者方法强制转化成Boolean类型。

  2、JavaScript中==和===的差异

  A、对于string,number等基础类型,==和===是有区别的。

  不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等。

  B、对于Array,Object等高级类型,==和===是没有区别的

  进行“指针地址”比较

  C、基础类型与高级类型,==和===是有区别的

  对于==,将高级转化为基础类型,进行“值”比较(高级类型典型的如调用toString()后在进行比较)

  因为类型不同,===结果为false

  3、typeof 操作符和instanceof 操作符

  确定一个值是哪一种基本类型可以使用typeof 操作符。确定一个值是哪一种引用类型可以使用instanceof操作符。这些操作符在后续的浏览器特性检测方面很有用。

  我在看Mustache.js源代码的时候发现判断一个对象是否是Array有如下的方式。

 var objectToString = Object.prototype.toString;
var isArray = Array.isArray || function isArrayPolyfill(object) {
return objectToString.call(object) === '[object Array]';
};

  我们知道在判断引用类型的时候我们可以使用instanceof操作符,但是在一些特殊情况下,可能会出现问题。例如:

  注意点!

  使用instaceof和construcor,被判断的array必须是在当前页面声明的!比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;会返回false;
  原因:
  1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。
  2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!

  而通过使用toString.call()方法,我们可以避免一些问题。我们来看ECMA 对Object.prototype.toString的解释。

When the toString method is called, the following steps are taken:
1.If the this value is undefined, return "[object Undefined]".
2.If the this value is null, return "[object Null]".
3.Let O be the result of calling ToObject passing the this value as the argument.
4.Let class be the value of the [[Class]] internal property of O.
5.Return the String value that is the result of concatenating the three Strings "[object ", class, and "]".

  地址:http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.2

  下面我们举例来看这方面的内容。请看下面的例子:

 var oP = Object.prototype,
toString = oP.toString; console.log(toString.call([123]));//[object Array]
console.log(toString.call('123'));//[object String]
console.log(toString.call({a: '123'}));//[object Object]
console.log(toString.call(/123/));//[object RegExp]
console.log(toString.call(123));//[object Number]
console.log(toString.call(undefined));//[object Undefined]
console.log(toString.call(null));//[object Null]
//....

JavaScript中一些怪异用法的理解的更多相关文章

  1. JavaScript中this的用法 及 如何改变this的指向

    要懂得JavaScript中this的用法,首先需要知道,JavaScript中的作用域相关知识. var fun = function(){ var flag = 1; console.log(fl ...

  2. JavaScript中return的用法详解

    JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...

  3. javascript中 try catch用法

    javascript中 try catch用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-08-16我要评论 JS try catch语句一般在什么情况下使用?是必须使 ...

  4. 从函数调用的角度,探讨JavaScript中this的用法

    js函数调用方式大概可分为:函数调用,构造器调用,call或apply,方法调用四种方式.下面结合一些基础概念和实测代码,从函数调用的角度,探讨JavaScript中this的用法. 1. new对函 ...

  5. JavaScript中this的用法详解

    JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...

  6. JavaScript中call、apply个人理解

    JavaScript中call.apply个人理解 一句话即通俗的说:call.apply 是为了改变this的状态而存在的 }; } function personInfo(name,age){ t ...

  7. 在HTML页面中实时获取新消息的方法 “JavaScript中的setInterval用法”

    JavaScript中的setInterval用法(资料来源:博主---八神吻你   ) setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数 ...

  8. JavaScript 中 this 的用法

    在 JavaScript 中,this 是动态绑定,或称为运行期绑定的.一般而言,在Javascript中,this 指向函数执行时的当前对象. 由于其运行期绑定的特性,JavaScript 中的 t ...

  9. javascript中string的用法总结

    javascript中很经常的会用到string类型的变量,对此,总结了几种常用操作或者方法:创建.拼接.子串.大小写转换.判断字符串相等.字符串查找等几种.下面将一一简单描述. 一.js中strin ...

随机推荐

  1. JS 弹窗到右下角

    <div id="msg_win" style="display: block; top: 490px; visibility: visible; opacity: ...

  2. 自定义不等高cell—storyBoard或xib自定义不等高cell

    1.iOS8之后利用storyBoard或者xib自定义不等高cell: 对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持) 添加子控件和contentView(cell的content ...

  3. C++之再续前缘(二)——类和对象(上)

    1.类的构成:数据和函数 public:可以由在类外由类的对象访问 private:只能由类内的成员函数访问 protected:可以由本类的成员函数访问,也可以由本类的派生类的成员函数访问 访问权限 ...

  4. 【caffe】基本数据结构blob

    @tags: caffe blob blob是caffe中的基本数据结构,简单理解就是一个"4维数组".但是,这个4维数组有什么意义? BTW,TensorFlow这款google ...

  5. 【bzoj1034】 ZJOI2008—泡泡堂BNB

    http://www.lydsy.com/JudgeOnline/problem.php?id=1034 (题目链接) 题意 田忌赛马.. Solution 贪心. 1.若A队最弱的比B队最弱的强,先 ...

  6. 51nod平均数

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  7. bzoj3295: [Cqoi2011]动态逆序对(cdq分治)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...

  9. MySQL备份原则

      数据库备份遵守的原则: 定期对数据库进行备份 启用mysql服务器的二进制日志 备份文件命名既要有规律又要有意义 备份文件和数据库不要放在一个文件系统上 定期使用文件系统的备份功能来备份数据库的备 ...

  10. Markdown中的缩进

    Markdown中怎么实现段首的缩进 把输入法的半角改为全角,在Markdown文中直接空格就能实现缩进,测试时一个空格是一个汉字的距离. html中的代码:  或  -- 半个汉字的距离.  或  ...