Javascript 你不知道的事
- NaN表示一个不能产生正常结果的运算结果。它不等于任何值,包括它自己。可以用isNaN(number)来检测。
- 同Java中的字符串一样,JS中的字符串是不可变的。也就是说一旦字符串被创建,就无法改变。下标表达式(如s[3],代替s.charAt(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。
- 不同于C/C++、Java等语言,JavaScript的switch语句不光可以使用数字、字符做条件表达式,还可以使用字符串!其实JavaScript中没有字符这个基本类型,单个的字符也是一个字符串。更强大的是,case语句的表达式可以是变量!下面是示例:
- function t(p,v){
- switch (p){
- case 'c':
- alert('char');break;
- case 'string':
- alert('string');break;
- case v:alert('variable:' + p);break;
- default:alert(p);
- }
- }
- t('c');//'char'
- t('string');//'string'
- t(123);//'123'
- t(123,123);//'variable:123'
- 程序随时可以throw出一个异常,throw出来的可以是任意表达式、对象或常量;当然,良好的异常处理系统是需要精心设计一下的。
- switch、while、do、for语句允许有一个前置的标签,配合break或continue语句使用来完成一些跳转。
- JavaScript对象是可变的键控集合(keyed collections),是属性的容器,属性名甚至可以是空字符串"",属性值可以是除undefined之外的任意值。简单类型(number,string,boolean,null,undefined)貌似是对象,因为它们有方法;但它们是不可变的。
- delete用来删除对象的属性,不会触及原型链中的对象;删除失败的时候,该操作返回false。全局的函数和变量定义也是全局对象的属性,因而可以用delete操作删除,而函数内部的变量声明和函数定义则无法删除,例如下列函数执行的结果是弹出“false”。
- function f(){
- var a = 3;
- alert(delete a);
- }
string的fromCharCode方法从一串代表ASCII码的数字中,返回一个字符串,在某些情况下,这个方法可能会很有用。
var a = String.fromCharCode(67,97,116);
// a是'Cat'string的replace() 方法的第一个参数是字符串或者正则表达式。第二个参数如果是字符串,可以指定正则表达式的匹配分组等信息,如$3代表第三个捕获分组。第二个参数可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。
该函数的参数与正则表达式exec方法返回的数组类似:第一个参数是匹配模式的字符串,接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数,再后面的参数是一个整数,声明了匹配在原字符串中出现的位置,最后一个参数是整个字符串。示例是最有力的说明手段:- var s = 'fon230nva09dnfadsf';
- var r = /(\d{2})([a-zA-z])/g;
- var t = s.replace(r,function(){
- /*……*/
- });
相应的第一次替换中,arguments的内容为:
Arguments[5]- 0: "30n"
- 1: "30"
- 2: "n"
- 3: 4
- 4: "fon230nva09dnfadsf"
exec方法的返回结果是一个JS数组,并附带两个额外的属性index和input。与上面replace对应的exec方法第一次执行的返回结果对照如下:
- r.exec(s);
Array[3]- 0: "30n"
- 1: "30"
- 2: "n"
- index: 4
- input: "fon230nva09dnfadsf"
- length: 3
- string的match方法根据g标识来决定如何进行匹配。如果没有g标识,那么调用string.match(regexp)的结果与第一次调用regexp.exec(string)的结果相同。如果regexp带有g标识,那么它返回一个包含所有匹配的字符串的数组。
- var s = 'fon230nva09dnfadsf';
- var r = /(\d{2})([a-zA-z])/;
- s.match(r);
输出结果:Array[3]- 0: "30n"
- 1: "30"
- 2: "n"
- index: 4
- input: "fon230nva09dnfadsf"
- length: 3
- var r = /(\d{2})([a-zA-z])/g;
- s.match(r);
输出结果:Array[2]- 0: "30n"
- 1: "09d"
- length: 2
- string的split(separator,limit)方法把string分割成片段,来创建一个字符串数组。可选参数limit可以限制被分割的片段数量。separator参数可以是一个字符串或一个正则表达式,并且来自分组捕获的文本将会被包含在被分割后的数组中。下面给出一个综合的例子:
- var s = 'str1 , str2 , str3';s.split(/\s(,)\s/,4);
- //输出结果:["str1",",","str2",","]
- string的substring函数的用法和slice一样,但是它不能处理负数参数。ECMAscript中也没有对substr方法进行标准化,所以如果要取一个字符串的子串,就用slice方法吧!
- 如果一个正则表达式对象reg带有g标识,则exec方法的查找不是从字符串的起始位置开始,而是从reg.lastIndex开始;遇到不成功的匹配时,才会将其重置为0。^因子也只匹配lastIndex为0的情形,所以某些情况下,可能会需要手动把lastIndex重置到0!
- 不要对正则表达式的test方法使用g标识,由于它在底层可能调用exec进行判断,test方法将与正则表达式的lastIndex属性产生不必要的依赖。
- 一个未被转义的点号“."将匹配除行结束符以外的任何字符。
- 正则表达式中,(?:exp)表示一个非捕获组,它不会干扰捕获型分组的编号。用非捕获组替代不优美的捕获型分组是很好的方法,它减少了性能损失。而(?:exp)?表示一个可选的非捕获分组,因为括号后面的“?”表示重复0或1次,所以该非捕获组是可选的。
应避免使用/* */注释,因为它可能与正则表达式字面量相冲突。 - JS的数组可以用字符串形式的数字下标来访问,因为数组的元素其实是数组对象的属性。delete可以用来从数组中移除元素,但由于一个元素就是一个属性,delete会在数组中遗留一个“空洞”;使用splice方法可能是一个更好的办法。例如要删除arr数组的第3个元素,可以使用这样的语句:arr.splice(2,1);不过对于大型数组来说,这个函数的效率可能不高。
- 数组的length属性不可枚举。
- 关于括号对作用域的影响,看下面的例子:
- var x=10;
- var foo = {
- x:20,
- bar:function(){
- var x = 30;
- return this.x;
- }
- }
- var a = (foo.bar)();//括号不影响表达式的值,相当于直接调用foo.bar()
- var b = (foo.bar=foo.bar)();//括号表达式返回赋值操作的结果,也就是foo的成员bar函数;而调用的时候已经回到了全局作用域。
- var c = (foo.bar,foo.bar)();//与上式相同,都是返回表达式的结果,也就是后面的bar函数,同样相当于在全局作用域调用bar函数。
因此a、b、c的值分别为20,10,10。
Javascript 你不知道的事的更多相关文章
- JavaScript 你不知道的事 -- 关于函数
接上篇Javascript 你不知道的事,直接条列了: 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__ ...
- Javascript 你不知道的事,好吧,是我不知道的事
NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...
- setTimeout,setInterval你不知道的事
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- javascript线程解释(setTimeout,setInterval你不知道的事)---转载
在工作中,可能我们经常遇到在有很多 setInterval 的页面, 再手动触发 setTimeout 的时候经常失败, 尤其是 jquery做动画的时候,一些渐入溅出的东西,很多东西都不被触发……, ...
- javascript线程解释(setTimeout,setInterval你不知道的事)
john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...
- Javascript你不知道的那些事!(数字计算篇-变态篇)无意中聊天发现的一些奇怪的事情
javascript:alert(0.1 + 0.2) 如果看到这样一道题你会怎么思考了!大家肯定第一反应0.3,但是考虑到我已经这样问了!那么幼稚的答案我会专门写篇文章吗 然后人就开始折磨自己了会不 ...
- Javascript中那些你不知道的事之-- false、0、null、undefined和空字符串
话不多说直接进入主题:(如果有写的不对的地方欢迎指正) 我们先来看看他们的类型分别是什么: typeof类型检测结果 结论:false是布尔类型对象,0是数字类型对象,null是object对象,un ...
- javascript你不知道的This
<你不知道的javascript>这本书读了有好几遍了,似乎每一次读都有新发现,有些内容并不是一下子可以弄懂的,每次读似乎都能明白一些概念.再重读一下this关键字.这个概念非常灵活,也非 ...
- Cufon在渲染网页字体你不知道的事
清单 1. 无效的 font-family 字体指定 <style> .introduction { font-family:'Baroque Script';} </style&g ...
随机推荐
- linux中Oops信息的调试及栈回溯
Oops 信息来源及格式 Oops 这个单词含义为“惊讶” ,当内核出错时(比如访问非法地址)打印出来的信息被 称为 Oops 信息. Oops 信息包含以下几部分内容. 1 一段文本描述信息. 比如 ...
- vue常用属性解释。
props:详看 示例-网格组件. props 可以是数组或对象,用于接收来自父组件的数据.props 可以是简单的数组,或者使用对象作为替代,对象允许配置高级选项,如类型检测.自定义校验和设置默认值 ...
- edge中断分析
眼下正在调试msix中断,在測试过程中发现会概率性的丢失中断.Msix中断默认是edge触发的中断,edge触发的中断是在中断相应pin发生电平信号跳变的时候,会发出一个中断请求. 由于跳变是一瞬间的 ...
- VMware 9.0.1安装Mac OS X Mountain Lion 10.8.2
原地址:http://zengwu3915.blog.163.com/blog/static/278348972013117114742496/ 所需软件1.VMware Workstation Bu ...
- 如何连接oracle,mysql, SQL Server数据库(Java版)
先添加上连接oracle,MySQL的驱动路径和数据库连接URL: MySQL: final String DBDRIVER = "org.gjt.mm.mysql.Driver" ...
- Cookie的介绍
Cookie是某些站点为了辨别用户身份而存在用户本地终端上的数据.Cookie总是保存在client中,可分为内存 Cookie和硬盘Cookie,而依照时间划分.又能够分为非持久Cookie和持久C ...
- RDS for MySQL 如何使用 Percona Toolkit
Percona Toolkit 包含多种用于 MySQL 数据库管理的工具. 下面介绍常用的 pt-online-schema-change 和 pt-archiver 搭配 RDS MySQL ...
- proc文件系统分析
来源: ChinaUnix博客 日期: 2008.01.03 11:46 (共有条评论) 我要评论 二 proc文件系统分析 根据前面的分析,我们可以基本确定对proc文件系统的分析步骤.我将按 ...
- C# 编写Windows服务在VS中调试的步骤
1.以管理员身份运行cmd 2.安装windows服务 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319(InstallUtil.exe的路径,注意In ...
- spine 所有动画的第一帧必须把所有能K的都K上
spine 所有动画的第一帧必须把所有能K的都K上.否则在快速切换动画时会出问题.