1. NaN表示一个不能产生正常结果的运算结果。它不等于任何值,包括它自己。可以用isNaN(number)来检测。
    2. 同Java中的字符串一样,JS中的字符串是不可变的。也就是说一旦字符串被创建,就无法改变。下标表达式(如s[3],代替s.charAt(3))可以读取字符,但是不能用于改变字符。
    3. null,undefined,空字符串'',0,NaN被当做false,其余的值(包括"false")或对象都被当做true。所谓的“被当做”并不是说这些值就是布尔值true,例如true=="false"并不成立,而是在条件判断语句如if("false")alert('"false" judge as true');中被当做是true。之所以出现这样的情况,是因为非空的字符串或者非null的对象相当于!undefined或!null,其值被当做true也就是很自然的了。我们可以用两个取非的符号“!”将一个值强制转换为布尔类型,对其真假进行直观的查看,例如alert(!!"false");输出true。
    4. 不同于C/C++、Java等语言,JavaScript的switch语句不光可以使用数字、字符做条件表达式,还可以使用字符串!其实JavaScript中没有字符这个基本类型,单个的字符也是一个字符串。更强大的是,case语句的表达式可以是变量!下面是示例:
      1. function t(p,v){
      2. switch (p){
      3. case 'c':
      4. alert('char');break;
      5. case 'string':
      6. alert('string');break;
      7. case v:alert('variable:' + p);break;
      8. default:alert(p);
      9. }
      10. }
      11. t('c');//'char'
      12. t('string');//'string'
      13. t(123);//'123'
      14. t(123,123);//'variable:123'
    5. 程序随时可以throw出一个异常,throw出来的可以是任意表达式、对象或常量;当然,良好的异常处理系统是需要精心设计一下的。
    6. switch、while、do、for语句允许有一个前置的标签,配合break或continue语句使用来完成一些跳转。
    7. JavaScript对象是可变的键控集合(keyed collections),是属性的容器,属性名甚至可以是空字符串"",属性值可以是除undefined之外的任意值。简单类型(number,string,boolean,null,undefined)貌似是对象,因为它们有方法;但它们是不可变的。
    8. delete用来删除对象的属性,不会触及原型链中的对象;删除失败的时候,该操作返回false。全局的函数和变量定义也是全局对象的属性,因而可以用delete操作删除,而函数内部的变量声明和函数定义则无法删除,例如下列函数执行的结果是弹出“false”。
      1. function f(){
      2. var a = 3;
      3. alert(delete a);
      4. }
    9. string的fromCharCode方法从一串代表ASCII码的数字中,返回一个字符串,在某些情况下,这个方法可能会很有用。
      var a = String.fromCharCode(67,97,116);
      // a是'Cat'

    10. string的replace() 方法的第一个参数是字符串或者正则表达式。第二个参数如果是字符串,可以指定正则表达式的匹配分组等信息,如$3代表第三个捕获分组。第二个参数可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。
      该函数的参数与正则表达式exec方法返回的数组类似:第一个参数是匹配模式的字符串,接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数,再后面的参数是一个整数,声明了匹配在原字符串中出现的位置,最后一个参数是整个字符串。示例是最有力的说明手段:

      1. var s = 'fon230nva09dnfadsf';
      2. var r = /(\d{2})([a-zA-z])/g;
      3. var t = s.replace(r,function(){
      4. /*……*/
      5. });
      相应的第一次替换中,arguments的内容为:
      Arguments[5]
      1. 0: "30n"
      2. 1: "30"
      3. 2: "n"
      4. 3: 4
      5. 4: "fon230nva09dnfadsf"

      exec方法的返回结果是一个JS数组,并附带两个额外的属性index和input。与上面replace对应的exec方法第一次执行的返回结果对照如下:

      1. r.exec(s);
       
      Array[3]
      1. 0: "30n"
      2. 1: "30"
      3. 2: "n"
      4. index: 4
      5. input: "fon230nva09dnfadsf"
      6. length: 3
    11. string的match方法根据g标识来决定如何进行匹配。如果没有g标识,那么调用string.match(regexp)的结果与第一次调用regexp.exec(string)的结果相同。如果regexp带有g标识,那么它返回一个包含所有匹配的字符串的数组。
      1. var s = 'fon230nva09dnfadsf';
      2. var r = /(\d{2})([a-zA-z])/;
      3. s.match(r);
       
      输出结果:Array[3]
      1. 0: "30n"
      2. 1: "30"
      3. 2: "n"
      4. index: 4
      5. input: "fon230nva09dnfadsf"
      6. length: 3
      1. var r = /(\d{2})([a-zA-z])/g;
      2. s.match(r);
      输出结果:Array[2]
      1. 0: "30n"
      2. 1: "09d"
      3. length: 2
    12. string的split(separator,limit)方法把string分割成片段,来创建一个字符串数组。可选参数limit可以限制被分割的片段数量。separator参数可以是一个字符串或一个正则表达式,并且来自分组捕获的文本将会被包含在被分割后的数组中。下面给出一个综合的例子:
      1. var s = 'str1 , str2 , str3';s.split(/\s(,)\s/,4);
      2. //输出结果:["str1",",","str2",","]
    13. string的substring函数的用法和slice一样,但是它不能处理负数参数。ECMAscript中也没有对substr方法进行标准化,所以如果要取一个字符串的子串,就用slice方法吧!
    14. 如果一个正则表达式对象reg带有g标识,则exec方法的查找不是从字符串的起始位置开始,而是从reg.lastIndex开始;遇到不成功的匹配时,才会将其重置为0。^因子也只匹配lastIndex为0的情形,所以某些情况下,可能会需要手动把lastIndex重置到0!
    15. 不要对正则表达式的test方法使用g标识,由于它在底层可能调用exec进行判断,test方法将与正则表达式的lastIndex属性产生不必要的依赖。
    16. 一个未被转义的点号“."将匹配除行结束符以外的任何字符。
    17. 正则表达式中,(?:exp)表示一个非捕获组,它不会干扰捕获型分组的编号。用非捕获组替代不优美的捕获型分组是很好的方法,它减少了性能损失。而(?:exp)?表示一个可选的非捕获分组,因为括号后面的“?”表示重复0或1次,所以该非捕获组是可选的。
      应避免使用/* */注释,因为它可能与正则表达式字面量相冲突。
    18. JS的数组可以用字符串形式的数字下标来访问,因为数组的元素其实是数组对象的属性。delete可以用来从数组中移除元素,但由于一个元素就是一个属性,delete会在数组中遗留一个“空洞”;使用splice方法可能是一个更好的办法。例如要删除arr数组的第3个元素,可以使用这样的语句:arr.splice(2,1);不过对于大型数组来说,这个函数的效率可能不高。
    19. 数组的length属性不可枚举。
    20. 关于括号对作用域的影响,看下面的例子: 
      1. var x=10;
      2. var foo = {
      3. x:20,
      4. bar:function(){
      5. var x = 30;
      6. return this.x;
      7. }
      8. }
      9. var a = (foo.bar)();//括号不影响表达式的值,相当于直接调用foo.bar()
      10. var b = (foo.bar=foo.bar)();//括号表达式返回赋值操作的结果,也就是foo的成员bar函数;而调用的时候已经回到了全局作用域。
      11. var c = (foo.bar,foo.bar)();//与上式相同,都是返回表达式的结果,也就是后面的bar函数,同样相当于在全局作用域调用bar函数。

      因此a、b、c的值分别为20,10,10。

