javascript语言中的毒瘤(下)

javascript语言中的毒瘤()

伪数组

Js中没有正真意义上的数组;这使得数组的使用非常容易,你不必给他们设置维度;而且永远不会产生越界错误;但它的性能相比正真的数组就糟糕了;

Typeof 运算符不能辨别数组和对象,要判断一个值是否为数组,你还需要检查它的construtor属性:(也可以使用instanceof)

function isArr(my_value)

{

       if(my_value&& typeof my_value === 'object' && my_value.constructor ===Array)

      {

             console.log(my_value+" is aarray");

      } else {

             console.log(my_value+" is not aarray");

      }

}

上面的instanceof, construtor检测对于不同帧或者窗口创建的数组会给出false;当数组有可能在其他的全局执行环境创建时,或者从一个框架向另一个框架传入一个数组,那么传入的数组和第二个框架中原生创建的数组就具有了不同的构造函数,因此就不准确了。

下面提供了两种,比较靠谱的数组检测方法:

 

function isRealArr(my_value)

{

       if(Object.prototype.toString.call(my_value)=== '[object Array]')

      {

             console.log(my_value+" is aarray");

      } else {

             console.log(my_value+" is not aarray");

      }

}

另外一种ECMAScript新增了Array.isArray(),这个方法的目的是最终确定某个值到底是不是数组,二不用考虑它在那个全局作用域中;支持Array.isArray()的浏览器有IE9+,FF4+,Chrome;


假值

JavaScript中有6个值为,这六个值是

false

null

undefined

0

'' (空字符串)

NaN

 

这里面false本身是布尔类型,其它5个则不是。

除了这6个外,其它均为,包括对象、数组、正则、函数等。注意 '0''null''false'{}[]也都是真值  

 

虽然这六个值都为,它们之间并非都相等

console.log( false == null )      //false

console.log( false == undefined) // false

console.log( false == 0)         // true

console.log( false == '' )        //true

console.log( false == NaN )       // false

 

console.log( null == undefined) // true

console.log( null == 0)         // false

console.log( null == '' )        //false

console.log( null == NaN )       // false

 

console.log( undefined ==0)   // false

console.log( undefined== '')  // false

console.log( undefined == NaN) //false

 

console.log( 0== '' )  // true

        console.log( 0 == NaN ) // false

对于“==”,以上得出下列结论

false 除了和自身比较为true外,和0'' 也为true

null只和undefined比较时为true反过来undefined也仅和null比较为true,没有第二个

0除了和false比较为true,还有一个空字符串 ''

空字符串''出了和false比较为true,还有一个数字0

 

当然,对于这一切,查看下规范是最踏实的,ES里的ToBoolean阐述了所有情形

wKioL1SxVOPD6hJHAAGFZqQnGfs250.jpg

对象

Js的对象永远不会是真的空对象;因为他们可以从原型链中取得成员属性;加入你正在编写一个程序计算一段文字中每个单词的出现次数;我们可以使用toLowerCase方法统一转换文本为小写格式;接着使用split方法传一个正则表达式为参数去产生一个单词数组;然后可以遍历该组单词并统计我们看到的单词的出现次数:如下:

functioncountTime() {

       var i;

       var word;

       var text =

              " This oracle of comfort hasso pleased me, " +

              "That when I am heaven Ishall desire " +

              "To see what this child does," +

              "and praise myConstructor.";

       var words =text.toLowerCase().split(/[\s,.]+/);

       var count = {};

       for (i = 0; i <words.length; i += 1) {

              word = words[i];

              if (count[word]) {

                     count[word] += 1;

              } else {

                     count[word] = 1;

              }

       }

       return count

}

从结果中,我们发现”this”2,但是constructor,却是一个令人意想不到的结果如图所示:

wKiom1SxVEPRNDcrAAD8gJfHNno995.jpg

当然,我们可以采取检测成员类型,来进行修正,具体如下所以:

functioncountTime2() {

       var i;

       var word;

       var text =

              "This oracle of comfort hasso pleased me, " +

              "That when I am heaven Ishall desire " +

              "To see what this child does," +

              "and praise myConstructor.";

       var words =text.toLowerCase().split(/[\s,.]+/);

       var count = {};

       for (i = 0; i <words.length; i += 1) {

              word = words[i];

              if (typeof count[word] ==='number') {

                     count[word] += 1;

              } else {

                     count[word] = 1;

              }

       }

       return count

}

wKioL1SxVSvyZdjmAADTo7IifVA241.jpg

好了,关于js的“毒瘤”就介绍到这里,后续会不断补充和完善的,希望大家多多支持。


你可能感兴趣的:(JavaScript,语言中的毒瘤)