JavaScript

JavaScript实验:逻辑判断符&&、||与!

与C、Java等语言一样,JavaScript中可以用&&、||、!三个逻辑判断符来对boolean值进行逻辑判断。与C、Java不同的是,JavaScript中逻辑与(&&)和逻辑或(||)操作符可以应用在任何值上,而操作结束后返回的也不一定是boolean值。 逻辑与&&的处理规则 JavaScript中&&的处理规则是这样的: 判断第一个值是否为Falsy。如果为Falsy,则直接返回第一个值(不一定为boolean类型)。 如果第一个值为Truthy,则直接返回第二个值(不一定为boolean类型)。 var o = {x:1,

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:eval()

在JavaScript中,可以使用eval()函数来解析字符串中的JavaScript代码,并返回相应的代码执行结果: console.log(eval("42 * 2"));//84 就本质而言,eval()是JavaScript全局对象的一个函数。比如,上述代码等价于: console.log(this.eval("42 * 2"));//84 不过在使用eval()语句时,一般都采用上述第一种做法,也即忽略全局对象直接使用eval()。 eval()的使用 基于以下两个原因,

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:object转换成number或string

在JavaScript程序编写过程中,根据不同的上下文,JS会自动将object转换成number或者string后再处理。这种自动转换的规则如下: object自动转换成string的规则: 如果object所属类覆写了toString()方法,则调用该方法。如果toString()调用的返回结果为Primitive(string、number、boolean、undefined、null),则将该Primitive值转换成string后返回。 如果object所属类没有覆写toString()方法 – toString()调用的返回结果为”[object Object]“;或者覆写了toString()方法但该方法返回结果为对象。那么JS将调用object的valueOf()方法,如果valueOf()调用的返回结果为Primitive(string、number、boolean、undefined、null)

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:变量定义与储存

与C、Java等编程语言不同,JavaScript中的变量是无类型的,所有的变量定义使用的关键词均为var: var a; var m, n; var x=42, y="test"; 如果定义变量后未对该变量进行赋值,那么该变量的值为undefined。如上面代码中的a、m、n三个变量的值均为undefined。 由于JS中变量是无类型的,因此完全可以对同一个变量进行不同类型的赋值,如: var b = "temp"; console.log(typeof b)

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:值类型转换

在JavaScript中进行+、-、*、/、==、!=等运算时,如果操作符左右两边的值类型与预期类型不一致,JavaScript会将操作符两边的值转换成预期的类型后再进行操作。预期值类型为string时,JavaScript会将值转换为string;预期值类型为number时,JavaScript会将值转换为number (如果无法转换为数值,则返回NaN)比如: console.log(10 + " cats");//10 cats console.log(10 * " cats");//NaN, " cats" will be converted

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:number转换成string

在JavaScript的值类型转换中,最常发生的就是string与number这两种类型值之间的相互转换。 可以通过调用number值的4个函数(事实上,是JS将number值自动转化为Number对象后,Number类的4个函数)来将其转换成string: toString()。 toFixed()。 toExponential()。 toPrecision()。 toString() 可以在number值上调用toString()方法来将其转换成字符串。toString()函数接受一个2到36之间的正整数作为参数,其作用为定义数值的进制数;如果该参数缺失,那么toString()函数就以10进制来表示相应的数值。 var a = 42; console.log(a.toString(2));//101010 console.log(a.toString(

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:string转换成number

JavaScript中,可以通过以下3种方法来将string值转换成number: 调用Number()来对string进行值类型转换。 parseInt()。 parseFloat()。 Number() 使用Number()函数来对string进行强制类型转换是最直接的做法。不过,这种做法有一个局限性:如果字符串截去开头和结尾的空白字符后,不是纯数字字符串,那么最终返回结果为NaN。David Flanagan的JavaScript – The Definitive Guide 6th edition, 3.8.2节提到,用Number()函数来进行string-to-number转换时,函数只接受10进制字符串,但测试结果表明事实并非如此,Number()函数可以接受”0xff”作为参数并将其转换成数值255。 var

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:object转换函数toString()与valueOf()

JavaScript中,object转换为boolean的操作非常简单:所有的object转换成boolean后均为true;即使是new Boolean(false)这样的object在转换为boolean后仍然为true。 var x = new Boolean(false); if(x){ console.log("x is true"); } 在将object转换为string或者number时,JavaScript会调用object的两个转换函数:toString()与valueOf()。 toString() toString()函数的作用是返回object的字符串表示,JavaScript中object默认的toString()方法返回字符串”[object Object]“。定义类时可以实现新的toString(

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:浮点数计算

与所有其它现代编程语言一样,JavaScript是用二进制来表示浮点数的,因此其所能精确表示的数仅止于以2的指数为分母的分数(比如1/2, 3/4以及1/1024等等)。对于其它的浮点数,JavaScript只能用二进制来模拟并以极度接近的值来替代。比如,0.3-0.2的结果就并不是精确的0.1,而是一个极度接近0.1的小数。 由于结果足够接近,因此上述这一局限性在处理普通的十进制运算时问题并不大;唯一会出现问题的场景在于,当将这种不精确的计算结果用于比较时: var x = 0.8-0.7; var y = 0.3-0.2; console.log(

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:Truthy和Falsy

与大多数编程语言一样,JavaScript中存在boolean类型,以供逻辑判断使用。不过,和很多其它编程语言不一样的是,JavaScript中存在Truthy值和Falsy值的概念 — 除了boolean值true、false外,所有类型的JavaScript值均可用于逻辑判断,其规则如下: 所有的Falsy值,当进行逻辑判断时均为false。Falsy值包括:false、undefined、null、正负0、NaN、""。 其余所有的值均为Truthy,当进行逻辑判断时均为true。值得注意的是,Infinity、空数组、”0″都是Truthy值。 实验 var x = "0"

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:null和undefined

JavaScript中存在2个代表信息不存在的特殊值:null和undefined。个人认为可以从以下角度来理解这两个特殊值之间的区别: null代表有存储信息的容器(比如之前被赋过值的变量),但该容器中的内容为空。 undefined代表不存在用于存储信息的容器。 JavaScript中的null与其它多数编程语言中的null没有什么区别,基本用于表示信息值为空;而在JavaScript中下述情况下表达式返回结果为undefined: 从未被赋过值的变量。 访问某个对象不存在的属性值。 访问数组中不存在的成员。 调用没有return语句的函数。 调用return语句为空(“return ;”)的函数。 事实上,和Infinity、NaN一样,undefined在JavaScript中是一个全局变量,在ECMAScript 3中甚至可以被赋予其它值。ECMAScript 5纠正了这个错误,并将undefined变量设定为只读。 对于null和undefined之间的比较,可以使用===全等操作符。如果使用普通的==操作符,null与undefined是等价的: console.

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:全局对象

对于任何JavaScript程序,当程序开始运行时,JavaScript解释器都会初始化一个全局对象以供程序使用。这个JavaScript自身提供的全局对象的功能包括: 全局对象拥有一些常用的属性值。比如undefined、Infinity以及NaN。 全局对象拥有一些常用的属性对象。比如Math、JSON和Number对象均为该全局对象的属性。 全局对象提供一些全局函数供调用。比如isNaN()、isFinite()、parseInt()和eval()等。 全局对象提供一些全局构造器(constructor),也即全局类。比如Date()、RegExp()、String()、Object()和Array()等。 除了JS全局对象,对于运行在浏览器端的JavaScript程序,还有另一个全局对象:window。window全局对象提供了与当前窗口、页面有关的诸多属性与方法。除了这些与浏览器有关的全局属性和方法,window对象还封装了JS全局对象,

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:Primitive对象封装

JavaScript中,string、number、boolean均为primitive基本类型,也即字符串、数值、布尔值并不是以对象的形式而存在的。不过,由于需要对这三种primitive类型值进行操作,因此JavaScript会自动封装这三种类型的值,使其作为对象而拥有属性与方法。以string为例,这种封装过程如下: 当JavaScript遇到对string值进行属性访问或者方法调用时,会调用new String(字符串值)自动将该string封装成一个String对象。 JavaScript会访问这个新创建的对象的属性或者方法,并返回相应的结果。 属性访问或者方法调用结束后,JavaScript将立即销毁这个新创建的对象。 以下面的代码为例,对JavaScript自动创建的String对象进行属性写入操作没有任何意义,因为这个创建出来的对象在写入语句结束后就不复存在了: var s = "test"; s.length = 9;

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:数学运算

JavaScript中,数学运算可藉由两种操作来实现: +、-、*、/、%等操作符。 使用Math对象的计算函数。比如,用Math.pow(2,3)来计算2的3次方。 与Java不同,JavaScript中的数学运算不会抛出任何错误。计算结果的溢出、除以0、对负数进行开方这些操作都是合法的,其结果为JavaScript中的特殊值:正负Infinity(无限)、正负0、NaN(非数): 正负Infinity。当计算结果比JavaScript所能表示的最大数(Number.MAX_VALUE)还要大时,结果为正Infinity;当计算结果比JavaScript所能表示的最小数(-Number.MAX_VALUE)

  • Chuan Shao
    Chuan Shao
4 min read
JavaScript

JavaScript实验:数值表示

JavaScript中所有的数都是浮点数,对于这些数,可以用10进制来表示,也可以用16进制来表示。在JavaScript中,所有以0x或者0X开头的数都是16进制数。比如,0xff就是一个16进制数,表示10进制数中的255。 有些JavaScript解释器支持8进制的数值表示:所有以0开头(但不以0x或0X开头)的数都是8进制数。比如017就是一个8进制数,表示10进制下的15。由于浏览器兼容性问题,在JavaScript程序编写过程中不应该使用这种8进制数值表示。事实上,在ECMAScript标准中,严格模式下(strict mode),8进制数值表示是被禁止的。 除了普通的数值表示,JavaScript还支持科学计数法;表示规则为: [digits][.digits][(E|e)[(+|-)]digits] 实验

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:语句结束处的分号

在JavaScript语法中,每行语句结束处的分号不是必需的,因此完全可以写出不使用任何分号的JavaScript程序。当某行语句结束而又没有出现分号时,JavaScript引擎会自动插入分号。比如以下代码: var a var b var c 该代码等价于: var a; var b; var c; JavaScript对于一行语句是否已经结束的判定条件为:尝试将下一行的代码与本行代码相连,如果相连后的语句合法,那么本行代码未结束;否则,本行代码判定为结束。以上面的代码为例,由于var a var并不合法,因此第一行代码var a的结尾处会被插入一个分号。与之相反的例子为: var

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:值类型

计算机程序的实质很大程度上可以说是机器对各种信息(值)的操作与读写。在JavaScript中,存在多种类型的值,这些值分成两大类:Primitive(基本类型)和Object(对象)。 Primitive JavaScript中Primitive有5种类型: Number。所有的数字,无论是整数还是小数,均为Number类型。 String。字符串类型。 Boolean。布尔类型,true或者false。 null。此类型只有null一个值。 undefined。此类型只有undefined一个值。 Object 除了Primitive,JavaScript中其它任何值均为Object(对象)。Object有以下几种: JSON键值对对象。如{“name”

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:数值范围

JavaScript中所有的数字,无论是整数还是小数,其类型均为Number。在程序内部,Number类型的实质是一个64位的浮点数,这与Java中double类型的浮点数是一致的;因此,JavaScript中所有的数都是浮点数。遵循IEEE 754标准(浮点数算术标准),JavaScript所能表示的数值范围为正负1.7976931348623157乘以10的308次方,其最小所能表示的小数为正负5乘以10的负324次方,这两个边界值可以分别通过访问Number对象的MAX_VALUE属性和MIN_VALUE属性来获取。 对于整数,根据ECMAScript标准的要求,JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。值得注意的是,对于整数的位运算(比如移位等操作),JavaScript仅支持32位整型数,也即从-2147483648到+2147483647之间的整数。 实验

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:Unicode字符串长度

根据ECMAScript标准的要求,JavaScript对Unicode字符提供了支持。因此,以下JavaScript语句是合法的: //saved in test.js file with UTF-8 encoding. var name = "测试"; alert(name.length); 如果在运行JavaScript程序时所用的编码为Unicode(比如UTF-8)且与字符串的编码格式一致,那么当对含有Unicode字符的字符串取长度时,每一个Unicode字符的长度为1;在上面的例子中,name.length所返回的结果为2。如果运行JavaScript程序时所使用的编码不是Unicode(比如ISO-8859-1),或者运行时所采用的Unicode编码与字符串编码格式不一致,那么每个Unicode字符的长度可能会大于1;在上面的例子中,

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:console.profile()

编写JavaScript程序时,如果需要知道某段代码的执行时间,可以使用console.time()。不过,在分析逻辑较为复杂的JavaScript程序,试图从中找出性能瓶颈的时候,console.time()就不适用了 — 深入分析逻辑较为复杂的JavaScript程序的运行就意味着插入大量的console.time()语句,而这无疑是不可接受的。对于复杂逻辑的JavaScript程序调优,正确的方法是使用console.profile()。 浏览器支持 安装了Firebug插件的Firefox、Google Chrome以及Safari都支持console.profile()语句,最新版的IE和Opera也提供了Profile功能。在几大浏览器上console.profile()的使用大同小异,本文仅介绍Firebug中console.profile()的使用情况。值得注意的一点是:如果使用Firebug控制台来直接编写JavaScript实验代码,那么console.

  • Chuan Shao
    Chuan Shao
4 min read

Subscribe to Chuan's blog