Javascript 你不知道的事,好吧,是我不知道的事的更多相关文章

  1. ES6 你可能不知道的事 – 基础篇

    序 ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学 ...

  2. Java你可能不知道的事(3)HashMap

    概述 HashMap对于做Java的小伙伴来说太熟悉了.估计你们每天都在使用它.它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作为它的key呢?带着 ...

  3. java你可能不知道的事(2)--堆和栈

    在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...

  4. overflow:hidden 你所不知道的事

    overflow:hidden 你所不知道的事 overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. ...

  5. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  6. java你可能不知道的事(2)--堆和栈<转>

    在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...

  7. 关于Javascript你可能不知道的事

    NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...

  8. 关于JavaScript对象,你所不知道的事(二)- 再说属性

    说完了对象那些不常用的冷知识,是时候来看看JavaScript中对象属性有哪些有意思的东西了. 不出你所料,对象属性自然也有其相应的特征属性,但是这个话题有点复杂,让我们先从简单的说起,对象属性的分类 ...

  9. 关于JavaScript对象,你所不知道的事(一)- 先谈对象

    这篇博文的主要目的是为了填坑,很久之前我发表了一篇名为关于JavaScript对象中的一切(一) - 对象属性的文章,想要谈一谈JavaScript对象,可那时只是贴了一张关于这个主题的思维导图,今天 ...

随机推荐

  1. Python学习笔记015——文件file的常规操作(二进制文件)

    有时候诸如图片.音乐等信息不是以文本的形式存储的,而是二进制文件格式存储的. 有时候很多信息不是以文本文件的形式存储的 很多时候,都需要用到二进制读取文件.毕竟很多信息不是以文本的形式存储.例如:图片 ...

  2. PLSQL_数据结构类型的解析(概念)

    2014-06-02 Created By BaoXinjian

  3. C# winform 请求http ( get , post 两种方式 )

    一:.Net中有两个类 HttpWebRequest 和HttpWebResponse 类来实现Http的请求 实现步骤: 1.通过WebRequest类创建一个HttpWebRequest的对象,该 ...

  4. Android studio 使用NDK工具实现JNI编程

    前言: Android开发中常常会使用到第三方的.so库.在使用.so库的时候就要用到JNI编程.JNI是Java Native Interface的缩写.它提供了若干的API实现了Java和其它语言 ...

  5. WinForm开发,窗体显示和窗体传值相关知识总结

    主窗体中代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void b ...

  6. iOS __weak学习碰到的疑问

      __weak弱引用并不持有对象,所以赋值给__weak修饰符的变量也不会改变计数器的值.    main.m id __strong obj3 = nil;     id __weak obj1= ...

  7. WSAAsyncSelect 模型

    WSAAsyncSelect模型是winsock编程模型的一种,它提供了socket异步编程的方便,其实现是基于Windows消息机制的,最主要的就是下面这个函数: int PASCAL FAR WS ...

  8. FreeRTOS 独立看门狗监测任务执行状态

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 通过前面的几个章节,我们基本已经完成了 FreeRTOS 所有功能的讲解,本章节为大家介绍一种使用独立看门狗 ...

  9. bnuoj16491

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=16491 题意:有t组测试数据,每组测试数据第一行为n,m,接下来有n种跑法,m为最大的能力,每一种跑 ...

  10. python学习笔记(22)--漫画生成html最终版

    说明(2017.3.14): 1. 在主文件夹生成一个main.html作为目录 2. 在每个子文件夹生成一个index.html作为看图网页 3. 通过python批量生成html网页,js配合进行 ...