1、如果一个对象创建表达式不需要传入任何参数给话,那么这对空圆括号是可以省略掉的:
new Object() => new Object
new Date() => new Date
2、左值(lvalue)是指“表达式只能出现在赋值运算符的左侧”。在JavaScript中,变量、对象属性和数组元素均是左值。ECMAScript规范允许内置函数返回一个左值,但自定义的函数则不能返回左值。
3、加法操作符的行为表现为:
l 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值:日期对象通过toString()方法执行转换,其他对象则通过valueOf()方法执行转换(如果valueOf()方法返回一个原始值的话)。由于多数对象都不具备可用的valueOf()方法,因此它们会通过toString()方法来执行转换。
l 在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。
l 否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。
4、一元加法(+)运算符把操作数转换为数字(或者NaN),并返回这个转换后的数字。
5、表达式++x并不总和x=x+1完全一样,”++”运算符从不进行字符串连接操作,它总是会将操作数转换为数字并增1.如果x是字符串”1”,++x的结果就是数字2,而x+1是字符串”11”。
6、位运算符要求它的操作数是整数,这些整数表示为32位整型而不是64位浮点型。必要时,位运算符首先将操作数转换为数字,并将数字强制表示为32位整型,这会忽略原格式中的小数部分和任何超过32位的二进制位。移位运算符要求右操作数在0~31之间。在将其操作数转换为无符号32位整数后,它们将舍弃第5位之后的二进制位,以便生成一个位数正确的数字。需要注意的是,位运算符会将NaN、Infinity和-Infinity都转换为0。
7、JavaScript严格相等(恒等===)判断实现步骤:
8、JavaScript相等(==)判断实现步骤:
9、比较运算符的操作数可能是任意类型。然后只有数字和字符串才能真正执行比较操作。因此那些不是数字和字符串的操作数都将进行类型转换,规则如下:
- 如果操作数为对象,那么这个对象将依照3.8.3结尾处所描述的转换规则转换为原始值:如果valueOf()返回一个原始值,那么直接使用这个原始值。否则,使用toString()的转换结果进行比较曹祖。
- 在对象转换为原始值之后,如果两个操作数都是字符串,那么将依照字母表的顺序对两个字符串进行比较,这里提到的“字母表顺序”是指组成这个字符串的16位Unicode字符的索引顺序。
- 在对象转换为原始值之后,如果至少有一个操作数不是字符串,那么两个操作数都将转换为数字进行数值比较。0和-0是相等的。Infinity比其他任何数字都大(除了Infinity本身),-Infinity比其他任何数字都小(除了它自身)。如果其中一个操作数是(或转换后是)NaN,那么比较操作符总是返回false。
10、可以通过使用两次逻辑非运算来得到一个值的等价布尔值:!!x。
11、ECMAScript 3标准规定了任何解释器都不允许对eval()赋予别名。如果eval()函数通过别名调用的话,则会抛出一个EvalError异常。 ECMASCript 5是反对使用EvalError的,并且规范了eval()的行为。当直接使用非限定的“eval”名称来调用eval()函数时,通常称为“直接eval”(direct eval)。直接调用eval()时,它总是在调用它的上下文作用域内执行。其他的间接调用则使用全局对象作为其上下文作用域,并且无法读、写、定义局部变量和函数。
12、ECMAScript 5严格模式对eval()函数的行为施加了更多的限制,甚至对标识符eval的使用也施加了限制。当在严格模式下调用eval()时,或者eval()执行的代码段以“user strict”指令开始,这里的eval()是私有上下文环境中的局部eval。也就是说,在严格模式下,eval执行的代码段可以查询或更改局部变量,但不能在局部作用域中定义新的变量或函数。此外,严格模式将“eval”列为保留字,这让eval()更像一个运算符。不能用一个别名覆盖eval()函数。并且变量名、函数名、函数参数或者异常捕获的参数都不能取名为“eval”。
13、任意值在typeof运算后的返回值:
X | typeof x |
undefined | “undefined” |
null | “object” |
true或false | “boolean” |
任意数字或NaN | “number” |
任意字符串 | “string” |
任意函数 | “function” |
任意内置对象(非函数) | “object” |
任意宿主对象 | 由编译器各自是实现的字符串,但不是”undefined”、”boolean”、”number”或”string” |
14、ECMAScript 3规范,对于所有内置可执行对象,typeof运算符一律返回”function”。ECMAScript 5规范则扩充至所有可执行对象,包括内置对象(native object)和宿主对象(host object),所有可执行对象进行typeof运算都将返回”function”。